From 16d92400147a4617fe86ede972bd81402d8198ed Mon Sep 17 00:00:00 2001 From: Wei Ji Date: Fri, 26 Jun 2020 01:19:13 +1200 Subject: [PATCH] Autodetect grid type as Cartesian or Geographic coordinate system Keep the default as Cartesian, but allow for either Cartesian (c) or Geographic (g) coordinate system grid types. Test case based on https://github.com/GenericMappingTools/pygmt/issues/375#issuecomment-552141105. --- pygmt/base_plotting.py | 17 +++-- pygmt/clib/session.py | 60 ++++++++++++------ pygmt/helpers/decorators.py | 5 ++ pygmt/modules.py | 5 +- pygmt/sampling.py | 13 +++- .../baseline/test_gridimage_over_dateline.png | Bin 0 -> 34252 bytes pygmt/tests/test_grdimage.py | 36 +++++++++++ 7 files changed, 106 insertions(+), 30 deletions(-) create mode 100644 pygmt/tests/baseline/test_gridimage_over_dateline.png diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 85aae6425fc..427c0855bee 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -228,7 +228,7 @@ def colorbar(self, **kwargs): W="pen", ) @kwargs_to_strings(R="sequence", L="sequence", A="sequence_plus") - def grdcontour(self, grid, registration=None, **kwargs): + def grdcontour(self, grid, coord_sys=None, registration=None, **kwargs): """ Convert grids or images to contours and plot them on maps @@ -275,6 +275,7 @@ def grdcontour(self, grid, registration=None, **kwargs): {G} {U} {W} + {coord_sys} {r} """ kwargs = self._preprocess(**kwargs) @@ -283,7 +284,7 @@ def grdcontour(self, grid, registration=None, **kwargs): if kind == "file": file_context = dummy_context(grid) elif kind == "grid": - file_context = lib.virtualfile_from_grid(grid, registration) + file_context = lib.virtualfile_from_grid(grid, coord_sys, registration) else: raise GMTInvalidInput("Unrecognized data type: {}".format(type(grid))) with file_context as fname: @@ -293,7 +294,7 @@ def grdcontour(self, grid, registration=None, **kwargs): @fmt_docstring @use_alias(R="region", J="projection", W="pen", B="frame", I="shading", C="cmap") @kwargs_to_strings(R="sequence") - def grdimage(self, grid, registration=None, **kwargs): + def grdimage(self, grid, coord_sys=None, registration=None, **kwargs): """ Project grids or images and plot them on maps. @@ -307,6 +308,7 @@ def grdimage(self, grid, registration=None, **kwargs): ---------- grid : str or xarray.DataArray The file name of the input grid or the grid loaded as a DataArray. + {coord_sys} {r} """ kwargs = self._preprocess(**kwargs) @@ -315,7 +317,7 @@ def grdimage(self, grid, registration=None, **kwargs): if kind == "file": file_context = dummy_context(grid) elif kind == "grid": - file_context = lib.virtualfile_from_grid(grid, registration) + file_context = lib.virtualfile_from_grid(grid, coord_sys, registration) else: raise GMTInvalidInput("Unrecognized data type: {}".format(type(grid))) with file_context as fname: @@ -339,7 +341,7 @@ def grdimage(self, grid, registration=None, **kwargs): p="perspective", ) @kwargs_to_strings(R="sequence", p="sequence") - def grdview(self, grid, registration=None, **kwargs): + def grdview(self, grid, coord_sys=None, registration=None, **kwargs): """ Create 3-D perspective image or surface mesh from a grid. @@ -403,6 +405,7 @@ def grdview(self, grid, registration=None, **kwargs): perspective : list or str ``'[x|y|z]azim[/elev[/zlevel]][+wlon0/lat0[/z0]][+vx0/y0]'``. Select perspective view. + {coord_sys} {r} """ kwargs = self._preprocess(**kwargs) @@ -411,7 +414,7 @@ def grdview(self, grid, registration=None, **kwargs): if kind == "file": file_context = dummy_context(grid) elif kind == "grid": - file_context = lib.virtualfile_from_grid(grid, registration) + file_context = lib.virtualfile_from_grid(grid, coord_sys, registration) else: raise GMTInvalidInput(f"Unrecognized data type for grid: {type(grid)}") @@ -422,7 +425,7 @@ def grdview(self, grid, registration=None, **kwargs): if data_kind(drapegrid) in ("file", "grid"): if data_kind(drapegrid) == "grid": drape_context = lib.virtualfile_from_grid( - drapegrid, registration + drapegrid, coord_sys, registration ) drapefile = stack.enter_context(drape_context) kwargs["G"] = drapefile diff --git a/pygmt/clib/session.py b/pygmt/clib/session.py index 4eef5dc707e..aee21e7eff4 100644 --- a/pygmt/clib/session.py +++ b/pygmt/clib/session.py @@ -1174,7 +1174,7 @@ def virtualfile_from_matrix(self, matrix): yield vfile @contextmanager - def virtualfile_from_grid(self, grid, registration=None): + def virtualfile_from_grid(self, grid, coord_sys=None, registration=None): """ Store a grid in a virtual file. @@ -1201,6 +1201,9 @@ def virtualfile_from_grid(self, grid, registration=None): ---------- grid : :class:`xarray.DataArray` The grid that will be included in the virtual file. + coord_sys : str or None + Use a Cartesian (c) or Geographic (g) coordinate system. Default is + auto (None), with a fallback to Cartesian (c). registration : str or None ``[g|p]`` Use gridline (g) or pixel (p) node registration to make the virtual @@ -1237,29 +1240,48 @@ def virtualfile_from_grid(self, grid, registration=None): >>> # The output is: w e s n z0 z1 dx dy n_columns n_rows """ - if registration is None: + try: + coord_sys_dict = { + None: "GMT_GRID_IS_CARTESIAN", # Default to Cartesian + "c": "GMT_GRID_IS_CARTESIAN", + "g": "GMT_GRID_IS_GEO", + } + _coord_sys = coord_sys_dict[coord_sys] + except KeyError: + raise GMTInvalidInput( + "The coord_sys argument should be either 'c', 'g', or None (auto)" + ) + + try: + registration_dict = { + None: "GMT_GRID_NODE_REG", # Default to gridline registration + "g": "GMT_GRID_NODE_REG", + "p": "GMT_GRID_PIXEL_REG", + } + _registration = registration_dict[registration] + except KeyError: + raise GMTInvalidInput( + "Invalid registration type, must be either 'g', 'p', or None (auto)" + ) + + if coord_sys is None or registration is None: # Automatically detect whether the NetCDF source of an - # xarray.DataArray grid uses gridline or pixel registration. - # Defaults to gridline if grdinfo cannot find any source file. - registration = "GMT_GRID_NODE_REG" # default to gridline registration + # xarray.DataArray grid uses a Cartesian or Geographic coordinate + # system, and whether it is gridline or pixel registered. try: gridfile = grid.encoding["source"] with GMTTempFile() as gridinfotext: arg_str = " ".join([gridfile, "->" + gridinfotext.name]) self.call_module("grdinfo", arg_str) - if "Pixel node registration used" in gridinfotext.read(): - registration = "GMT_GRID_PIXEL_REG" + if coord_sys is None and "[Geographic grid]" in gridinfotext.read(): + _coord_sys = "GMT_GRID_IS_GEO" + if ( + registration is None + and "Pixel node registration used" in gridinfotext.read() + ): + _registration = "GMT_GRID_PIXEL_REG" except KeyError: pass - else: - if registration == "g": - registration = "GMT_GRID_NODE_REG" - elif registration == "p": - registration = "GMT_GRID_PIXEL_REG" - else: - raise GMTInvalidInput( - "Invalid registration type, must be either 'g', 'p', or None (auto)" - ) # Conversion to a C-contiguous array needs to be done here and not in # put_matrix because we need to maintain a reference to the copy while @@ -1267,7 +1289,7 @@ def virtualfile_from_grid(self, grid, registration=None): # collected and the memory freed. Creating it in this context manager # guarantees that the copy will be around until the virtual file is # closed. The conversion is implicit in dataarray_to_matrix. - matrix, region, inc = dataarray_to_matrix(grid, registration) + matrix, region, inc = dataarray_to_matrix(grid, _registration) if Version(self.info["version"]) < Version("6.1.0"): # Avoid crashing PyGMT because GMT < 6.1.0's C API cannot handle @@ -1280,10 +1302,10 @@ def virtualfile_from_grid(self, grid, registration=None): gmt_grid = self.create_data( family, geometry, - mode="GMT_CONTAINER_ONLY|GMT_GRID_IS_CARTESIAN", + mode=f"GMT_CONTAINER_ONLY|{_coord_sys}", ranges=region, inc=inc, - registration=registration, + registration=_registration, ) self.put_matrix(gmt_grid, matrix) args = (family, geometry, "GMT_IN|GMT_IS_REFERENCE", gmt_grid) diff --git a/pygmt/helpers/decorators.py b/pygmt/helpers/decorators.py index 15b13aa65f4..c5ecb200949 100644 --- a/pygmt/helpers/decorators.py +++ b/pygmt/helpers/decorators.py @@ -54,6 +54,11 @@ ``[g|p]`` Force gridline (g) or pixel (p) node registration. Default is gridline.""", + "coord_sys": """\ + coord_sys : bool + Coordinate System of grid. Can be either Cartesian (c) or + Geographic (g). Default is auto-detect (None), with a fallback + to Cartesian (c).""", } diff --git a/pygmt/modules.py b/pygmt/modules.py index a63f4b492ba..52468d0edd5 100644 --- a/pygmt/modules.py +++ b/pygmt/modules.py @@ -14,7 +14,7 @@ @fmt_docstring -def grdinfo(grid, registration=None, **kwargs): +def grdinfo(grid, coord_sys=None, registration=None, **kwargs): """ Get information about a grid. @@ -27,6 +27,7 @@ def grdinfo(grid, registration=None, **kwargs): grid : str or xarray.DataArray The file name of the input grid or the grid loaded as a DataArray. + {coord_sys} {r} Returns @@ -41,7 +42,7 @@ def grdinfo(grid, registration=None, **kwargs): if kind == "file": file_context = dummy_context(grid) elif kind == "grid": - file_context = lib.virtualfile_from_grid(grid, registration) + file_context = lib.virtualfile_from_grid(grid, coord_sys, registration) else: raise GMTInvalidInput("Unrecognized data type: {}".format(type(grid))) with file_context as infile: diff --git a/pygmt/sampling.py b/pygmt/sampling.py index 4cc27fe6651..26503c5e07d 100644 --- a/pygmt/sampling.py +++ b/pygmt/sampling.py @@ -17,7 +17,15 @@ @fmt_docstring @use_alias(n="interpolation") -def grdtrack(points, grid, newcolname=None, outfile=None, registration=None, **kwargs): +def grdtrack( + points, + grid, + newcolname=None, + outfile=None, + registration=None, + coord_sys=None, + **kwargs, +): """ Sample grids at specified (x,y) locations. @@ -55,6 +63,7 @@ def grdtrack(points, grid, newcolname=None, outfile=None, registration=None, **k Required if 'points' is a file. The file name for the output ASCII file. + {coord_sys} {r} {n} @@ -85,7 +94,7 @@ def grdtrack(points, grid, newcolname=None, outfile=None, registration=None, **k # Store the xarray.DataArray grid in virtualfile if data_kind(grid) == "grid": - grid_context = lib.virtualfile_from_grid(grid, registration) + grid_context = lib.virtualfile_from_grid(grid, coord_sys, registration) elif data_kind(grid) == "file": grid_context = dummy_context(grid) else: diff --git a/pygmt/tests/baseline/test_gridimage_over_dateline.png b/pygmt/tests/baseline/test_gridimage_over_dateline.png new file mode 100644 index 0000000000000000000000000000000000000000..94e578988017fbe73c024cfd5e74ab36d00076e4 GIT binary patch literal 34252 zcmXtfbx>T*6Yb*e?(Vj@1b5d(LvWXn1b24`?!kQt?(XjHnm}-OSsvf-y;rxUZq@v8 z>-O}i?mpdTBGpyp(2$9d0RRA+g1odQ0071MvDgryKXyc<#=<{dNZ;i3odE!Ln*SD* zN3odO$0nJJjGl{@la-6R=?_bQoVqfloQ;#Si?jI;+ixzEg6v#e#&6&%0DuypAT0s% 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%0D9t*r*3TRP4Mw9MBFMeGseLrJYjV*rSc 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 Xv~;