From f3be2a01af060832c4a531db4727f4129bb1f420 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Mon, 29 Aug 2022 12:40:49 -0700 Subject: [PATCH 01/29] Create new _io submodule and move load_icgem_gdf function --- harmonica/__init__.py | 2 +- harmonica/_io/__init__.py | 10 ++++++++++ harmonica/{io.py => _io/icgem_gdf.py} | 3 +-- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 harmonica/_io/__init__.py rename harmonica/{io.py => _io/icgem_gdf.py} (98%) diff --git a/harmonica/__init__.py b/harmonica/__init__.py index 7c2d4eb04..f4754107e 100644 --- a/harmonica/__init__.py +++ b/harmonica/__init__.py @@ -7,6 +7,7 @@ # # Import functions/classes to make the public API from . import datasets, synthetic +from ._io.icgem_gdf import load_icgem_gdf from ._version import __version__ from .equivalent_sources.cartesian import EQLHarmonic, EquivalentSources from .equivalent_sources.gradient_boosted import EquivalentSourcesGB @@ -16,7 +17,6 @@ from .forward.prism_layer import DatasetAccessorPrismLayer, prism_layer from .forward.tesseroid import tesseroid_gravity from .gravity_corrections import bouguer_correction -from .io import load_icgem_gdf from .isostasy import isostasy_airy, isostatic_moho_airy from .transformations import derivative_upward diff --git a/harmonica/_io/__init__.py b/harmonica/_io/__init__.py new file mode 100644 index 000000000..1563db0a3 --- /dev/null +++ b/harmonica/_io/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2018 The Harmonica Developers. +# Distributed under the terms of the BSD 3-Clause License. +# SPDX-License-Identifier: BSD-3-Clause +# +# This code is part of the Fatiando a Terra project (https://www.fatiando.org) +# +""" +Functions for interacting with standarized data files that contain gravity or +magnetic geophysical data. +""" diff --git a/harmonica/io.py b/harmonica/_io/icgem_gdf.py similarity index 98% rename from harmonica/io.py rename to harmonica/_io/icgem_gdf.py index 399d96e68..e9de99ffb 100644 --- a/harmonica/io.py +++ b/harmonica/_io/icgem_gdf.py @@ -5,8 +5,7 @@ # This code is part of the Fatiando a Terra project (https://www.fatiando.org) # """ -Functions for interacting with standarized data files that contain gravity or -magnetic geophysical data. +Function to read ICGEM .gdf file """ import contextlib From 35403cd9a6542a5c5059b02d475831956977e5ba Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Mon, 29 Aug 2022 12:50:32 -0700 Subject: [PATCH 02/29] Add load_oasis_montaj_grid function Add new function that reads Geosoft grids. --- doc/api/index.rst | 1 + harmonica/__init__.py | 1 + harmonica/_io/oasis_montaj_grd.py | 307 ++++++++++++++++++++++++++++++ 3 files changed, 309 insertions(+) create mode 100644 harmonica/_io/oasis_montaj_grd.py diff --git a/doc/api/index.rst b/doc/api/index.rst index 7c78dd218..81e536371 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -84,6 +84,7 @@ Input and Output :toctree: generated/ load_icgem_gdf + load_oasis_montaj_grid Visualization ------------- diff --git a/harmonica/__init__.py b/harmonica/__init__.py index f4754107e..17c82776c 100644 --- a/harmonica/__init__.py +++ b/harmonica/__init__.py @@ -8,6 +8,7 @@ # Import functions/classes to make the public API from . import datasets, synthetic from ._io.icgem_gdf import load_icgem_gdf +from ._io.oasis_montaj_grd import load_oasis_montaj_grid from ._version import __version__ from .equivalent_sources.cartesian import EQLHarmonic, EquivalentSources from .equivalent_sources.gradient_boosted import EquivalentSourcesGB diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py new file mode 100644 index 000000000..4ab3a645c --- /dev/null +++ b/harmonica/_io/oasis_montaj_grd.py @@ -0,0 +1,307 @@ +# Copyright (c) 2018 The Harmonica Developers. +# Distributed under the terms of the BSD 3-Clause License. +# SPDX-License-Identifier: BSD-3-Clause +# +# This code is part of the Fatiando a Terra project (https://www.fatiando.org) +# +""" +Function to read Oasis Montaj© .gdf file +""" + +import array + +import numpy as np +import xarray as xr + + +def load_oasis_montaj_grid(fname): + """ + Reads gridded data from an Oasis Montaj© .grd file. + + The version 2 of the Geosoft© Grid File Format (GRD) stores gridded + products in binary data. + + .. warning:: + + This function has not been tested against a wide range of GRD files. + This could lead to incorrect readings of the stored data. Please report + any unwanted behaviour by opening an issue in Harmonica: + https://github.com/fatiando/harmonica/issues + + .. important:: + + This function only supports reading GRD files using the **version 2** + of the Geosoft© Grid File Format. + + .. important:: + + This function is not supporting compressed GRD files, rotated grids, + orderings different than ±1, or colour grids. + + Parameters + ---------- + fname : (string or file-like object) + Path to the .grd file. + + Returns + ------- + grid : :class:`xarray.DataArray` + :class:`xarray.DataArray` containing the grid, its coordinates and + header information. + + References + ---------- + https://help.seequent.com/Oasis-montaj/9.9/en/Content/ss/glossary/grid_file_format__grd.htm + """ + # Read the header and the grid array + with open(fname, "rb") as grd_file: + # Read the header (first 512 bytes) + header = _read_header(grd_file.read(512)) + # Check for valid ordering + _check_ordering(header["ordering"]) + # Check for valid rotation + _check_rotation(header["rotation"]) + # Get data type for the grid elements + data_type = _get_data_type(header["n_bytes_per_element"], header["sign_flag"]) + # Read grid + grid = array.array(data_type, grd_file.read()) + # Convert to numpy array + grid = np.array(grid) + # Remove dummy values + grid = _remove_dummies(grid, data_type) + # Scale the grid + grid = np.array(grid / header["data_factor"] + header["base_value"]) + # Reshape the grid based on the ordering + if header["ordering"] == 1: + order = "C" + shape = (header["shape_v"], header["shape_e"]) + spacing = (header["spacing_v"], header["spacing_e"]) + elif header["ordering"] == -1: + order = "F" + shape = (header["shape_e"], header["shape_v"]) + spacing = (header["spacing_e"], header["spacing_v"]) + grid = grid.reshape(shape, order=order) + # Build coords + easting, northing = _build_coordinates( + header["x_origin"], header["y_origin"], shape, spacing + ) + # Build an xarray.DataArray for the grid + dims = ("northing", "easting") + coords = {"easting": easting, "northing": northing} + grid = xr.DataArray( + grid, + coords=coords, + dims=dims, + attrs=header, + ) + return grid + + +def _read_header(header_bytes): + """ + Read GRD file header + + Parameters + ---------- + header_bytes : byte + A sequence of 512 bytes containing the header of a + GRD file. + + Returns + ------- + header : dict + Dictionary containing the information present in the + header. + + Notes + ----- + The GRD header consists in 512 contiguous bytes. + It's divided in four sections: + + * Data Storage + * Geographic Information + * Data (Z) Scaling + * Undefined Application Parameters + + """ + header = {} + # Read data storage + ES, SF, NE, NV, KX = array.array("i", header_bytes[0 : 16 + 4]) # noqa: E203, N806 + header.update( + { + "n_bytes_per_element": ES, + "sign_flag": SF, + "shape_e": NE, + "shape_v": NV, + "ordering": KX, + } + ) + # Read geographic info + DE, DV, X0, Y0, ROT = array.array( # noqa: N806 + "d", header_bytes[20 : 52 + 8] # noqa: E203 + ) + header.update( + { + "spacing_e": DE, + "spacing_v": DV, + "x_origin": X0, + "y_origin": Y0, + "rotation": ROT, + } + ) + # Read data scaling + ZBASE, ZMULT = array.array("d", header_bytes[60 : 68 + 8]) # noqa: E203, N806 + header.update( + { + "base_value": ZBASE, + "data_factor": ZMULT, + } + ) + # Read optional parameters + LABEL = array.array("u", header_bytes[76 : 76 + 48]) # noqa: E203, N806 + MAPNO = array.array("u", header_bytes[124 : 124 + 16]) # noqa: E203, N806 + PROJ, UNITX, UNITY, UNITZ, NVPTS = array.array( # noqa: N806 + "i", header_bytes[140 : 156 + 4] # noqa: E203 + ) + IZMIN, IZMAX, IZMED, IZMEA = array.array( # noqa: N806 + "f", header_bytes[160 : 172 + 4] # noqa: E203 + ) + (ZVAR,) = array.array("d", header_bytes[176 : 176 + 8]) # noqa: E203, N806 + (PRCS,) = array.array("i", header_bytes[184 : 184 + 4]) # noqa: E203, N806 + header.update( + { + "grid_label": LABEL, + "map_number": MAPNO, + "map_projection": PROJ, + "units_x": UNITX, + "units_y": UNITY, + "units_z": UNITZ, + "n_valid_points": NVPTS, + "grid_min": IZMIN, + "grid_max": IZMAX, + "grid_median": IZMED, + "grid_mean": IZMEA, + "grid_variance": ZVAR, + "process_flag": PRCS, + } + ) + return header + + +def _check_ordering(ordering): + """ + Check if the ordering value is the one we are supporting + """ + if ordering not in (-1, 1): + raise NotImplementedError( + f"Found an ordering (a.k.a as KX) equal to '{ordering}'. " + + "Only orderings equal to 1 and -1 are supported." + ) + + +def _check_rotation(rotation): + """ + Check if the rotation value is the one we are supporting + """ + if rotation != 0: + raise NotImplementedError( + f"The grid is rotated '{rotation}' degrees. " + + "Only unrotated grids are supported." + ) + + +def _get_data_type(n_bytes_per_element, sign_flag): + """ + Return the data type for the grid values + + References + ---------- + https://docs.python.org/3/library/array.html + """ + # Run some checks + if n_bytes_per_element not in (1, 2, 4, 8): + raise NotImplementedError( + "Found a 'Grid data element size' (a.k.a. 'ES') value " + + f"of '{n_bytes_per_element}'. " + "Compressed .grd files are not currently supported." + ) + if sign_flag == 3: + raise NotImplementedError( + "Reading .grd files with colour grids is not currenty supported." + ) + # Determine the data type of the grid elements + if n_bytes_per_element == 1: + if sign_flag == 0: + data_type = "B" # unsigned char + elif sign_flag == 1: + data_type = "b" # signed char + elif n_bytes_per_element == 2: + if sign_flag == 0: + data_type = "H" # unsigned short + elif sign_flag == 1: + data_type = "h" # signed short + elif n_bytes_per_element == 4: + if sign_flag == 0: + data_type = "I" # unsigned int + elif sign_flag == 1: + data_type = "i" # signed int + elif sign_flag == 2: + data_type = "f" # float + elif n_bytes_per_element == 8: + data_type = "d" + return data_type + + +def _remove_dummies(grid, data_type): + """ + Replace dummy values for NaNs + """ + # Create dictionary with dummy value for each data type + dummies = { + "b": -127, + "B": 255, + "h": -32767, + "H": 65535, + "i": -2147483647, + "I": 4294967295, + "f": -1e32, + "d": -1e32, + } + if data_type in ("f", "d"): + grid[grid <= dummies[data_type]] = np.nan + return grid + grid[grid == dummies[data_type]] = np.nan + return grid + + +def _build_coordinates(west, south, shape, spacing): + """ + Create the coordinates for the grid + + Generates 1d arrays for the easting and northing coordinates of the grid. + Assumes unrotated grids. + + Parameters + ---------- + west : float + Westernmost coordinate of the grid. + south : float + Southernmost coordinate of the grid. + shape : tuple + Tuple of ints containing the number of elements along each direction in + the following order: ``n_northing``, ``n_easting`` + spacing : tuple + Tuple of floats containing the distance between adjacent grid elements + along each direction in the following order: ``s_northing``, + ``s_easting``. + + Returns + ------- + easting : 1d-array + Array containing the values of the easting coordinates of the grid. + northing : 1d-array + Array containing the values of the northing coordinates of the grid. + """ + easting = np.linspace(west, west + spacing[1] * (shape[1] - 1), shape[1]) + northing = np.linspace(south, south + spacing[0] * (shape[0] - 1), shape[0]) + return easting, northing From 9db9ac2a876c5843a77abc21b6845e37567c680c Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Mon, 29 Aug 2022 12:57:30 -0700 Subject: [PATCH 03/29] Improve function docstring --- harmonica/_io/oasis_montaj_grd.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 4ab3a645c..7c8378039 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -19,7 +19,9 @@ def load_oasis_montaj_grid(fname): Reads gridded data from an Oasis Montaj© .grd file. The version 2 of the Geosoft© Grid File Format (GRD) stores gridded - products in binary data. + products in binary data. This function can read those files and parse the + information in the header. It returns the data in + a :class:`xarray.DataArray` for convenience. .. warning:: From 412d7227d3fbd6cddba92cb5033564ba4cbcf9bc Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Mon, 29 Aug 2022 13:01:47 -0700 Subject: [PATCH 04/29] Move every not implemented check to their own function --- harmonica/_io/oasis_montaj_grd.py | 38 ++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 7c8378039..3a7b507f2 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -59,10 +59,11 @@ def load_oasis_montaj_grid(fname): with open(fname, "rb") as grd_file: # Read the header (first 512 bytes) header = _read_header(grd_file.read(512)) - # Check for valid ordering + # Check for valid flags _check_ordering(header["ordering"]) - # Check for valid rotation _check_rotation(header["rotation"]) + _check_sign_flag(header["sign_flag"]) + _check_n_bytes_per_element(header["n_bytes_per_element"]) # Get data type for the grid elements data_type = _get_data_type(header["n_bytes_per_element"], header["sign_flag"]) # Read grid @@ -192,7 +193,7 @@ def _read_header(header_bytes): def _check_ordering(ordering): """ - Check if the ordering value is the one we are supporting + Check if the ordering value is within the ones we are supporting """ if ordering not in (-1, 1): raise NotImplementedError( @@ -212,25 +213,36 @@ def _check_rotation(rotation): ) -def _get_data_type(n_bytes_per_element, sign_flag): +def _check_sign_flag(sign_flag): """ - Return the data type for the grid values + Check if sign_flag value is within the ones we are supporting + """ + if sign_flag == 3: + raise NotImplementedError( + "Reading .grd files with colour grids is not currenty supported." + ) - References - ---------- - https://docs.python.org/3/library/array.html + +def _check_n_bytes_per_element(n_bytes_per_element): + """ + Check if n_bytes_per_element value is within the ones we are supporting """ - # Run some checks if n_bytes_per_element not in (1, 2, 4, 8): raise NotImplementedError( "Found a 'Grid data element size' (a.k.a. 'ES') value " + f"of '{n_bytes_per_element}'. " "Compressed .grd files are not currently supported." ) - if sign_flag == 3: - raise NotImplementedError( - "Reading .grd files with colour grids is not currenty supported." - ) + + +def _get_data_type(n_bytes_per_element, sign_flag): + """ + Return the data type for the grid values + + References + ---------- + https://docs.python.org/3/library/array.html + """ # Determine the data type of the grid elements if n_bytes_per_element == 1: if sign_flag == 0: From ff47e1b5ed4fd345015d160800029c7869c1272f Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Mon, 29 Aug 2022 14:33:49 -0700 Subject: [PATCH 05/29] Split tests for uncompressed grids and invalid n_bytes_per_element --- harmonica/_io/oasis_montaj_grd.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 3a7b507f2..328345118 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -63,7 +63,7 @@ def load_oasis_montaj_grid(fname): _check_ordering(header["ordering"]) _check_rotation(header["rotation"]) _check_sign_flag(header["sign_flag"]) - _check_n_bytes_per_element(header["n_bytes_per_element"]) + _check_uncompressed_grid(header["n_bytes_per_element"]) # Get data type for the grid elements data_type = _get_data_type(header["n_bytes_per_element"], header["sign_flag"]) # Read grid @@ -223,11 +223,14 @@ def _check_sign_flag(sign_flag): ) -def _check_n_bytes_per_element(n_bytes_per_element): +def _check_uncompressed_grid(n_bytes_per_element): """ - Check if n_bytes_per_element value is within the ones we are supporting + Check if the grid is uncompressed + + If the grid is compressed, then the n_bytes_per_element gets an additional + 1024. """ - if n_bytes_per_element not in (1, 2, 4, 8): + if n_bytes_per_element >= 1024: raise NotImplementedError( "Found a 'Grid data element size' (a.k.a. 'ES') value " + f"of '{n_bytes_per_element}'. " @@ -243,6 +246,13 @@ def _get_data_type(n_bytes_per_element, sign_flag): ---------- https://docs.python.org/3/library/array.html """ + # Check if number of bytes per element is valid + if n_bytes_per_element not in (1, 2, 4, 8): + raise NotImplementedError( + "Found a 'Grid data element size' (a.k.a. 'ES') value " + + f"of '{n_bytes_per_element}'. " + "Only values equal to 1, 2, 4 or 8 are valid." + ) # Determine the data type of the grid elements if n_bytes_per_element == 1: if sign_flag == 0: From aa2a80462d67ce2c1a074a4135809c1047e023a6 Mon Sep 17 00:00:00 2001 From: LL-Geo <54405391+LL-Geo@users.noreply.github.com> Date: Wed, 19 Oct 2022 17:14:33 +0800 Subject: [PATCH 06/29] Upload test grd file and fix error (remove_dummies) Upload test grd file fix ValueError: cannot convert float NaN to integer with datetype (int) --- harmonica/_io/oasis_montaj_grd.py | 2 + harmonica/tests/data/om_byte.grd | Bin 0 -> 2962 bytes harmonica/tests/data/om_byte.grd.gi | Bin 0 -> 13824 bytes harmonica/tests/data/om_byte.grd.xml | 134 +++++++++++++++++ harmonica/tests/data/om_compress.grd | Bin 0 -> 8014 bytes harmonica/tests/data/om_compress.grd.gi | Bin 0 -> 13824 bytes harmonica/tests/data/om_compress.grd.xml | 134 +++++++++++++++++ harmonica/tests/data/om_double.grd | Bin 0 -> 20112 bytes harmonica/tests/data/om_double.grd.gi | Bin 0 -> 13824 bytes harmonica/tests/data/om_double.grd.xml | 134 +++++++++++++++++ harmonica/tests/data/om_float.grd | Bin 0 -> 10312 bytes harmonica/tests/data/om_float.grd.gi | Bin 0 -> 13824 bytes harmonica/tests/data/om_float.grd.xml | 134 +++++++++++++++++ harmonica/tests/data/om_geotiff.tif | Bin 0 -> 65973 bytes harmonica/tests/data/om_long.grd | Bin 0 -> 10312 bytes harmonica/tests/data/om_long.grd.gi | Bin 0 -> 13824 bytes harmonica/tests/data/om_long.grd.xml | 134 +++++++++++++++++ harmonica/tests/data/om_rotate.grd | Bin 0 -> 19280 bytes harmonica/tests/data/om_rotate.grd.gi | Bin 0 -> 15360 bytes harmonica/tests/data/om_rotate.grd.xml | 142 ++++++++++++++++++ harmonica/tests/data/om_short.grd | Bin 0 -> 5412 bytes harmonica/tests/data/om_short.grd.gi | Bin 0 -> 13824 bytes harmonica/tests/data/om_short.grd.xml | 134 +++++++++++++++++ harmonica/tests/data/om_small_compress.grd | Bin 0 -> 585 bytes harmonica/tests/data/om_small_compress.grd.gi | Bin 0 -> 13312 bytes .../tests/data/om_small_compress.grd.xml | 134 +++++++++++++++++ harmonica/tests/data/om_small_double.grd | Bin 0 -> 712 bytes harmonica/tests/data/om_small_double.grd.gi | Bin 0 -> 13312 bytes harmonica/tests/data/om_small_double.grd.xml | 134 +++++++++++++++++ 29 files changed, 1216 insertions(+) create mode 100644 harmonica/tests/data/om_byte.grd create mode 100644 harmonica/tests/data/om_byte.grd.gi create mode 100644 harmonica/tests/data/om_byte.grd.xml create mode 100644 harmonica/tests/data/om_compress.grd create mode 100644 harmonica/tests/data/om_compress.grd.gi create mode 100644 harmonica/tests/data/om_compress.grd.xml create mode 100644 harmonica/tests/data/om_double.grd create mode 100644 harmonica/tests/data/om_double.grd.gi create mode 100644 harmonica/tests/data/om_double.grd.xml create mode 100644 harmonica/tests/data/om_float.grd create mode 100644 harmonica/tests/data/om_float.grd.gi create mode 100644 harmonica/tests/data/om_float.grd.xml create mode 100644 harmonica/tests/data/om_geotiff.tif create mode 100644 harmonica/tests/data/om_long.grd create mode 100644 harmonica/tests/data/om_long.grd.gi create mode 100644 harmonica/tests/data/om_long.grd.xml create mode 100644 harmonica/tests/data/om_rotate.grd create mode 100644 harmonica/tests/data/om_rotate.grd.gi create mode 100644 harmonica/tests/data/om_rotate.grd.xml create mode 100644 harmonica/tests/data/om_short.grd create mode 100644 harmonica/tests/data/om_short.grd.gi create mode 100644 harmonica/tests/data/om_short.grd.xml create mode 100644 harmonica/tests/data/om_small_compress.grd create mode 100644 harmonica/tests/data/om_small_compress.grd.gi create mode 100644 harmonica/tests/data/om_small_compress.grd.xml create mode 100644 harmonica/tests/data/om_small_double.grd create mode 100644 harmonica/tests/data/om_small_double.grd.gi create mode 100644 harmonica/tests/data/om_small_double.grd.xml diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 328345118..3736211e3 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -291,6 +291,8 @@ def _remove_dummies(grid, data_type): "f": -1e32, "d": -1e32, } + # Convert grid to float + grid=grid.astype(float) if data_type in ("f", "d"): grid[grid <= dummies[data_type]] = np.nan return grid diff --git a/harmonica/tests/data/om_byte.grd b/harmonica/tests/data/om_byte.grd new file mode 100644 index 0000000000000000000000000000000000000000..4048c9b9eedec132f66038be6fac81f920bab815 GIT binary patch literal 2962 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 aE& + + + + om_byte + Geosoft Grid + c:\users\22528618\desktop\hm\om\hm_t.gpf + Lu Li + 2022-10-19 + Lu Li + 2022-10-19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2022-10-19T16:38:59 + + + + + Lu Li + + + + + + + + + + + + + + + + + + + + + + + + om_byte + + + c:\users\22528618\desktop\hm\om\hm_t.gpf + + + + + 2022-10-19 + + + + + + + + + Geosoft Grid + + + + + + + Lu Li + + + + + + + + + Lu Li + + + + + 2022-10-19 + + + + + + + Geosoft + + + &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; +&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; + &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; +&lt;/projection&gt; + + + + 1 + + + + + + \ No newline at end of file diff --git a/harmonica/tests/data/om_compress.grd b/harmonica/tests/data/om_compress.grd new file mode 100644 index 0000000000000000000000000000000000000000..0755e0192a5e77990ba05b1573bd0f0bb1dd29a1 GIT binary patch literal 8014 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 literal 0 HcmV?d00001 diff --git a/harmonica/tests/data/om_compress.grd.xml b/harmonica/tests/data/om_compress.grd.xml new file mode 100644 index 000000000..723822547 --- /dev/null +++ b/harmonica/tests/data/om_compress.grd.xml @@ -0,0 +1,134 @@ + + + + + om_compress + Geosoft Grid + c:\users\22528618\desktop\hm\om\hm_t.gpf + Lu Li + 2022-10-19 + Lu Li + 2022-10-19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2022-10-19T16:41:31 + + + + + Lu Li + + + + + + + + + + + + + + + + + + + + + + + + om_compress + + + c:\users\22528618\desktop\hm\om\hm_t.gpf + + + + + 2022-10-19 + + + + + + + + + Geosoft Grid + + + + + + + Lu Li + + + + + + + + + Lu Li + + + + + 2022-10-19 + + + + + + + Geosoft + + + &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; +&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; + &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; +&lt;/projection&gt; + + + + 1 + + + + + + \ No newline at end of file diff --git a/harmonica/tests/data/om_double.grd b/harmonica/tests/data/om_double.grd new file mode 100644 index 0000000000000000000000000000000000000000..d005d780ddcd2835bb7ae8085fe6330e9c35cf5f GIT binary patch literal 20112 zcmd^HXP8#Cw$2Py7&?sf2_RLJE}aQgIwBn@0hA-4(ou>SKtMr6>I^*s3QCm@15A)A zU0`5fD4{p$3`N@Ad2_yR@9m7w{c(TZ^E^E3Bw1Nmc~{9w_BW;_goHZ($~ynbIR8SN zfA)WOBa^3<)PEWNK?3~$=>9)6Q=}ne`OY~Hz5hKo@B{|>eT z`Z;`JMT=O>D>Ctwp{(sYz=cfz4f`UQ7Gz>hKV2Of3VQ3$*Mjg4Am3j{`B&Z zt&cAod17R*SHb-l{yG z2)VRr3hYBysjm&6mK9+i+WLOl;J(eg!VgY+<a8+ebLD#ZKKUvGbL5CU`7RheX!ReVmq^(k`=sS^lAu1Gd9qHXHNkbw{IHB^f_z5K zv#+u-hsp+1VF!L>Qcmx);*<}N0&Da1zkBd+&fP$ZF$7( zoBy!(iJ>HI(d>p#FI@c8v{jLRYvBK7we^er z%dj7MIq|XKBbQ>Jhgvh{lF?74eF{Gk&CWp|x$2`U&^ykFcMs0`orkwEKl95QLHiha zO}_W}znZr=(eQ~4WvqW>OtA5F>)2`2uiIrU$s9^{=Y;<1wJ~p*HXSkz@gTx_K_52r z2yoz^Zm@p7szgEXt!rG!P(51O{;V_JG;Pj8(9b*OFJjuPP-XZN+y9A;>uy!hPkUc0 zY{pfq5uiFWJ@%~@mBxG(RzIH^=Y_gsebQ&v8>TH2PZtMWxex1!Whu~4diBLT@j-t} zFO;?Vymlt1;pac!wDB`=tKAQMVe|iqTZngleRn~_r$f%eKS{w{@FTA7!rx>D8*jAJ zukdUB>GN~34nOO<2Yw^(Jx3m;pO^64>)}c_UL1ZI6_eU)Pnj;!`qu|b5D$89-_k}8 zo?{YlVX+yYugq8!`(gR-!fq@&Yca#8^2~)F>CVS7Pe%;~zZhlbi#GLuqnuS1@@VF+ zCCoh8=Q^ly&#%z*pr9n~&r77Bp=w ztHO@5WFxFcy7t0(t>d3vi*&}Bt`B?ZItP(I^u9Yb?-aQUJJUzqGI?O@r_WlJHS*}@4~rTq3U#pYbFU}*#r>zSyL#0b}|vW zzuOV~vQU{kK|DSANyN_F4twk$3_HrMhY&BM=9{UFzU=bfA%>Du;~yG6aVrh-9Dgy} z)&YgS@YzK+8H+ro+jMzu_-Rl7IG{5X7u{S#-aLVHRg-Ghai_^Jp(?GezNUDS3WEku~hW>8H zn|=wZj;6A4l6yJis)Zd8A2jV)@T;Z@>&vcp;I||^C2&`%E&*p<@}-T7$~Q1i@{`Ed zZ2BX+j|?wuyoSVEyqD%!V{p<-c0cg?uc$TaWUSNAH`mQ*_Q&&7&zi)30XzP0)R|BA zPVm+5a_@T7MLKHsakGy8sUr3(t13{EDgygdPi9wO&N%Nm8F=#P*WurM6Deo{4(s1pe)r>@Os+H~!v?1rja8wwgK3&i5w z)NlNWJ2$=C|D_jyop==W2>Eug?>@uYjk^;Yz}t~S=9jej@8z)9j9fm5!tX`ulIy+l z*vEx31nuYW$&8mW8Gf;?OZs4cKyH9K|4jAhhMVinSc-F6DpedJp2)G3$5@ftB1ltSNKGN~I zl~bt)DBW@h^6A~V7-ysJ!LRk{eTV~6vH|iC&-n!QA(gfw?$xeM1&tn}#z>6I&MQhL z*}u_Ki;K3s6T4?RXaT zDC?Tto(pqJ*?M(G!i7j@T-Epx=L3l^@zCq{r14B2Zeo2z()S3X=IKO>d-SbT%xR0b zQ+B<1W3Uccbivx8-yz&%g^KsxziIu8wr;OB(E8=!FpGb;p|FdN%w*$b)|IM|KYjr4 z=P}>F9%MVMX8LKB574jrRt3K(oegarx!tx~o&}#g`w)1G#@RvX#mDjJBXG}_|(p@VT z^nah3eCT!M(d%$%;G1!wP{CD|aGN`HdP_zh1Y@`u%_kHg6pt279RR@-+<~%bp2TPj6u3rsPQAFS71HTTMx1 zkoT$(s8UOj|J9W7z?GG206WMEEzwWX^#blZqph2D{7B>@GGU)RhuWUPJ1Bo^-ti>3 z2KM<+>gcH}PI3J>Fz)p8lj)M}7b*Tg9+Dde`S9nD>)(lW=81iY?z!)@S<}bIgE)KT zFU*~+eMz}Rh)+`Vc}#GgBS+OwW#ej7PuzoKAC)SY2b^(vpb+vB{Vf8x^UqIPyZkg6 zZF!-7E#~miM%U5L$CN=o-8lkw(-UsN4kUgd@Kh_pfxmjICEDb+y?4@a+mVk{(XVjM z>%6lq{yE+%7SzYHPhFseFYe{@#rJ~tF?#n+fp}0)+9w!)rT2>2``n?)|Nfo9BVSHA z=R3#wt^BBuMCpd8!_u>am#BDDmR2A z*{_FRE){rBP#4~*#hiWd+8t{fs%lb;`|U=+TQ&``_9|8%PDW7dc=bHfSUAl6ZRy>I$A=f~~)v)J2^l()^OFpXr1FDWF%~ET~UJ%yHmE z=7+(*ScVV&GB~k~X?7VZJMKCRdho_c;1_iS@8P0r^S@%9alLV}dr$P>ARgXAoy2}! z2mJN3RC~;PvLrkQ_(X89YQ-qsazGezsIn zzc>ABZrQwW+|c&LYR?1Y8C9H zvK>5P^kB!v-VFMCfImQ;aWeK(oGW5q_29{4^-Q4zBkI< zyN|)1Ip?@?Jh+KLA;5=jjyNC0*I9;VYJM|_qlaHlnRnCJgUo*h{B-HVIR90uyhnZW zb9To#Z`j`bPUw-t^L^^OSCZI$un&82_C;`AXBnBz)^WVnIOJopKGE7Ub1&G1j~;9D zPuau3pOn0fdWxl6VEw+z2Gms~`XQ*y^C`yVYn5Rq{#|(Tb!UMKSK!y1n%esP>~Xv^ z=_AGcab4|Lx+Hnm=v`ooo6ns#{pBmXdywL7fs2@w;T-JJepgE7jH|=F#(MXy3SCDW zsr`ph$MUmriM5xQ zYujV@BY(>UbKU%49&E)r7vDgCfI9Q&j1h<@k$u)3voBsIJN!m$9&f)h z&A8>hGkNCe!R6iiiKm|>=CJ!{2*Zy-FNzc+yFK5GyDmDTC{_&exc33!##^mTm8uEPjbx~_&pu) zDb4}K|9g(#=wj_qt|ju5ZnZl;3ErM{`GHHmcME-Bi~CODs3nHii!=LSFM7ECX8MaZ zg5RGCi~6J5Hoh7-aqRG`9_K?1rN>X+_*Z-a>lpr* zADs!}@9C$P*ZmRfclh+qnf6=`d1CL4Z!|2QB>oIvOfesx^sB0c6413U>#jrl< z`MrBiIQ(+Jkxa~?q*Nnow~`;Xiw*2QK%HT}=$IXUG0GPYqGBPOCv3!$Bf)t_-u&8& zVjUtPbHQ$`&hn&j=#0x5SKw!|!$SNnME^D!ddnSGQOC1q%7-H<&E0nakA7@kO2ms! zH_xqC9r-$ZgHK;Jts?Z5?dqO2`sq@u;V8{mkhXkph0M)7G=N zmT=w$J?qm$F>W2>?O*dF?8x&Cw{n*%-+e>9dY)j`C9D4f`{?Vp-SL2&0Cm`C=U4c? zsP<)Y?}>r&0Co7-!Xj6^`ia^T?fb#{B8U@0J7GWc%=x72nRVv2vi=&KkgVOvfCuqj z`FvO##JP<9&*q>X1oZhQb>!;?ZGj_MIK-82`s16}`2Dz=9bdZ&dWie|te-xrk?i>* z#ZN9CjvTo!i(8i@v%Y%Exo-#h9e&>A0C3UWC!8_%kUOTj_B8F^4kSIloPN=+*V#yi zs;pal_i5d%u&=FB_JQA#&+g;?qw8?kkqtZN+9{w*PTHzfq(A@F@59 zP60lrU$)KZ-Xonhowf@5R4cpSo~+^@#T&n4AuX^^k>{L?w?~e8{?KPHvSX6_9WTHa zpl00oV$v`(720|4-`3Q?!7a z7Xsr>KZ$YjnnU(Io)02+joj~=>gY%6IzhKY% zS!?aRpwkTGe>Hp*F-2|76r5ykqi~_Pd$tvAcS(9&qGRc?$I+*%|@6k~?V;_p)+AE#{1C`q182*G#Kx z+A@3^zALa3L+tOuMoj?z;z?&a@7o7>m!{|PFvCxKjIQZjPd9i3ob}-1h;x>6xvd9i zf4tAKAJ^FPXwq@yAwKlIGDeP|O@JGZjj0fn=fPiu7RP-`^vas7U$Q)V;Vl#4(Q3c zr1G6tqTUzwUQosUu8f^-hoFVaFtg7kEo&J{4}DwPtG|9O>^al19;jNh z6YtohTVB|K{apoiVIA5d->DnRLya6U%HG@f(?`C#L9dzOuSZ(WEp7Pa!aJ7kxemMN z@x79b12OX(UmhjPcOXyks?V@bx!{4#Q&)=HJe9`zU62PyvTN~ag9{Hif_jSl8VbMR zH>aY0)D!IQFxZt{dtx0vmO87euSX6`Xz%tL{qH3p&(l$1z(qXI2)`BS`&9O>PrLQ7 z_p`U|!7oIUhQLpb90Xi-nxXa`C(HZDSA5hDcKoM{N#7xyb!lGvy+HTx3O@e+4#?qi z_V~W1vhe+dbEX7)Qb{%u2@?`FvR^u;FFg&qF&G5l#_l=X*m zarQlBNq}YCO)x#yR<3%o`*5}ou*0#-|uPJ^rIM8-R5GR zOc!Ty&3Fz}G#*yhXU~(H?D_p+8vFimb&}jnH(A^ZDldSQUgi$$vV&RgsFT%Mi^QML! zM7cj~eDpg9zmUI2x_Qr8M=u&~>-T#VY`!8nfuqd&E8;_}I9rPuea4No?YYkV(W~!+ znzo*pQOx3h`4iZK*RNyabNqGduiNv%56HFepeIcn4?kzM&*B^-C8djtv!3j--sY9A zU4f&hyVZT4aK_mWrLK7GDwox;=h%dfplaW@IEO@|W)}>eGG7IpNBY|Xu&=0bw48Sz zGDWoA$9rAfd$xCwFn zX{SC_yz7faTksAdAJzhX^w(LiA8oxHelCwbfm|IMfpN9tDEjG!k=8Da8$2_5sr-$A zFX5~I(8q?I) zT}}5}yB8V?epYQ7`svXWh%f!kA@K7HKU#lmlh=-4dlzj{ZtJn2T?6_!dQepa@h7fc zNqSxd_yW}7*Jsb(@!@~74c`Cg)*Pt+$gf4M9!+9l5BB6E;LU$620!KM9Q>31vL5(} zJgAHZEO^(`*DqMR^x2F0p8VPn_L1EpEv+&b^H{zq z)*f-E!LRbz`kXv3nQR`CeOJT+TxTv1Z=IJ`EKv~x!?(aezKJiS#pLDt3 z;IFKDPMjuJuG`uE{!@gN#ymaglpX)t!?i?H49e@uJ7?rwz@U!p^sd$d1zb)AKvQXYT&F#AFaiVo;&7S{>;mv z4;ya(?u}mh68q;vmsvj$>9B9rDgtq((_ z-hsMG)*KAGkntyNe);G!>@P~}#`hUAXxCp}Kh{~dp9;3U`|Q~kIMCxoAWt)b^F+=r z?RziMaSv>L9yZm!E9FZ>y{vnuT^r0t0l5L{sLQg);G9&w68-hrM>k*(arAB2gN5XR zpQ^|9_m1pX4dg{uWjAmo36)?6S^sCmgM?r_-s?TC*+EtkaBK3$EkAL9G~J^ZwD9s87|YMLzw-!s>CxuB5@^r0;+pIlRtxoBw*f z3wiuyKiEO-Tnf9eYq@;iALw5Z?t8Y8|HB$v&vqT?@_FRz@;TuDw8zP#&?kIovfs_w z&d+V0y=i}s$GRrKE^Jm8*o$stwV1PN7xf$9{YOvQZ1Z@- zw-9&aoq<)o{!iyA$mef-SRHb+?DD;r>25`E9+3@4W(MVZ_C<#dM4ZS7`*-D{ZCaaW zZ`i+cQrG*VO&;w-TSk_v)T6dfV|G*(qRmgMOlIa~p5fXF;AQ^o#HPiVS;AV_val zJA61U`rPWbVH4zuyyxBT86Ldp(pmmz>t|VP zo*Mg69p>=y^mAbkT4o;hA^vLX<_~9FM4Ucn87>@>H%9 z+^5se%9U3JCok)F#+PS4 zxxJmggZJWCsNKKc51sk?b7AX}64|U@mS3{Z>|1773%upW3&wimiC3-YdncjSIs#u( zX5+pfPR@K4^OwbE*=%1v;rZ4j>ld=(6#Ki58{Lu5#NDaLM`~p=d?ygCA45-7A?kux zAN3h^-%A7g4p2uAvh{$^U)ZbbZhrOfu}^l|`%H6(1)X9zu{h^M^AUZD|qyvMbr5Fk(F6z^Yw__I44B^jxP)@I>!YaIr>dDLI7Jw5VCx-P4XUaH$J_!TQu-NwOxdb#^|#%V%@f4_$WMclYC@`|s*JG)+6*Z*B9MN8LS0eKF;?vvTgpMm~=Qo~m|?KW>*=+vX&ha%e? z-+QheF!PAfi&Q@Wf1w5UoQXB_-?-*~r#yHF?Dv@HE z8$V_rDHpr%yaAk?e)g(lD08S>zRBi;xht)IEj{GRn_|Q*pFioMgY5q9WWn$C)Z>(> zD^;6vu3tHFNsCP(h(o?T#O?RU6DRKY-z)B~ zx4#ET8;1DOi}IW{_GH7ZAPnIqO$uhH_E@!yNkQ%2hFlGDQQ`(w5`8u^B` zn&Il}$WuQ~_OkiL+ zUSXsAT{qAlpw2vYGQ{;SPd|VA_!%Q#6+GtqZcHW?o}a8;u9mR4RPNyZF4&nb#uTvc zhs{4cW%TE*qh0^r$dTW*hMh=@W_VX112&xp-dDdyzExYE`t$oYd6UgAD&HdH33m6k z@7(44ORa*u)umm$9esFYto=TG;x)WOknpXb@@0%YpCY;;pOC*#<9FHe%axat!{7P- fYu`O;*R%iKk_3kDRJuU8^}lp~Sh*jTeG&OTXHzEJ literal 0 HcmV?d00001 diff --git a/harmonica/tests/data/om_double.grd.gi b/harmonica/tests/data/om_double.grd.gi new file mode 100644 index 0000000000000000000000000000000000000000..a1a940090e05d14a7d3ea670ca8819f6fca304a9 GIT binary patch literal 13824 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 + + + + om_double + Geosoft Grid + c:\users\22528618\desktop\hm\om\hm_t.gpf + Lu Li + 2022-10-19 + Lu Li + 2022-10-19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2022-10-19T16:41:05 + + + + + Lu Li + + + + + + + + + + + + + + + + + + + + + + + + om_double + + + c:\users\22528618\desktop\hm\om\hm_t.gpf + + + + + 2022-10-19 + + + + + + + + + Geosoft Grid + + + + + + + Lu Li + + + + + + + + + Lu Li + + + + + 2022-10-19 + + + + + + + Geosoft + + + &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; +&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; + &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; +&lt;/projection&gt; + + + + 1 + + + + + + \ No newline at end of file diff --git a/harmonica/tests/data/om_float.grd b/harmonica/tests/data/om_float.grd new file mode 100644 index 0000000000000000000000000000000000000000..7a7b62ed915dc2069a5bbcda7f633f9900fe53b3 GIT binary patch literal 10312 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 -iB zq?Mq3F8(skCl;Y31c)&t#$lWM%D z%+KfLym-FtOxG-z1RE`uY6Yg|dEFLv%bsK5o?aUr-SkUzHm$Ap&F|lc7zjF-m|W28 z%;5Rf$5bRh8RhJMUq|nNn2pegREy)PkKT;rlSc~Ddp2q+25sxgC|EJ&Tw%t#T@_tN znY05DM)ru?k(&N8S4PyubXRXs)jzYbdEwbVjp%K&tmr#(MW!i+X=w(VWNl^hbU1~_ zj-59JuP&`;?%uW$>7zXL8?D8uD~5INl{3=?@Hfc|%&@$gMM~d6I1V&JK0t PgK+S3=>Nzs&;tJjR@JM9 literal 0 HcmV?d00001 diff --git a/harmonica/tests/data/om_float.grd.xml b/harmonica/tests/data/om_float.grd.xml new file mode 100644 index 000000000..2b5fde801 --- /dev/null +++ b/harmonica/tests/data/om_float.grd.xml @@ -0,0 +1,134 @@ + + + + + om_float + Geosoft Grid + c:\users\22528618\desktop\hm\om\hm_t.gpf + Lu Li + 2022-10-19 + Lu Li + 2022-10-19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2022-10-19T16:40:27 + + + + + Lu Li + + + + + + + + + + + + + + + + + + + + + + + + om_float + + + c:\users\22528618\desktop\hm\om\hm_t.gpf + + + + + 2022-10-19 + + + + + + + + + Geosoft Grid + + + + + + + Lu Li + + + + + + + + + Lu Li + + + + + 2022-10-19 + + + + + + + Geosoft + + + &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; +&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; + &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; +&lt;/projection&gt; + + + + 1 + + + + + + \ No newline at end of file diff --git a/harmonica/tests/data/om_geotiff.tif b/harmonica/tests/data/om_geotiff.tif new file mode 100644 index 0000000000000000000000000000000000000000..f3e33cf294805b565754bcc8e81388ba0fa9da47 GIT binary patch literal 65973 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
    >E$B z<6hRA9Ms!2eD+^BJVwYSY}B@BZS1tV?uK~Y;_%>Z5fJowHS%=qT^$_BF_h!Vl-oe- zfuG!VUC!Ddqta)M5sR zxW9$rn4>y(L-_G)n&((*@L{)Hsp`#!Ub&rg_lNR{*Uaonx1(s=>S$2kC7pB(?RhZa zhs>5VM&C=_&e|(m582ru@zx8jknJr{A#mXD+;S3l)O?gu{V!)yuXABJ$`IM zJhfrIQ}-Yl2OUkwVc&=^EU( zz|_QFNz;QP!w%_kRTy5)))^F3bE9Qnb5VVEpSd}I$zw*=x3+rIdK-TtC2s zXyVUvosmamxT)9ZDk>hq+%NF$BCapE;qBpRUHANK{TTh!{8%6#xXs#7Aw;hTknDb< zsHV?+u#1S0^bjICOehW{k0gQxk^vz$q!1&jKidfZ%MCSYWhrU3pZ4zq5M3p4IE07y zCKs;&7atcC2Ic4HhH`=bko!4AS4mnNB5;!*#wEbb!^6+R$;ZzJ75I7nKc=fBuMA;_ z-V_kvg7NWjb8~ZYa`JHV3j8d8sM6IESA%eJ@!k~R1-m>7Pmdu;e}b z@PSi97G($Zh!V*ohA|lnAwa1&V6?CxiD3VbQgBT=a$?lW@YQZrkk1BuDS9?p@Z;!M z&2fY80L`NQM*V>A@wcgKHNuN8wW>vDpFWHC#9*?4ow~L}%r3uiQ@o|cS>}zX4>N#i zest&`-1~gu+`@g=fZW}sWBA$eO#ZULh)1fie*3Pgb=7Lqv#0BBL(6(nb16Ca9CmdT zamhX#Dc5&y`af5d{MTC`z@CbJ~hxPy)vkaImzFjnx6P2 zS~j6M}YjDq7#e&aL(m*`6-~ zk$r9mpRM|)<7f?>0`!ztJJ=RCa`GFj&p{i+kgo>n4F#HX|~ z%ptEQN3n`DZ6QfJE^AmMR7xp1l(YVDDVK3?4 zp76z2O-@O{?dB<)seV`U8Q}(@w6E5ZG{2QM@-Lqv>%F)5dQZMB_33+0_^u&EJq*}x z`Ks)%Q0~p$645{2ed0OCVR#=$_4!1en3#aCN%KT|9f~=JzuF%r&i{M=D|+C60FNra AJ^%m! literal 0 HcmV?d00001 diff --git a/harmonica/tests/data/om_long.grd.xml b/harmonica/tests/data/om_long.grd.xml new file mode 100644 index 000000000..dd6bf6b0d --- /dev/null +++ b/harmonica/tests/data/om_long.grd.xml @@ -0,0 +1,134 @@ + + + + + om_long + Geosoft Grid + c:\users\22528618\desktop\hm\om\hm_t.gpf + Lu Li + 2022-10-19 + Lu Li + 2022-10-19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2022-10-19T16:40:46 + + + + + Lu Li + + + + + + + + + + + + + + + + + + + + + + + + om_long + + + c:\users\22528618\desktop\hm\om\hm_t.gpf + + + + + 2022-10-19 + + + + + + + + + Geosoft Grid + + + + + + + Lu Li + + + + + + + + + Lu Li + + + + + 2022-10-19 + + + + + + + Geosoft + + + &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; +&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; + &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; +&lt;/projection&gt; + + + + 1 + + + + + + \ No newline at end of file diff --git a/harmonica/tests/data/om_rotate.grd b/harmonica/tests/data/om_rotate.grd new file mode 100644 index 0000000000000000000000000000000000000000..e4a9bc469a958fcf15dc6367b3c99144c0375120 GIT binary patch literal 19280 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 literal 0 HcmV?d00001 diff --git a/harmonica/tests/data/om_rotate.grd.gi b/harmonica/tests/data/om_rotate.grd.gi new file mode 100644 index 0000000000000000000000000000000000000000..03b2a3b20c9df98b78fe7a40f877674217b64713 GIT binary patch literal 15360 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 + + + + om_rotate + Geosoft Grid + c:\users\22528618\desktop\hm\om\hm_t.gpf + Lu Li + 2022-10-19 + Lu Li + 2022-10-19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2022-10-19T16:42:40 + + + + + Lu Li + + + + + + + + + + + + + + + + + + + + + + + + om_rotate + + + c:\users\22528618\desktop\hm\om\hm_t.gpf + + + + + 2022-10-19 + + + + + + + + + Geosoft Grid + + + + + + + Lu Li + + + + + + + + + Lu Li + + + + + 2022-10-19 + + + + + + + Geosoft + + + &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; +&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; + &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; + &lt;warp type=&quot;TRANS2&quot;&gt; + &lt;warp_point ix=&quot;-21&quot; iy=&quot;-12&quot; ox=&quot;-21&quot; oy=&quot;-12&quot;/&gt; + &lt;warp_point ix=&quot;479&quot; iy=&quot;-12&quot; ox=&quot;229&quot; oy=&quot;-445.0127018922193&quot;/&gt; + &lt;/warp&gt; +&lt;/projection&gt; + + + + 1 + + + + + + \ No newline at end of file diff --git a/harmonica/tests/data/om_short.grd b/harmonica/tests/data/om_short.grd new file mode 100644 index 0000000000000000000000000000000000000000..6a6c717fb43333030a27b3a0e69e8137638f97fb GIT binary patch literal 5412 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 literal 0 HcmV?d00001 diff --git a/harmonica/tests/data/om_short.grd.gi b/harmonica/tests/data/om_short.grd.gi new file mode 100644 index 0000000000000000000000000000000000000000..1529a8ee07e0a167e0dd4078cdd303a6890174d5 GIT binary patch literal 13824 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 literal 0 HcmV?d00001 diff --git a/harmonica/tests/data/om_short.grd.xml b/harmonica/tests/data/om_short.grd.xml new file mode 100644 index 000000000..91ca222af --- /dev/null +++ b/harmonica/tests/data/om_short.grd.xml @@ -0,0 +1,134 @@ + + + + + om_short + Geosoft Grid + c:\users\22528618\desktop\hm\om\hm_t.gpf + Lu Li + 2022-10-19 + Lu Li + 2022-10-19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2022-10-19T16:40:04 + + + + + Lu Li + + + + + + + + + + + + + + + + + + + + + + + + om_short + + + c:\users\22528618\desktop\hm\om\hm_t.gpf + + + + + 2022-10-19 + + + + + + + + + Geosoft Grid + + + + + + + Lu Li + + + + + + + + + Lu Li + + + + + 2022-10-19 + + + + + + + Geosoft + + + &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; +&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; + &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; +&lt;/projection&gt; + + + + 1 + + + + + + \ No newline at end of file diff --git a/harmonica/tests/data/om_small_compress.grd b/harmonica/tests/data/om_small_compress.grd new file mode 100644 index 0000000000000000000000000000000000000000..a666b3b950750675a8a8d8c984db05ac01251e1d GIT binary patch literal 585 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 L!(RWt*T??=guqv= literal 0 HcmV?d00001 diff --git a/harmonica/tests/data/om_small_compress.grd.xml b/harmonica/tests/data/om_small_compress.grd.xml new file mode 100644 index 000000000..7ec04e739 --- /dev/null +++ b/harmonica/tests/data/om_small_compress.grd.xml @@ -0,0 +1,134 @@ + + + + + om_small_compress + Geosoft Grid + c:\users\22528618\desktop\hm\om\hm_t.gpf + Lu Li + 2022-10-19 + Lu Li + 2022-10-19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2022-10-19T17:00:32 + + + + + Lu Li + + + + + + + + + + + + + + + + + + + + + + + + om_small_compress + + + c:\users\22528618\desktop\hm\om\hm_t.gpf + + + + + 2022-10-19 + + + + + + + + + Geosoft Grid + + + + + + + Lu Li + + + + + + + + + Lu Li + + + + + 2022-10-19 + + + + + + + Geosoft + + + &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; +&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; + &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; +&lt;/projection&gt; + + + + 1 + + + + + + \ No newline at end of file diff --git a/harmonica/tests/data/om_small_double.grd b/harmonica/tests/data/om_small_double.grd new file mode 100644 index 0000000000000000000000000000000000000000..715d68a7491804afa20520b980ed7dc869be1066 GIT binary patch literal 712 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 R*ebk_A36B&+5b5^{9j36Lc;(6 literal 0 HcmV?d00001 diff --git a/harmonica/tests/data/om_small_double.grd.xml b/harmonica/tests/data/om_small_double.grd.xml new file mode 100644 index 000000000..b5fe8781d --- /dev/null +++ b/harmonica/tests/data/om_small_double.grd.xml @@ -0,0 +1,134 @@ + + + + + om_small_double + Geosoft Grid + c:\users\22528618\desktop\hm\om\hm_t.gpf + Lu Li + 2022-10-19 + Lu Li + 2022-10-19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2022-10-19T17:01:14 + + + + + Lu Li + + + + + + + + + + + + + + + + + + + + + + + + om_small_double + + + c:\users\22528618\desktop\hm\om\hm_t.gpf + + + + + 2022-10-19 + + + + + + + + + Geosoft Grid + + + + + + + Lu Li + + + + + + + + + Lu Li + + + + + 2022-10-19 + + + + + + + Geosoft + + + &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; +&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; + &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; +&lt;/projection&gt; + + + + 1 + + + + + + \ No newline at end of file From 6064b06a3949584904b126209b8b70edd0eb19ea Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Wed, 2 Nov 2022 11:14:12 -0700 Subject: [PATCH 07/29] Fix typo --- harmonica/_io/oasis_montaj_grd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 3736211e3..6f8e49144 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -5,7 +5,7 @@ # This code is part of the Fatiando a Terra project (https://www.fatiando.org) # """ -Function to read Oasis Montaj© .gdf file +Function to read Oasis Montaj© .grd file """ import array From 38625f4933cba734573f7a30a064a63419d233a0 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Wed, 2 Nov 2022 11:36:53 -0700 Subject: [PATCH 08/29] Don't read map number nor map label These variables usually don't have any meaningful information and they are usually not being converted to Unicode characters properly, what makes difficult to save the dataarray as a netcdf file. I think it's better to ignore it for now unless we have a good reason to include them. --- harmonica/_io/oasis_montaj_grd.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 6f8e49144..c24c0ed97 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -161,8 +161,7 @@ def _read_header(header_bytes): } ) # Read optional parameters - LABEL = array.array("u", header_bytes[76 : 76 + 48]) # noqa: E203, N806 - MAPNO = array.array("u", header_bytes[124 : 124 + 16]) # noqa: E203, N806 + # (ignore map LABEL and MAPNO) PROJ, UNITX, UNITY, UNITZ, NVPTS = array.array( # noqa: N806 "i", header_bytes[140 : 156 + 4] # noqa: E203 ) @@ -173,8 +172,6 @@ def _read_header(header_bytes): (PRCS,) = array.array("i", header_bytes[184 : 184 + 4]) # noqa: E203, N806 header.update( { - "grid_label": LABEL, - "map_number": MAPNO, "map_projection": PROJ, "units_x": UNITX, "units_y": UNITY, From eea2000b232b7ed50e9f0a7400dcd6a6dbb278f9 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Wed, 2 Nov 2022 11:50:53 -0700 Subject: [PATCH 09/29] Convert to floats when creating numpy array --- harmonica/_io/oasis_montaj_grd.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index c24c0ed97..92fa6abc8 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -68,8 +68,8 @@ def load_oasis_montaj_grid(fname): data_type = _get_data_type(header["n_bytes_per_element"], header["sign_flag"]) # Read grid grid = array.array(data_type, grd_file.read()) - # Convert to numpy array - grid = np.array(grid) + # Convert to numpy array as float64 + grid = np.array(grid, dtype=np.float64) # Remove dummy values grid = _remove_dummies(grid, data_type) # Scale the grid @@ -288,8 +288,6 @@ def _remove_dummies(grid, data_type): "f": -1e32, "d": -1e32, } - # Convert grid to float - grid=grid.astype(float) if data_type in ("f", "d"): grid[grid <= dummies[data_type]] = np.nan return grid From 2b6ea821e49a12690d8dc8904bf51f361eefd293 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Wed, 2 Nov 2022 11:51:18 -0700 Subject: [PATCH 10/29] Remove parenthesis in parameter description --- harmonica/_io/oasis_montaj_grd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 92fa6abc8..e629992bd 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -42,7 +42,7 @@ def load_oasis_montaj_grid(fname): Parameters ---------- - fname : (string or file-like object) + fname : string or file-like object Path to the .grd file. Returns From b6a429acb04432341f9921f36ac04f74ad3d9168 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Wed, 2 Nov 2022 12:14:27 -0700 Subject: [PATCH 11/29] Add test for new function Add a netcdf file that hosts the expected grid. --- harmonica/tests/data/om_expected.nc | Bin 0 -> 31193 bytes harmonica/tests/test_oasis.py | 105 ++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 harmonica/tests/data/om_expected.nc create mode 100644 harmonica/tests/test_oasis.py diff --git a/harmonica/tests/data/om_expected.nc b/harmonica/tests/data/om_expected.nc new file mode 100644 index 0000000000000000000000000000000000000000..4a009825f501c49275ef2c6baca6a250585ef2c5 GIT binary patch literal 31193 zcmeHv2Xt4(w)Z5V6MC;X^dcn$kY>mLA%xx$q~rt$5?UY>rHBWRB8W(@!VyqVs`P3G zsZynPIDk~8N&ugy<9v&K&E=}$< zzNu0%U0%86^gyZ!bQ?xC+*rMFcxW?U|24h^QRkP;ZPHy5(=@)!M~P(2sQ!B*o%%0h z9f&ZdyR&S0@wcB3ORPcjq~V+&b#3lyNRdbV;gihQes1rmkPCFVq!Z-_loQn)t6VxqmqPD0k7wwDd~CgDP#M3pY$U~6-wZ!awNbs{ZAZK)}NHjc6I$%9Hl1s=8h_q zw4+i>Wy(=H&gGwf)W0y`ACV#})PRkCIoQ5&t?>H(wIu^bB0?e>)oKzO(>p4*U$hJ{ z6)7?xpm0D`Y~SdZUco`7dLb5rE0n2Rrd+A6ox4;FE?1^pP??~^@2ps@lreTMgec=g zQ@J#wOS8H(r%Us?)NpA*mlk$uQI{5XX-Susa%mZt2D-GIOM_fm-lY{>TG6HNy0nr@ zE4#FcORKuHnoHkvX|PMHyEMe5oT%keR>S38%4)j2OIa(2PA|GGu)fUNeI<$J=KH?Peey8+;1Fy;VfpUgh&P6}mrv;D{G zhlSUz`8sM;C97Kkgw-uVRNsCzE#0ltBx?D;{ok-=;Z5KgUtA{L;j|qo)ICHNJ;T>B z%9*OT6fsCO|Mb7oXRia5U@R`LF`s0hPChLB>DdZ3TZD&7y)uL{$?DF<>nb8kZuvhd zeq-mKhg51Mr5+okl)B`|@(-!G0~UN4)?DghL9WN7Fp8!wD@|&`K4!%wOMdESn^a@085JY!wKc$*VPE1$?XLWxvTk zST&VB<$9QZz+gVAOHGFBSaey-z3ie;sg|-!I15nPq@_x*Ptykt*hE!PmC45h#`?|Q z){He)O;SQd@w*H6wPQ`yc+xQC{1f?__h;#pY#mz0>q}nxgtc~+su@&YwcldC5!N#y*MP%O<ohDDbi54|mRXQE`^(ITNbjU6$F0+5R?g=~YDoraZ zejhsLd8;h_3(G(M;{yMu_6+Rto5yD!pL;yvLD1t850swyc>Ll)%QH(4^qzR|#H7a| zo*3{1w7J;`2yhY$G0&fv` zi@;k1{`&}og@-11%T;e$Bh%#1=O^#;_`;`uujqb#BRkg2^Q21NFV?i|rOCc0NY`VQ%zS?s5t_GIys&w}{&=fhapxo31Qmefa7fAi&! zJz?kFxI`KvKYkMpR@raDxF2R99}dZesLs)mZ)Ao$ku(V>67^;(#JR5uNjuUfP=Q}j zdUg8uKZSZ)WBQQEpF~JC>BuF$V`Dl+_3azcrAOq4Z{*O7>PMJ=d<2FcVbmk3deYUu zy(pLHS1C=^>s4L#WG#!TOUUb&Dm1?RkBfkJ{j18ghetMhqc8k4_?qe`#Q%-2>Rubt zE285-`FUZ4{01x{sz;Rk*{$Edj3|}ORPkeJC?5Mpf7t8a3r0Pc*ZHh(*T~*c5mEng zO#P#6qK*UpWk>xhugWG!z4DXFs95z;qxz!qpJlRt;O!=WzP%$m$&S+6H%Mg?r+Xm^ zDI`O!V!(f(!p)~2N5sTNfB0tk)HTA@Fz`RqP+7dr$gwf~BKxVIXWtA66*BG@p&jK9 zzG`E6<1a#$4&_Ig$kflq5nUoX^^1vpLqn8D-0iJrWbX)>PrF5R!i4@+P^h^7_lx>` zl{u%j?hT+Fcg-b4i_%ZLca`mL&BguIE4AhrQNEet#e&aF2S@@YNL2n;Ut*9)XdGd8Ra&TE`H?(fVsn+4$2;Vy? zS1F$F3C_hO6{*ZiY8)fH$Z5#Adh99}d{sLO-ugnd+YOr?SJWAQ{BS}!_S0kFYz^-Y zd!-2Muv=fkc$Uv9;9#T}x?T0-+iI=$^#5Q1c(JukHZI%E8G*OdI7akA=rtPoVIEG^ za7XoX>`L&D(dt1eB`*ucGmHFrE}>o{IG*O0eF<lyYhGly;nAz> zogSa2q>5&C?8_zyPyxVoB zzz^n;i8(o%soe_bdP&XHmqFxqVy#E_vpA3G2tSZUR@Q zdI0<(w$>m!56w1|obC5H>^IF&;A@O63q7KFXVe=(?ejw}bL~B_Bjy0&**O-5{9$~* zn&M*rGR()g8vj_yvEMes4zXs`Z^}NA>Mz8R)%YUpu~$W1gWbnzy-N}J)p_^f9rVxm z66;ylvxZ-K;$O^L9Ixc84dp04(x0XEb^F*kRqwRPT#8G|cISlsBK4@!iZ=#L#d@&( zyTcwn>j-c#dv2gOUsbXoBY5ny7iRNRxp!|RGHrBg&b9X_d*YUYT>%Cwu#E~iPA>QnC zwBC#kKLBU5=ktqkQl59*gSfHpKSv%lJ}OCiwZ9&&^sE`M70O+3X{+a*{J z&fY$O$__KzMBu{X(!pLkeKE|3=f4NP@fn$mD>;#8F5<|EIDvl7^nsAKMo@q2{V?EY z&klkGOAuQxdLjO zKZSK+g|>%%&To@omvj9(#C-fllhqLc4<(;DU;1Ai zY?|+}TEvf7O7Z`_h4p5q=|FM%tVNL0XKd+QOi`;)J6b>YyP@8C@E80pUPYi?)EZe( z$(iq$Mt|$KS-_bM>p*xL^)Q|o77jUneFfS7ECkeucu4j{bOdj;SpfURjwy(LColv2 z=SQf&sh1r>L z50#vCJ0bw zD)0&6ayN$fEfavB>6;#YWGRkOTuvzmJXr0~71a3F_p}bhnAPZS?L7p&Ec1EDS!pLx z{mTlZzsC^xferqd+8ccWDvl!Qjn^s~*=$k%+@BbrCLm$Y7eP7&Tqv#n7$IZJlqJSYF8c&|Ad=TLJ?ZN#~m zCm8EPx4$vnJKmSePO?xQ+q)j;B4_%X6LGTA`L+_~YgZGXEO`LtDW1%!$Ys0PZ4&S_ zr`<$+o10j9RnJSg`L9bw^y3vi0KP`S)o2$x7s8L`j7Zd*+Z$8+hze+DwKfvY7w&_% z`)?!vKCAbx(r@p`MS8Cf1+`=LK%dcf3H0!y4JkjS_=E5*yD_8cXN87<+Edo%Q@pWu zQ&vUA?F|JLwF|^y-*gHe#=kr=?)Am_LpA{)C;lk$pD)I_L)Y^*WA7@wG|%RjqWt%A zNNO%C%>f4D-bztwz4EIp(8s$LO2@&v_^1CZgW|1ik!cgw%PPog>YU7ic{`iaA};y! z48X@Q$5&GQ%fS_)q?OvC2x`8Qq5PkLeG5&2e4ePuAWK z`mGHY$-ny=fLa9_L5{V5PI@XwgBn{8LBDZtF53CX`-p4j+&-)WR;n)YjhXWa{KG2$ zgmo`=Z7Qhju&NJ7yB)Ct{*+bTd0W|hm7FZ7x7+PUJ~9{Q!oAIycnSI5Ihis^{4Ady zp8K(}wEqU>H~Y*+_>~77_T`e71^UH~Hkr6&tf9GZPvBRkBYw;YgOUHtrom{}@~p@v z;Az&(i}@RqXH`M}KW+mbp0x__u}3w7e~fKIQ7^81OSEtt^;_Pis_Mt=m5>)N-Ush& zbO`@VeJDTiVKm5@bibC z&GQXt9pxxV`Knuc&wWJp^!USQe*x!F-Z3lf3vBtlvHtPq@#xot(=?>-ZTOZ{8@3!xmj8Kg1q-s>ZX#sl&>jvcOIw{0g1h z-|J6t`Kv$S-)S)X;)GmVIMI4W`MW89E|nB8`mP-n~tP? z+G_^WYc@yLl`Bj7h(FV>Yo zJ~C$SPQzuT-D^1BjV!+x*l(PMR~IB4U-#3L@3?SAwHr6?lm9EVITWJ!1xwLi%Q+Rl z!9CM@FpF?$*fp5TM*dzA_{IErDR5)eXTcA4>`v6%Bf_dHIs5uwg#X2Lgm<-0kmG~P z&^o$T74>||=irTMIpHU#T_mVcr3vznwKPA@OXks~bZ+`}EA}%h;t2U+@gvGp=MQ21 zi1Vx92Wf%_M{X6Tec!Ej9xg||xBD0IeDlx6Nh%BG z#jn2uoY?QX;U9B(!w@bTP0<_c#ORP8{$k@D_{FHUp4P#%OCyWSb$b-l?VrPwl(Er65%5QnAV?W~uH=|z6X-a&~71*c5xEoj(&M)nO7fa+1 zqp9QBXT_ZLIGg zZW+aWzlxN%P7HxRMD_|b)HpnA22f{OU0OG#h68^q^A7N0ay(aZ&Z|P8LM%o87n8>U zS6;p@{9spXfqIsvJ8(DC)4AC>HJsML_uOUs+=J}i0{+tN_JKmkOU91@z}@`l9QozjN#O0v;WfDwHtOF*y*a8J>W!Vl z;5TRdZTNwmS_nMFitNB&lx_i@-JyG@F?Kuhktp^l_IW4o9Kt_a>EcSiEFRpQ0?j?^ z-hRFq@ucPKK7Lpa;>ibRmEVl}#j#IYhbAFjwcOuPd-6r#qT9{e`QbM!upZ7~VnH9| zA#?cvjB6Z^`U&IA?v$i|&ADsv&a3rl%KHw(`=RCydxH;`j4Yn{YTjOI;XOfIezzu< zm1eE>wGsQc&w@w4U=|_N*)v@UxakAanILUKQlvTjRdUzY>B>uxX;O{(3zDMIc8O2(n-AoaPbAd?rg3e!??}E4DUm&0HDW~Z?=IY^3{V{J|y^bd@ zYP-yOLxDffG!wWxFXEA(jP^M~xfHTQO8CJJOpg87?Ao3Du_X}uzIpsG>YaN#=v>z( z1JUI*kgv?kA3=^;Gk~9S|D}U@Cz>bAc66PpxBTl*QaG9y$|f22=9=4-7j8X2spO5v z?Lb-N1LPaCNq*#Q@gN-QNs0h}J9q0O{i55=o6CH-WXut(fS<^6@QAX59~=F?_v3V4O3woK-svezDnc_}A_h2D{BKM`FE+?a82@rMUZ4%|rLo)Lixq{$QIP z!w=%Y7Fr*TrX%j{Lb)mKOB{ed_>R_ye-_k^+AF;S%C@z^I^b8H1#+p}=(K|DNd7hO zH9J|bpPiWK+3&=6LAWn#d)U@!{61$SE44SFy*&3X-gEw^^xkOi-hE8TSvkM<>Tz+j z2KWFUV@trLg!q~nn&S7F*W?xoL$gv*82eOGl}(> z`Fi?tSt$$oGj1RJ!(Uv$zNzc&EOd@DYmP-eX6xh0pBcNuFXqV6lz)PL1^%qm9h|3l zngta1RX5;V#b!JNwe$2uyPdiU{A7NSJ?V32fy>tvZpNlYXVkom3nwrS=ST_fx_<8% z*1NV>Q@g-c%wO}y_n#8}C0e82nwajQ(rsOBeDNi?Ca)* zA~%&CY*-%PByO%i+}IyGLiH2*uAfD_+usE{N!NPsm@^ zT;fOXNB*`K%=P34v8O10N7CbI%2%xO;H&F3HD(UOda|<4zN_YCmdlE`v9^q({66zG zcrCA~GqA!1C9io+d3-jEXZBf^WIrwUnhsox@%c1g+!xJ->CY&=_J}yo`escBBL0km zOOX$(-q93K{u6Lsc&#t7KhhnByiu&3=lo(c{Q~*Vn7aB=!g<(h)*$YUem$`d2-Dri zZ$*+H%C{)bW+8sf$X9gK6s z-`SnG-fZe4zE(U*L=RAQVseJkO76YJHyco}sb^Gt-Jadq7< z3G1DmvuI!Tc|!Nb!u7CkYdxAen~Qt!G(N3{^MnZ9{mi3pPy>(O&FpC@4u?0xJ%Jy- zi0@R`$$$e1``Nii9#Oowl-(0|V)hK|-)4bc(Bt?%hChs*#pxW^?Mu%-VfQE#u-9%= z`+~C1DZ85T(igc-DxQD+3D&duu%aiq4 z`G%6-r2_NS?c&vQ+6PvD2)mt|cRcM{PE#Y|)vFN6h5BN z3kP}hJEt1LAEN7f)V_8V?64lhQk*`jp5*>wTi<%{u=i#1oJ$hhAxhJITi2Tn4*(aZ z%lPxketX9hk3a1n4p= zkEYI}=d?clDuMBhE!!}E>)jdH$BiZ>kROb@o07E8?vUT3-){Uf`E_MU^ta|z@tlv$ zYBdn|*2JDzx7rS?VQz{Wy}nOZ#ywATAA`KW$HjWiqbz%B#J#=ylsCSve@*AlL)Om; zfaXcgTib2S%i+l%_JZV|{f~7FNb>%u z`=`{Jz1Q3gngX*G{-!xJQuxqySR(z z4?X^3J0^O5$NL}Swr!atKD^}5hZT;_&u#H8Vb&qR->eT~zR_yu<>&l+~0(K?V zpO_a$0Z(3d-M*Rfn)xl=Yt1r$mFKe2$bJ#`0b@=q-aB5)>o{|%Gw~SS2}HL%*x&fj z%fQE;y_W6;9cCi`i=iW+k5@f9JYjrky*xMf#DmyT3+DrSMh#EAS*Mx-4=Z_EQ1jPS z=;zGXw=-e<+0zf<9n)+Y2#uZuH=pAk+|Q=KQW$D_Yvmd3@m|l z&T}rO^MKJ8`G|kBhW4Y0CyXU6!zF0I$>e%*5(*7f4l_Upj;@+Y42jZ@)kPhNJ8(0Nn$ zV<{ZmUqqj^c#m<4O@}}1HODD`KD~zgiGQ3UJBhRJ6F&K$*5s0BhX#S-pWY~5<9d9E z=NxTpHOZeJwuC>}O#weR6Q|*Q)EE~@=Y;7~;SaHVJg6139p^a1Zx7BpTE7{Po9;1P ziv)35Y57+Neq!o$@LGvbbmPg6u1~Zbf44mc3?Kx z$s?0{_A4vwW4aeqrSHo4xq7ruSNp`5%g(YO-ZbS48;KB9yKy+YI@XI_xDxQUa&G`- zGwAnT`~6(V|JJkV5p-`e|9a#(H#lo1d(R^+<_0Qxd*NN8 zdv3xn&baPLt^;e<7*8H$%XdJ|to97^v={tIdFomT%2O%b?}9X*yB42QIGR33aGqj6 z_#$r1->2aG=!~cDF!;4yd*Y-VPm$SUudIS!_}LFU_4fU<$n(Ysf8b(0Pmj2@()PwZ zM)xy1MbrJP^nJvI)vzA$vxg4=u1?Cqz~9W&4Ef3&@fEdyd&Q4SC9-(p!pKX%7dU-8 zLe6Zq1A5G__rPCTo@d{GPR&R2<~yaZUip(C;2=)khJHTxR2eRX@>#-*Yp=btp-Ej7cFm`-bDL%=alsRaD5`l1)RkG!Sa-VK4WqhPrO(@ zmGBOt^_U^2ym9T~W3Bxh_g|4WJK;7VzXw03cz5703eor1#^rv9E2n5x#I@GXJ}v6Q zB_oO+#`b*W`>vfg1^i%@|Ap2^>_x*8YHB6_o`zidlCtt`qBnc;Jt- zok`fvnjeQB%rfr*XQM-JoVRp;YtdG`gV+yi0zc!2+3=syYB}QEKKcZDowxwBiycQ% zZ)_M&erZq_?=d2Oec;R5X9xab!3@arHSIuOk9YnH&wAALiK*FtG4xplonS5-MY$`; z`*t4s&VcpK2Hx1*2>vn~?I*t%8Vq^<-c-~ZNB!VGXUrkUo0q?#czi!Ewcn@%-YWmo zu{b%7ES_~?h@x13*7a*NzeMec<(&%`@c#O`{`dEvDt{P1WyAT8{ZNeTXcz~7@F!8g z+x($8a52S2#HaE7df;a5c~1Bp91Uv5+gSg`lxgsT)xQF*pMXB#UytkBX-w!${(P1a z{dud&Ny;Ve$MOf!I(bx`aoH#faIqIWr+7N_8NK6WoJ@Xs9u1rgkqP^ubMrF!rT1Qn zw;$@kKX#`OqE!c?AI~?L{Biso0DAv?yaahegbyLyhII$dqUuBV!R~ed_*xC(F^*9;C)I}(rg06#m$ZwQ~#-{V&Ev~Ev z&d$iAHM#6$?wC*V8JEKzK9v65oAKKxn7=uA8O4E>2IGmA0a&-<3dcS!zN_JRe_)j< zFNhpDaX%H=z9fI`-hp$KU1K2p!p5DZ{1SB){>&pxEuRwdHnLa-q2@IJ}t-Qb;Opyre1h)<(w z7mCwt3q9-8x!RNN6;-~1UwF%pJ^5a2-bMS6j{kw9jbt>Rx-=cr#ByRR4e>~cUb>(z@1pgY#2ID-d^*CuNBX9G7^dA57IrKfC z8TvR-*~j{4#Cp;FxKBEqx6MptJ?B_^i})!-3YjshvF_|<+mI)nX%muMhy1cb`~BtP z_f$VwfR9+Y8{?U+ClPM*8-N!n2H^Z`$G4+A)o>!Hm4ka%e8!I*ar@>&mX?~8bL=9Tu`GsMaR$OGb!dm^Eq z?2+F9H!-#V`Qd}_5np1@eNX(F_5MUW+GoCo9;ZbS{0?eAj)C3mY%J`vS~sQj7CamJ ztU})-A8Py9kkr`E?c$AhcyL_w5!tt46ZBbmFL{2?(EW|2v%ULz@(1^o9=pk`t!iF& z?im!XBkyB;v*@?rooAUSPmPWWi%FV+(tUp?N@`n|0?xNCXtjvvga5{Vd zKZrY3u}VdN1j;DPMO!^UuRqi;9|bW>dU3DEYRyz3`d@Fo@{_#vqT1uKX~i(@S8E?Yvdoh z+C0pcH>(L;wH|hXzL(+Iu3lF5i=1=kEBkq!&yas#%jx;F3LxBa^*|hphd~s#mHL1> zb$+hNWhb#HIs9SesRAmiU^g#cf#P%uy+;`5-1o5}k4~!bt-^7%?lSuTCsAQD}{z-ac=--Y(SUpWY9hk1RTul*~eLSz*aOHE%oJTHtMWT`*eN zBMbDK)ha<=^Tv(#z?YTVh<>_WZ2p7rSvJR$Pt1Jll8g(x(&VRVTz0Dq{BGTwf_x-a zHpcsi)#@?E6&0t$Kd;B>Wk62z|AYQ?z?aKPSqPt3H$D0Fb$ySWbe}1ijA(pn%-^^| zzw4OCDtg|_M2htpx$JEGNxyqr*XZBTXnl6rTwm2L3&u@Mtw&vM181``<(uX&@%xIF z<27%b0v>LEW47?)vQZY&ca^>m*SvMF&_yM0&dE-BX4DfW_87(iYy>wrx?oW6Ie*%5{ zU_9khSC83e!4cSV;1tg9=B;{O|MDMkuW?3BbCjIcuc=Wir6(SFxpky}SZ?eSR^Rr> z^G&Jp9slYH9# zn5VYO88Omhm*_PRcJNmIz}uYuhu5DP*EEr8)qy2(|d@v zBQX`9oWHL0^PNRK>&7Ut>XNE=*4Fm^uH@Ik<1ekx>7CJ=Kehdds1ulKTb%6lx?hSB zh(jyO*Pi!Wr{An2YJ3)a5;z(K_ncS#oWeIe@4({VA-too1^bZ~?11B#hgl#V=Nr4K zKjn*{UeF_o7NdQ0C8IcX?X#AQx|`50Glu^EZm{^hp7E^1*L=COLl#%yYYV-&MCb4kZXj?%}bb{oh^>`L06AaAtU14nLM0+mz?U4 zdkbGZ1M}xCXL{@v-%RrG=8!8M{^DlJg(qrzFgJU zYz_S7pPsyJR@{jDZQ^>(^V2?__|o-enG@%geo^ok#jVymp$N_wTJANyUXpOB(vI#O z8sAX`(4RN$d`8)CwwmFIuh;!Ev_~8`L1R7fB98r)|~YQbxX}l77tGL7p-XA=8f^L!1`^%{oT3#8S<^z`j4ei8W= zVgCHy9nZdN?k~Ga&EHua=)v0zi94?B;U`m*pR)f1YQNk}asi!?PuSCQ*OZ+7$x6g$ iV*BOqzqrq_T49Jo<17a*PJ!$ce`$Upy`6(zg!~^2kSI_9 literal 0 HcmV?d00001 diff --git a/harmonica/tests/test_oasis.py b/harmonica/tests/test_oasis.py new file mode 100644 index 000000000..54d9bd7cb --- /dev/null +++ b/harmonica/tests/test_oasis.py @@ -0,0 +1,105 @@ +# Copyright (c) 2018 The Harmonica Developers. +# Distributed under the terms of the BSD 3-Clause License. +# SPDX-License-Identifier: BSD-3-Clause +# +# This code is part of the Fatiando a Terra project (https://www.fatiando.org) +# +""" +Test function to read Oasis Montaj© .grd file +""" +from pathlib import Path + +import pytest +import xarray as xr +import xarray.testing as xrt + +from .. import load_oasis_montaj_grid +from .._io.oasis_montaj_grd import ( + _check_ordering, + _check_sign_flag, + _check_uncompressed_grid, +) + +MODULE_DIR = Path(__file__).parent +TEST_DATA_DIR = MODULE_DIR / "data" + + +@pytest.mark.parametrize("ordering", (-1, 1)) +def test_check_ordering_valid(ordering): + """ + Test _check_ordering with valid values + """ + _check_ordering(ordering) + + +@pytest.mark.parametrize("ordering", (-2, 0, 2)) +def test_check_ordering_invalid(ordering): + """ + Test _check_ordering with invalid values + """ + with pytest.raises(NotImplementedError, match="Found an ordering"): + _check_ordering(ordering) + + +@pytest.mark.parametrize("sign_flag", (0, 1, 2)) +def test_check_sign_flag_valid(sign_flag): + """ + Test _check_sign_flag with valid value + """ + _check_sign_flag(sign_flag) + + +def test_check_sign_flag_invalid(): + """ + Test _check_sign_flag with invalid value + """ + with pytest.raises(NotImplementedError, match="colour grids is not"): + _check_sign_flag(3) + + +@pytest.mark.parametrize("n_bytes_per_element", (1, 2, 4, 8)) +def test_check_uncompressed_grid_valid(n_bytes_per_element): + """ + Test _check_uncompressed_grid with valid values + """ + _check_uncompressed_grid(n_bytes_per_element) + + +@pytest.mark.parametrize( + "n_bytes_per_element", (1024 + 1, 1024 + 2, 1024 + 4, 1024 + 8) +) +def test_check_uncompressed_grid_invalid(n_bytes_per_element): + """ + Test _check_uncompressed_grid with invalid values + """ + msg = "Compressed .grd files are not currently supported" + with pytest.raises(NotImplementedError, match=msg): + _check_uncompressed_grid(n_bytes_per_element) + + +class TestOasisMontajGrid: + """ + Test if load_oasis_montaj_grid reads grid properly + """ + + expected_grid = xr.load_dataarray(TEST_DATA_DIR / "om_expected.nc") + + @pytest.mark.parametrize( + "grd_fname", + ( + "om_float.grd", + "om_short.grd", + "om_long.grd", + "om_double.grd", + ), + ) + def test_simple_grid(self, grd_fname): + """ + Test a grid with floats + """ + fname = TEST_DATA_DIR / grd_fname + grid = load_oasis_montaj_grid(fname) + atol = 1e-8 + if "short" in grd_fname: + atol = 1e-3 + xrt.assert_allclose(grid, self.expected_grid, atol=atol) From c3ad104133a6da1533bec0ced560a9167a3902ee Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Wed, 2 Nov 2022 16:14:59 -0700 Subject: [PATCH 12/29] Save the expected netCDF grid using scipy engine This way we avoid having to install netcdf4 for testing --- harmonica/tests/data/om_expected.nc | Bin 31193 -> 21380 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/harmonica/tests/data/om_expected.nc b/harmonica/tests/data/om_expected.nc index 4a009825f501c49275ef2c6baca6a250585ef2c5..3aee32df0421619f6eea3cd158ea21b905666430 100644 GIT binary patch literal 21380 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 From 62a4734b8953f13bfd2871286f878f99520593df Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Wed, 2 Nov 2022 16:44:52 -0700 Subject: [PATCH 13/29] Add test for _check_rotation --- harmonica/tests/test_oasis.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/harmonica/tests/test_oasis.py b/harmonica/tests/test_oasis.py index 54d9bd7cb..5c23369c4 100644 --- a/harmonica/tests/test_oasis.py +++ b/harmonica/tests/test_oasis.py @@ -16,6 +16,7 @@ from .. import load_oasis_montaj_grid from .._io.oasis_montaj_grd import ( _check_ordering, + _check_rotation, _check_sign_flag, _check_uncompressed_grid, ) @@ -41,6 +42,22 @@ def test_check_ordering_invalid(ordering): _check_ordering(ordering) +def test_check_rotation_valid(): + """ + Test _check_rotation with valid value + """ + _check_rotation(0) + + +@pytest.mark.parametrize("rotation", (-60, 30, 90)) +def test_check_rotation_invalid(rotation): + """ + Test _check_rotation with invalid values + """ + with pytest.raises(NotImplementedError, match="The grid is rotated"): + _check_rotation(rotation) + + @pytest.mark.parametrize("sign_flag", (0, 1, 2)) def test_check_sign_flag_valid(sign_flag): """ From e16af7a775c8370efb9539f7fe74c02ef8e87b99 Mon Sep 17 00:00:00 2001 From: LL-Geo <54405391+LL-Geo@users.noreply.github.com> Date: Thu, 3 Nov 2022 09:55:46 +0800 Subject: [PATCH 14/29] Update order=-1 Upload order = -1 and test --- harmonica/tests/data/om_order.grd | Bin 0 -> 20112 bytes harmonica/tests/data/om_order.grd.gi | Bin 0 -> 13824 bytes harmonica/tests/data/om_order.grd.xml | 122 ++++++++++++++++++++++++++ harmonica/tests/test_oasis.py | 1 + 4 files changed, 123 insertions(+) create mode 100644 harmonica/tests/data/om_order.grd create mode 100644 harmonica/tests/data/om_order.grd.gi create mode 100644 harmonica/tests/data/om_order.grd.xml diff --git a/harmonica/tests/data/om_order.grd b/harmonica/tests/data/om_order.grd new file mode 100644 index 0000000000000000000000000000000000000000..3cfa1a1567d0b7e86f9a2e3b84a0aed5f6f65e84 GIT binary patch literal 20112 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 + + + + + + + + + + + om_order + Geosoft Grid + c:\users\22528618\desktop\hm\om\hm_t.gpf + Lu Li + 2022-11-03 + Lu Li + 2022-11-03 + + + + + + + + + + + + + + + + 2022-11-03T09:53:24 + + + + + Lu Li + + + + + + + + + + + + + + + + + + + + + + + + om_order + + + c:\users\22528618\desktop\hm\om\hm_t.gpf + + + + + 2022-11-3 + + + + + + + + + Geosoft Grid + + + + + + + Lu Li + + + + + + + + + Lu Li + + + + + 2022-11-3 + + + + + + + Geosoft + + + &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; +&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;/&gt; + + + + 1 + + + + + + \ No newline at end of file diff --git a/harmonica/tests/test_oasis.py b/harmonica/tests/test_oasis.py index 5c23369c4..820927519 100644 --- a/harmonica/tests/test_oasis.py +++ b/harmonica/tests/test_oasis.py @@ -108,6 +108,7 @@ class TestOasisMontajGrid: "om_short.grd", "om_long.grd", "om_double.grd", + "om_order.grd", ), ) def test_simple_grid(self, grd_fname): From 92135c4ccc49cc821a68e28e3b2f9b7dd0b13df9 Mon Sep 17 00:00:00 2001 From: LL-Geo <54405391+LL-Geo@users.noreply.github.com> Date: Thu, 3 Nov 2022 13:17:50 +0800 Subject: [PATCH 15/29] Update rotate gird --- harmonica/tests/data/om_rotate.grd | Bin 19280 -> 20112 bytes harmonica/tests/data/om_rotate.grd.gi | Bin 15360 -> 15360 bytes harmonica/tests/data/om_rotate.grd.xml | 92 +++++++++++++++++++------ 3 files changed, 71 insertions(+), 21 deletions(-) diff --git a/harmonica/tests/data/om_rotate.grd b/harmonica/tests/data/om_rotate.grd index e4a9bc469a958fcf15dc6367b3c99144c0375120..abdb981fb5fccf4cc8ec225897f185d1dfb8f1c1 100644 GIT binary patch literal 20112 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 AdH?_b literal 19280 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 diff --git a/harmonica/tests/data/om_rotate.grd.gi b/harmonica/tests/data/om_rotate.grd.gi index 03b2a3b20c9df98b78fe7a40f877674217b64713..25ab56bc38594eeed6896fa4ef05efacf313b553 100644 GIT binary patch delta 7225 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 F{tv0faq$2E delta 7181 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 Yv_f(-FV*4M0XeCtj@xDb10Ot3O#lD@ diff --git a/harmonica/tests/data/om_rotate.grd.xml b/harmonica/tests/data/om_rotate.grd.xml index a11d1c853..56dadca8e 100644 --- a/harmonica/tests/data/om_rotate.grd.xml +++ b/harmonica/tests/data/om_rotate.grd.xml @@ -6,19 +6,69 @@ Geosoft Grid c:\users\22528618\desktop\hm\om\hm_t.gpf Lu Li - 2022-10-19 + 2022-11-03 Lu Li - 2022-10-19 + 2022-11-03 - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -26,13 +76,13 @@ - + - - + + @@ -45,7 +95,7 @@ - 2022-10-19T16:42:40 + 2022-11-03T13:17:00 @@ -54,13 +104,13 @@ - + - + - + @@ -82,7 +132,7 @@ - 2022-10-19 + 2022-11-3 @@ -112,7 +162,7 @@ - 2022-10-19 + 2022-11-3 @@ -126,8 +176,8 @@ &lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; &lt;warp type=&quot;TRANS2&quot;&gt; - &lt;warp_point ix=&quot;-21&quot; iy=&quot;-12&quot; ox=&quot;-21&quot; oy=&quot;-12&quot;/&gt; - &lt;warp_point ix=&quot;479&quot; iy=&quot;-12&quot; ox=&quot;229&quot; oy=&quot;-445.0127018922193&quot;/&gt; + &lt;warp_point ix=&quot;1&quot; iy=&quot;-24&quot; ox=&quot;1&quot; oy=&quot;-24&quot;/&gt; + &lt;warp_point ix=&quot;501&quot; iy=&quot;-24&quot; ox=&quot;434.01270189221935&quot; oy=&quot;-274&quot;/&gt; &lt;/warp&gt; &lt;/projection&gt; From ab5d4688fb33c39edd75080d13dd4536451adfc4 Mon Sep 17 00:00:00 2001 From: Lu Li <54405391+LL-Geo@users.noreply.github.com> Date: Mon, 14 Nov 2022 20:45:34 +0800 Subject: [PATCH 16/29] Update compressed grd file Update compressed grd file --- harmonica/_io/oasis_montaj_grd.py | 56 ++++++++++++++++++------------- harmonica/tests/test_oasis.py | 28 ++-------------- 2 files changed, 35 insertions(+), 49 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index e629992bd..6ca8c89bb 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -9,6 +9,7 @@ """ import array +import zlib import numpy as np import xarray as xr @@ -37,8 +38,8 @@ def load_oasis_montaj_grid(fname): .. important:: - This function is not supporting compressed GRD files, rotated grids, - orderings different than ±1, or colour grids. + This function is not supporting orderings different than ±1, + or colour grids. Parameters ---------- @@ -63,11 +64,35 @@ def load_oasis_montaj_grid(fname): _check_ordering(header["ordering"]) _check_rotation(header["rotation"]) _check_sign_flag(header["sign_flag"]) - _check_uncompressed_grid(header["n_bytes_per_element"]) # Get data type for the grid elements data_type = _get_data_type(header["n_bytes_per_element"], header["sign_flag"]) # Read grid - grid = array.array(data_type, grd_file.read()) + grid = grd_file.read() + # Check compressed data + if header["n_bytes_per_element"] > 1024: + # Number of blocks + nb = array.array("i", grid[8 : 8 + 4]) + nb = np.array(nb) + # Number of vectors per block + vpm = array.array("i", grid[12 : 12 + 4]) + vpm = np.array(vpm) + # File offset from start of every block + ob = array.array("q", grid[16 : 16 + nb[0] * 8]) + ob = np.array(ob) + # Compressed size of every block + cbs = array.array("i", grid[16 + nb[0] * 8 : 16 + nb[0] * 8 + nb[0] * 4]) + cbs = np.array(cbs) + # Combine grid + grid_com = b"" + # Read each block + for i in range(0, nb[0]): + # Unexplained 16 byte header + grid_sub = zlib.decompress( + grid[ob[i] - 512 + 16 : cbs[i] + ob[i] - 512], bufsize=zlib.DEF_BUF_SIZE + ) + grid_com = grid_com + grid_sub + grid = grid_com + grid = array.array(data_type, grid) # Convert to numpy array as float64 grid = np.array(grid, dtype=np.float64) # Remove dummy values @@ -220,21 +245,6 @@ def _check_sign_flag(sign_flag): ) -def _check_uncompressed_grid(n_bytes_per_element): - """ - Check if the grid is uncompressed - - If the grid is compressed, then the n_bytes_per_element gets an additional - 1024. - """ - if n_bytes_per_element >= 1024: - raise NotImplementedError( - "Found a 'Grid data element size' (a.k.a. 'ES') value " - + f"of '{n_bytes_per_element}'. " - "Compressed .grd files are not currently supported." - ) - - def _get_data_type(n_bytes_per_element, sign_flag): """ Return the data type for the grid values @@ -251,24 +261,24 @@ def _get_data_type(n_bytes_per_element, sign_flag): "Only values equal to 1, 2, 4 or 8 are valid." ) # Determine the data type of the grid elements - if n_bytes_per_element == 1: + if n_bytes_per_element in {1, 1 + 1024}: if sign_flag == 0: data_type = "B" # unsigned char elif sign_flag == 1: data_type = "b" # signed char - elif n_bytes_per_element == 2: + elif n_bytes_per_element in {2, 2 + 1024}: if sign_flag == 0: data_type = "H" # unsigned short elif sign_flag == 1: data_type = "h" # signed short - elif n_bytes_per_element == 4: + elif n_bytes_per_element in {4, 4 + 1024}: if sign_flag == 0: data_type = "I" # unsigned int elif sign_flag == 1: data_type = "i" # signed int elif sign_flag == 2: data_type = "f" # float - elif n_bytes_per_element == 8: + elif n_bytes_per_element in {8, 8 + 1024}: data_type = "d" return data_type diff --git a/harmonica/tests/test_oasis.py b/harmonica/tests/test_oasis.py index 820927519..26bf97dcd 100644 --- a/harmonica/tests/test_oasis.py +++ b/harmonica/tests/test_oasis.py @@ -14,12 +14,7 @@ import xarray.testing as xrt from .. import load_oasis_montaj_grid -from .._io.oasis_montaj_grd import ( - _check_ordering, - _check_rotation, - _check_sign_flag, - _check_uncompressed_grid, -) +from .._io.oasis_montaj_grd import _check_ordering, _check_rotation, _check_sign_flag MODULE_DIR = Path(__file__).parent TEST_DATA_DIR = MODULE_DIR / "data" @@ -74,26 +69,6 @@ def test_check_sign_flag_invalid(): _check_sign_flag(3) -@pytest.mark.parametrize("n_bytes_per_element", (1, 2, 4, 8)) -def test_check_uncompressed_grid_valid(n_bytes_per_element): - """ - Test _check_uncompressed_grid with valid values - """ - _check_uncompressed_grid(n_bytes_per_element) - - -@pytest.mark.parametrize( - "n_bytes_per_element", (1024 + 1, 1024 + 2, 1024 + 4, 1024 + 8) -) -def test_check_uncompressed_grid_invalid(n_bytes_per_element): - """ - Test _check_uncompressed_grid with invalid values - """ - msg = "Compressed .grd files are not currently supported" - with pytest.raises(NotImplementedError, match=msg): - _check_uncompressed_grid(n_bytes_per_element) - - class TestOasisMontajGrid: """ Test if load_oasis_montaj_grid reads grid properly @@ -109,6 +84,7 @@ class TestOasisMontajGrid: "om_long.grd", "om_double.grd", "om_order.grd", + "om_compress.grd", ), ) def test_simple_grid(self, grd_fname): From 967d6ca825237dfa0cf4ed6c1cb1a9ac71bc29ff Mon Sep 17 00:00:00 2001 From: Lu Li <54405391+LL-Geo@users.noreply.github.com> Date: Mon, 14 Nov 2022 20:55:37 +0800 Subject: [PATCH 17/29] Update check and test --- harmonica/_io/oasis_montaj_grd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 6ca8c89bb..757fa186b 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -254,7 +254,7 @@ def _get_data_type(n_bytes_per_element, sign_flag): https://docs.python.org/3/library/array.html """ # Check if number of bytes per element is valid - if n_bytes_per_element not in (1, 2, 4, 8): + if n_bytes_per_element not in (1, 2, 4, 8, 1024 + 1, 1024 + 2, 1024 + 4, 1024 + 8): raise NotImplementedError( "Found a 'Grid data element size' (a.k.a. 'ES') value " + f"of '{n_bytes_per_element}'. " From 3c8b6e359e30f24b47d425bcedd670a74d152318 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Tue, 15 Nov 2022 11:10:51 -0800 Subject: [PATCH 18/29] Refactor _get_data_type function Define a global variable VALID_ELEMENT_SIZES for the valid values that the ES variable can take. Compare n_bytes_per_element against ints after shifting its value if its greater than 1024 (compressed grid). --- harmonica/_io/oasis_montaj_grd.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 757fa186b..7eee47fc6 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -14,6 +14,10 @@ import numpy as np import xarray as xr +# Define the valid element sizes (ES variable) for GRD files +# (values > 1024 correspond to compressed versions of the grid) +VALID_ELEMENT_SIZES = (1, 2, 4, 8, 1024 + 1, 1024 + 2, 1024 + 4, 1024 + 8) + def load_oasis_montaj_grid(fname): """ @@ -254,31 +258,35 @@ def _get_data_type(n_bytes_per_element, sign_flag): https://docs.python.org/3/library/array.html """ # Check if number of bytes per element is valid - if n_bytes_per_element not in (1, 2, 4, 8, 1024 + 1, 1024 + 2, 1024 + 4, 1024 + 8): + if n_bytes_per_element not in VALID_ELEMENT_SIZES: raise NotImplementedError( "Found a 'Grid data element size' (a.k.a. 'ES') value " + f"of '{n_bytes_per_element}'. " - "Only values equal to 1, 2, 4 or 8 are valid." + "Only values equal to 1, 2, 4 and 8 are valid, " + + "along with their compressed counterparts (1025, 1026, 1028, 1032)." ) + # Shift the n_bytes_per_element in case of compressed grids + if n_bytes_per_element > 1024: + n_bytes_per_element -= 1024 # Determine the data type of the grid elements - if n_bytes_per_element in {1, 1 + 1024}: + if n_bytes_per_element == 1: if sign_flag == 0: data_type = "B" # unsigned char elif sign_flag == 1: data_type = "b" # signed char - elif n_bytes_per_element in {2, 2 + 1024}: + elif n_bytes_per_element == 2: if sign_flag == 0: data_type = "H" # unsigned short elif sign_flag == 1: data_type = "h" # signed short - elif n_bytes_per_element in {4, 4 + 1024}: + elif n_bytes_per_element == 4: if sign_flag == 0: data_type = "I" # unsigned int elif sign_flag == 1: data_type = "i" # signed int elif sign_flag == 2: data_type = "f" # float - elif n_bytes_per_element in {8, 8 + 1024}: + elif n_bytes_per_element == 8: data_type = "d" return data_type From bfe9ffef3da3bc5d7f25897a9b1c61ec3cc3c438 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Tue, 15 Nov 2022 12:00:47 -0800 Subject: [PATCH 19/29] Refactor decompression of grid Move the snippet that decompresses the grid into its own function. Avoid creating numpy arrays that hold a single element for the variables in the additional header. --- harmonica/_io/oasis_montaj_grd.py | 73 +++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 23 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 7eee47fc6..faa2cd612 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -72,30 +72,10 @@ def load_oasis_montaj_grid(fname): data_type = _get_data_type(header["n_bytes_per_element"], header["sign_flag"]) # Read grid grid = grd_file.read() - # Check compressed data + # Decompress grid if needed if header["n_bytes_per_element"] > 1024: - # Number of blocks - nb = array.array("i", grid[8 : 8 + 4]) - nb = np.array(nb) - # Number of vectors per block - vpm = array.array("i", grid[12 : 12 + 4]) - vpm = np.array(vpm) - # File offset from start of every block - ob = array.array("q", grid[16 : 16 + nb[0] * 8]) - ob = np.array(ob) - # Compressed size of every block - cbs = array.array("i", grid[16 + nb[0] * 8 : 16 + nb[0] * 8 + nb[0] * 4]) - cbs = np.array(cbs) - # Combine grid - grid_com = b"" - # Read each block - for i in range(0, nb[0]): - # Unexplained 16 byte header - grid_sub = zlib.decompress( - grid[ob[i] - 512 + 16 : cbs[i] + ob[i] - 512], bufsize=zlib.DEF_BUF_SIZE - ) - grid_com = grid_com + grid_sub - grid = grid_com + grid = _decompress_grid(grid) + # Load the grid values as an array with the proper data_type grid = array.array(data_type, grid) # Convert to numpy array as float64 grid = np.array(grid, dtype=np.float64) @@ -313,6 +293,53 @@ def _remove_dummies(grid, data_type): return grid +def _decompress_grid(grid_compressed): + """ + Decompress the grid using gzip + + Even if the header specifies that the grid is compressed using a LZRW1 + algorithm, it's using gzip instead. The first two 4 bytes sequences + correspond to the compression signature and + to the compression type. We are going to ignore those and start reading + from the number of blocks (offset 8). + + Parameters + ---------- + grid_compressed : bytes + Sequence of bytes corresponding to the compressed grid. They should be + every byte starting from offset 512 of the GRD file until its end. + + Returns + ------- + grid : bytes + Uncompressed version of the ``grid_compressed`` parameter. + """ + # Number of blocks + (n_blocks,) = array.array("i", grid_compressed[8 : 8 + 4]) + # Number of vectors per block + (vectors_per_block,) = array.array("i", grid_compressed[12 : 12 + 4]) + # File offset from start of every block + (block_offset,) = array.array("q", grid_compressed[16 : 16 + n_blocks * 8]) + # Compressed size of every block + (block_size,) = array.array( + "i", + grid_compressed[16 + n_blocks * 8 : 16 + n_blocks * 8 + n_blocks * 4], + ) + # Combine grid + grid = b"" + # Read each block + for i in range(n_blocks): + # Unexplained 16 byte header + start_offset = block_offset - 512 + 16 + end_offset = block_size + block_offset - 512 + grid_sub = zlib.decompress( + grid_compressed[start_offset:end_offset], + bufsize=zlib.DEF_BUF_SIZE, + ) + grid += grid_sub + return grid + + def _build_coordinates(west, south, shape, spacing): """ Create the coordinates for the grid From 29fe1eb3a6210669e514b8ce09c114df5e226988 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Tue, 15 Nov 2022 12:02:36 -0800 Subject: [PATCH 20/29] Move dummies to a global variable --- harmonica/_io/oasis_montaj_grd.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index faa2cd612..c2d30f401 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -17,6 +17,17 @@ # Define the valid element sizes (ES variable) for GRD files # (values > 1024 correspond to compressed versions of the grid) VALID_ELEMENT_SIZES = (1, 2, 4, 8, 1024 + 1, 1024 + 2, 1024 + 4, 1024 + 8) +# Define dummy values for each data type +DUMMIES = { + "b": -127, + "B": 255, + "h": -32767, + "H": 65535, + "i": -2147483647, + "I": 4294967295, + "f": -1e32, + "d": -1e32, +} def load_oasis_montaj_grid(fname): @@ -276,20 +287,10 @@ def _remove_dummies(grid, data_type): Replace dummy values for NaNs """ # Create dictionary with dummy value for each data type - dummies = { - "b": -127, - "B": 255, - "h": -32767, - "H": 65535, - "i": -2147483647, - "I": 4294967295, - "f": -1e32, - "d": -1e32, - } if data_type in ("f", "d"): - grid[grid <= dummies[data_type]] = np.nan + grid[grid <= DUMMIES[data_type]] = np.nan return grid - grid[grid == dummies[data_type]] = np.nan + grid[grid == DUMMIES[data_type]] = np.nan return grid From 3af3e72b9b00459aeb2bceee7a8b815ca4f14a6f Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Tue, 15 Nov 2022 14:13:19 -0800 Subject: [PATCH 21/29] Fix bad refactor The previous refactor didn't worked with compressed grids with multiple blocks. Restored the compressed_blocK_sizes and block_offsets as arrays and fixed the for loop. --- harmonica/_io/oasis_montaj_grd.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index c2d30f401..47fd09616 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -320,9 +320,9 @@ def _decompress_grid(grid_compressed): # Number of vectors per block (vectors_per_block,) = array.array("i", grid_compressed[12 : 12 + 4]) # File offset from start of every block - (block_offset,) = array.array("q", grid_compressed[16 : 16 + n_blocks * 8]) + block_offsets = array.array("q", grid_compressed[16 : 16 + n_blocks * 8]) # Compressed size of every block - (block_size,) = array.array( + compressed_block_sizes = array.array( "i", grid_compressed[16 + n_blocks * 8 : 16 + n_blocks * 8 + n_blocks * 4], ) @@ -330,13 +330,17 @@ def _decompress_grid(grid_compressed): grid = b"" # Read each block for i in range(n_blocks): - # Unexplained 16 byte header - start_offset = block_offset - 512 + 16 - end_offset = block_size + block_offset - 512 + # Define the start and end offsets for each compressed blocks + # We need to remove the 512 to account for the missing header. + # There is an unexplained 16 byte header that we also need to remove. + start_offset = block_offsets[i] - 512 + 16 + end_offset = compressed_block_sizes[i] + block_offsets[i] - 512 + # Decompress the block grid_sub = zlib.decompress( grid_compressed[start_offset:end_offset], bufsize=zlib.DEF_BUF_SIZE, ) + # Add it to the running grid grid += grid_sub return grid From d8016d67667dadd6358b361288345394ba1cd221 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Tue, 15 Nov 2022 14:20:04 -0800 Subject: [PATCH 22/29] Acknowledge Loop3D in the source file and docstring --- harmonica/_io/oasis_montaj_grd.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 47fd09616..1a6cac6bf 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -4,6 +4,9 @@ # # This code is part of the Fatiando a Terra project (https://www.fatiando.org) # +# The support for compressed grids was inspired by the code in +# https://github.com/Loop3D/geosoft_grid copyrighted by Loop3D and released +# under the MIT License. """ Function to read Oasis Montaj© .grd file """ @@ -70,6 +73,8 @@ def load_oasis_montaj_grid(fname): References ---------- https://help.seequent.com/Oasis-montaj/9.9/en/Content/ss/glossary/grid_file_format__grd.htm + + https://github.com/Loop3D/geosoft_grid """ # Read the header and the grid array with open(fname, "rb") as grd_file: From 84ee1f164a978ebd20b854d0f58ab359532f21b0 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Tue, 15 Nov 2022 14:23:39 -0800 Subject: [PATCH 23/29] Configure flake8 to ignore spaces before a colon Flake8 complains with leaving a space before a color, what makes sense for colons that go after a statement (function definition, for loop, if, etc). But it complains about the spaces before a colon used in slicing. Black already handles the first case, so it makes sense to ignore E203. --- harmonica/_io/oasis_montaj_grd.py | 16 +++++++--------- setup.cfg | 2 ++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 1a6cac6bf..5ad2a8127 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -154,7 +154,7 @@ def _read_header(header_bytes): """ header = {} # Read data storage - ES, SF, NE, NV, KX = array.array("i", header_bytes[0 : 16 + 4]) # noqa: E203, N806 + ES, SF, NE, NV, KX = array.array("i", header_bytes[0 : 16 + 4]) # noqa: N806 header.update( { "n_bytes_per_element": ES, @@ -165,9 +165,7 @@ def _read_header(header_bytes): } ) # Read geographic info - DE, DV, X0, Y0, ROT = array.array( # noqa: N806 - "d", header_bytes[20 : 52 + 8] # noqa: E203 - ) + DE, DV, X0, Y0, ROT = array.array("d", header_bytes[20 : 52 + 8]) # noqa: N806 header.update( { "spacing_e": DE, @@ -178,7 +176,7 @@ def _read_header(header_bytes): } ) # Read data scaling - ZBASE, ZMULT = array.array("d", header_bytes[60 : 68 + 8]) # noqa: E203, N806 + ZBASE, ZMULT = array.array("d", header_bytes[60 : 68 + 8]) # noqa: N806 header.update( { "base_value": ZBASE, @@ -188,13 +186,13 @@ def _read_header(header_bytes): # Read optional parameters # (ignore map LABEL and MAPNO) PROJ, UNITX, UNITY, UNITZ, NVPTS = array.array( # noqa: N806 - "i", header_bytes[140 : 156 + 4] # noqa: E203 + "i", header_bytes[140 : 156 + 4] ) IZMIN, IZMAX, IZMED, IZMEA = array.array( # noqa: N806 - "f", header_bytes[160 : 172 + 4] # noqa: E203 + "f", header_bytes[160 : 172 + 4] ) - (ZVAR,) = array.array("d", header_bytes[176 : 176 + 8]) # noqa: E203, N806 - (PRCS,) = array.array("i", header_bytes[184 : 184 + 4]) # noqa: E203, N806 + (ZVAR,) = array.array("d", header_bytes[176 : 176 + 8]) # noqa: N806 + (PRCS,) = array.array("i", header_bytes[184 : 184 + 4]) # noqa: N806 header.update( { "map_projection": PROJ, diff --git a/setup.cfg b/setup.cfg index 0f595c1e4..18972394d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -71,6 +71,8 @@ ignore = E741, # Line break before binary operator (conflicts with black) W503, + # Ignore spaces before a colon (Black handles it) + E203, exclude = .git, __pycache__, From 2444d78585ade8f31137e73efd5198f9eef02bdd Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Thu, 17 Nov 2022 09:44:42 -0800 Subject: [PATCH 24/29] Add support for rotated grids --- harmonica/_io/oasis_montaj_grd.py | 75 ++++++++++++++++++++++++------- harmonica/tests/test_oasis.py | 43 ++++++++++-------- 2 files changed, 83 insertions(+), 35 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 5ad2a8127..c999d7c2a 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -82,7 +82,6 @@ def load_oasis_montaj_grid(fname): header = _read_header(grd_file.read(512)) # Check for valid flags _check_ordering(header["ordering"]) - _check_rotation(header["rotation"]) _check_sign_flag(header["sign_flag"]) # Get data type for the grid elements data_type = _get_data_type(header["n_bytes_per_element"], header["sign_flag"]) @@ -110,12 +109,19 @@ def load_oasis_montaj_grid(fname): spacing = (header["spacing_e"], header["spacing_v"]) grid = grid.reshape(shape, order=order) # Build coords - easting, northing = _build_coordinates( - header["x_origin"], header["y_origin"], shape, spacing - ) + if header["rotation"] == 0: + easting, northing = _build_coordinates( + header["x_origin"], header["y_origin"], shape, spacing + ) + dims = ("northing", "easting") + coords = {"easting": easting, "northing": northing} + else: + easting, northing = _build_rotated_coordinates( + header["x_origin"], header["y_origin"], shape, spacing, header["rotation"] + ) + dims = ("y", "x") + coords = {"easting": (dims, easting), "northing": (dims, northing)} # Build an xarray.DataArray for the grid - dims = ("northing", "easting") - coords = {"easting": easting, "northing": northing} grid = xr.DataArray( grid, coords=coords, @@ -222,17 +228,6 @@ def _check_ordering(ordering): ) -def _check_rotation(rotation): - """ - Check if the rotation value is the one we are supporting - """ - if rotation != 0: - raise NotImplementedError( - f"The grid is rotated '{rotation}' degrees. " - + "Only unrotated grids are supported." - ) - - def _check_sign_flag(sign_flag): """ Check if sign_flag value is within the ones we are supporting @@ -379,3 +374,49 @@ def _build_coordinates(west, south, shape, spacing): easting = np.linspace(west, west + spacing[1] * (shape[1] - 1), shape[1]) northing = np.linspace(south, south + spacing[0] * (shape[0] - 1), shape[0]) return easting, northing + + +def _build_rotated_coordinates(west, south, shape, spacing, rotation_deg): + """ + Create the coordinates for a rotated grid + + Generates 2d arrays for the easting and northing coordinates of the grid. + Assumes rotated grids. + + Parameters + ---------- + west : float + Westernmost coordinate of the grid. + south : float + Southernmost coordinate of the grid. + shape : tuple + Tuple of ints containing the number of elements along each unrotated + direction in the following order: ``n_y``, ``n_x`` + spacing : tuple + Tuple of floats containing the distance between adjacent grid elements + along each unrotated direction in the following order: ``spacing_y``, + ``spacing_x``. + + Returns + ------- + easting : 2d-array + Array containing the values of the easting coordinates of the grid. + northing : 2d-array + Array containing the values of the northing coordinates of the grid. + + Notes + ----- + The ``x`` and ``y`` coordinates are the abscissa and the ordinate of the + unrotated grid before the translation, respectively. + """ + # Define the grid coordinates before the rotation + x = np.linspace(0, spacing[1] * (shape[1] - 1), shape[1]) + y = np.linspace(0, spacing[0] * (shape[0] - 1), shape[0]) + # Compute a meshgrid + x, y = np.meshgrid(x, y) + # Rotate and shift to get easting and northing + cos = np.cos(np.radians(rotation_deg)) + sin = np.sqrt(1 - cos**2) + easting = west + x * cos + y * sin + northing = south - x * sin + y * cos + return easting, northing diff --git a/harmonica/tests/test_oasis.py b/harmonica/tests/test_oasis.py index 26bf97dcd..f875750f6 100644 --- a/harmonica/tests/test_oasis.py +++ b/harmonica/tests/test_oasis.py @@ -9,12 +9,14 @@ """ from pathlib import Path +import numpy as np +import numpy.testing as npt import pytest import xarray as xr import xarray.testing as xrt from .. import load_oasis_montaj_grid -from .._io.oasis_montaj_grd import _check_ordering, _check_rotation, _check_sign_flag +from .._io.oasis_montaj_grd import _check_ordering, _check_sign_flag MODULE_DIR = Path(__file__).parent TEST_DATA_DIR = MODULE_DIR / "data" @@ -37,22 +39,6 @@ def test_check_ordering_invalid(ordering): _check_ordering(ordering) -def test_check_rotation_valid(): - """ - Test _check_rotation with valid value - """ - _check_rotation(0) - - -@pytest.mark.parametrize("rotation", (-60, 30, 90)) -def test_check_rotation_invalid(rotation): - """ - Test _check_rotation with invalid values - """ - with pytest.raises(NotImplementedError, match="The grid is rotated"): - _check_rotation(rotation) - - @pytest.mark.parametrize("sign_flag", (0, 1, 2)) def test_check_sign_flag_valid(sign_flag): """ @@ -75,6 +61,7 @@ class TestOasisMontajGrid: """ expected_grid = xr.load_dataarray(TEST_DATA_DIR / "om_expected.nc") + atol = 1e-8 @pytest.mark.parametrize( "grd_fname", @@ -93,7 +80,27 @@ def test_simple_grid(self, grd_fname): """ fname = TEST_DATA_DIR / grd_fname grid = load_oasis_montaj_grid(fname) - atol = 1e-8 + atol = self.atol if "short" in grd_fname: atol = 1e-3 xrt.assert_allclose(grid, self.expected_grid, atol=atol) + + def test_rotated_grid(self): + """ + Test loading a rotated grid + """ + fname = TEST_DATA_DIR / "om_rotate.grd" + grid = load_oasis_montaj_grid(fname) + # Check if the rotation angle was correctly read + assert grid.attrs["rotation"] == -30 + # Check if the values in the grid are the same as the expected grid + npt.assert_allclose(grid.values, self.expected_grid, atol=self.atol) + # Check origin of the rotated coordinates + npt.assert_allclose(grid.easting[0, 0], grid.attrs["x_origin"]) + npt.assert_allclose(grid.northing[0, 0], grid.attrs["y_origin"]) + # Check if we can recover the rotation angle from the coordinates + west, east = grid.easting[:, 0], grid.easting[:, -1] + south, north = grid.northing[:, 0], grid.northing[:, -1] + npt.assert_allclose( + grid.rotation, np.degrees(np.arctan((north - south) / (east - west))) + ) From 96042a9d57168cb08d4caf1b976acc043d0b8b63 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Thu, 17 Nov 2022 09:53:07 -0800 Subject: [PATCH 25/29] Simplify how header variables are read --- harmonica/_io/oasis_montaj_grd.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index c999d7c2a..9f2158ac4 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -160,7 +160,7 @@ def _read_header(header_bytes): """ header = {} # Read data storage - ES, SF, NE, NV, KX = array.array("i", header_bytes[0 : 16 + 4]) # noqa: N806 + ES, SF, NE, NV, KX = array.array("i", header_bytes[0 : 5 * 4]) # noqa: N806 header.update( { "n_bytes_per_element": ES, @@ -171,7 +171,7 @@ def _read_header(header_bytes): } ) # Read geographic info - DE, DV, X0, Y0, ROT = array.array("d", header_bytes[20 : 52 + 8]) # noqa: N806 + DE, DV, X0, Y0, ROT = array.array("d", header_bytes[20 : 20 + 5 * 8]) # noqa: N806 header.update( { "spacing_e": DE, @@ -182,7 +182,7 @@ def _read_header(header_bytes): } ) # Read data scaling - ZBASE, ZMULT = array.array("d", header_bytes[60 : 68 + 8]) # noqa: N806 + ZBASE, ZMULT = array.array("d", header_bytes[60 : 60 + 2 * 8]) # noqa: N806 header.update( { "base_value": ZBASE, @@ -192,10 +192,10 @@ def _read_header(header_bytes): # Read optional parameters # (ignore map LABEL and MAPNO) PROJ, UNITX, UNITY, UNITZ, NVPTS = array.array( # noqa: N806 - "i", header_bytes[140 : 156 + 4] + "i", header_bytes[140 : 140 + 5 * 4] ) IZMIN, IZMAX, IZMED, IZMEA = array.array( # noqa: N806 - "f", header_bytes[160 : 172 + 4] + "f", header_bytes[160 : 160 + 4 * 4] ) (ZVAR,) = array.array("d", header_bytes[176 : 176 + 8]) # noqa: N806 (PRCS,) = array.array("i", header_bytes[184 : 184 + 4]) # noqa: N806 From a9c3522c7fd84809f5d9364b63d798ec5772f43d Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Thu, 17 Nov 2022 11:57:51 -0800 Subject: [PATCH 26/29] Include om_byte.grd in the test suite --- harmonica/tests/test_oasis.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/harmonica/tests/test_oasis.py b/harmonica/tests/test_oasis.py index f875750f6..b1193acfe 100644 --- a/harmonica/tests/test_oasis.py +++ b/harmonica/tests/test_oasis.py @@ -70,6 +70,7 @@ class TestOasisMontajGrid: "om_short.grd", "om_long.grd", "om_double.grd", + "om_byte.grd", "om_order.grd", "om_compress.grd", ), @@ -83,6 +84,8 @@ def test_simple_grid(self, grd_fname): atol = self.atol if "short" in grd_fname: atol = 1e-3 + if "byte" in grd_fname: + atol = 0.15 xrt.assert_allclose(grid, self.expected_grid, atol=atol) def test_rotated_grid(self): From cbceadf0223bd15236a7478ea843088bea6f2035 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Thu, 17 Nov 2022 12:04:29 -0800 Subject: [PATCH 27/29] Removed unused sample grd files Remove all the sample grids that weren't being used in the test suite. --- harmonica/tests/data/om_geotiff.tif | Bin 65973 -> 0 bytes harmonica/tests/data/om_small_compress.grd | Bin 585 -> 0 bytes harmonica/tests/data/om_small_compress.grd.gi | Bin 13312 -> 0 bytes .../tests/data/om_small_compress.grd.xml | 134 ------------------ harmonica/tests/data/om_small_double.grd | Bin 712 -> 0 bytes harmonica/tests/data/om_small_double.grd.gi | Bin 13312 -> 0 bytes harmonica/tests/data/om_small_double.grd.xml | 134 ------------------ 7 files changed, 268 deletions(-) delete mode 100644 harmonica/tests/data/om_geotiff.tif delete mode 100644 harmonica/tests/data/om_small_compress.grd delete mode 100644 harmonica/tests/data/om_small_compress.grd.gi delete mode 100644 harmonica/tests/data/om_small_compress.grd.xml delete mode 100644 harmonica/tests/data/om_small_double.grd delete mode 100644 harmonica/tests/data/om_small_double.grd.gi delete mode 100644 harmonica/tests/data/om_small_double.grd.xml diff --git a/harmonica/tests/data/om_geotiff.tif b/harmonica/tests/data/om_geotiff.tif deleted file mode 100644 index f3e33cf294805b565754bcc8e81388ba0fa9da47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65973 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 L!(RWt*T??=guqv= diff --git a/harmonica/tests/data/om_small_compress.grd.xml b/harmonica/tests/data/om_small_compress.grd.xml deleted file mode 100644 index 7ec04e739..000000000 --- a/harmonica/tests/data/om_small_compress.grd.xml +++ /dev/null @@ -1,134 +0,0 @@ - - - - - om_small_compress - Geosoft Grid - c:\users\22528618\desktop\hm\om\hm_t.gpf - Lu Li - 2022-10-19 - Lu Li - 2022-10-19 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2022-10-19T17:00:32 - - - - - Lu Li - - - - - - - - - - - - - - - - - - - - - - - - om_small_compress - - - c:\users\22528618\desktop\hm\om\hm_t.gpf - - - - - 2022-10-19 - - - - - - - - - Geosoft Grid - - - - - - - Lu Li - - - - - - - - - Lu Li - - - - - 2022-10-19 - - - - - - - Geosoft - - - &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; -&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; - &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; -&lt;/projection&gt; - - - - 1 - - - - - - \ No newline at end of file diff --git a/harmonica/tests/data/om_small_double.grd b/harmonica/tests/data/om_small_double.grd deleted file mode 100644 index 715d68a7491804afa20520b980ed7dc869be1066..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 712 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 R*ebk_A36B&+5b5^{9j36Lc;(6 diff --git a/harmonica/tests/data/om_small_double.grd.xml b/harmonica/tests/data/om_small_double.grd.xml deleted file mode 100644 index b5fe8781d..000000000 --- a/harmonica/tests/data/om_small_double.grd.xml +++ /dev/null @@ -1,134 +0,0 @@ - - - - - om_small_double - Geosoft Grid - c:\users\22528618\desktop\hm\om\hm_t.gpf - Lu Li - 2022-10-19 - Lu Li - 2022-10-19 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2022-10-19T17:01:14 - - - - - Lu Li - - - - - - - - - - - - - - - - - - - - - - - - om_small_double - - - c:\users\22528618\desktop\hm\om\hm_t.gpf - - - - - 2022-10-19 - - - - - - - - - Geosoft Grid - - - - - - - Lu Li - - - - - - - - - Lu Li - - - - - 2022-10-19 - - - - - - - Geosoft - - - &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; -&lt;projection type=&quot;UNKNOWN&quot; xmlns=&quot;http://www.geosoft.com/schema/geo&quot;&gt; - &lt;units name=&quot;m&quot; unit_scale=&quot;1&quot;/&gt; -&lt;/projection&gt; - - - - 1 - - - - - - \ No newline at end of file From 256b615749f6a57b32a565137664103e15b3aab2 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Mon, 21 Nov 2022 07:18:13 -0800 Subject: [PATCH 28/29] Fix bug in creation of the rotated coordinates Use proper sin function and fix the sign of the coefficients in the rotation matrix. --- harmonica/_io/oasis_montaj_grd.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index 9f2158ac4..d4a51a105 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -415,8 +415,8 @@ def _build_rotated_coordinates(west, south, shape, spacing, rotation_deg): # Compute a meshgrid x, y = np.meshgrid(x, y) # Rotate and shift to get easting and northing - cos = np.cos(np.radians(rotation_deg)) - sin = np.sqrt(1 - cos**2) - easting = west + x * cos + y * sin - northing = south - x * sin + y * cos + rotation_rad = np.radians(rotation_deg) + cos, sin = np.cos(rotation_rad), np.sin(rotation_rad) + easting = west + x * cos - y * sin + northing = south + x * sin + y * cos return easting, northing From 53a5e235e2f5c0f4b3fe92da1ee208bcd03d0700 Mon Sep 17 00:00:00 2001 From: Santiago Soler Date: Fri, 25 Nov 2022 11:12:20 -0800 Subject: [PATCH 29/29] Add missing docstring for rotation_deg parameter Co-authored with @mdtanker --- harmonica/_io/oasis_montaj_grd.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/harmonica/_io/oasis_montaj_grd.py b/harmonica/_io/oasis_montaj_grd.py index d4a51a105..80eb2f067 100644 --- a/harmonica/_io/oasis_montaj_grd.py +++ b/harmonica/_io/oasis_montaj_grd.py @@ -381,7 +381,6 @@ def _build_rotated_coordinates(west, south, shape, spacing, rotation_deg): Create the coordinates for a rotated grid Generates 2d arrays for the easting and northing coordinates of the grid. - Assumes rotated grids. Parameters ---------- @@ -396,6 +395,9 @@ def _build_rotated_coordinates(west, south, shape, spacing, rotation_deg): Tuple of floats containing the distance between adjacent grid elements along each unrotated direction in the following order: ``spacing_y``, ``spacing_x``. + rotation_deg : float + Grid rotation angle in degrees. Defined relative to the co-ordinate + system axis and counter clockwise. Returns -------