From c8c3bb548414fffabf489e04b81020e94788e4ea Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Tue, 24 Sep 2024 10:42:55 +0800 Subject: [PATCH 01/13] Add enums GridID --- pygmt/enums.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 pygmt/enums.py diff --git a/pygmt/enums.py b/pygmt/enums.py new file mode 100644 index 00000000000..d7c70658d0b --- /dev/null +++ b/pygmt/enums.py @@ -0,0 +1,39 @@ +""" +Enumerations for PyGMT. +""" + +from enum import IntEnum + + +class GridID(IntEnum): + """ + Enum for the GMT grid format ID. + + These enums are defined in 'gmt_grdio.h'. + """ + + GMT_GRD_UNKNOWN_FMT = 0 # If grid format cannot be auto-detected + GMT_GRID_IS_BF = 1 # GMT native, C-binary format (32-bit float) + GMT_GRID_IS_BS = 2 # GMT native, C-binary format (16-bit integer) + GMT_GRID_IS_RB = 3 # SUN rasterfile format (8-bit standard) + GMT_GRID_IS_BB = 4 # GMT native, C-binary format (8-bit integer) + GMT_GRID_IS_BM = 5 # GMT native, C-binary format (bit-mask) + GMT_GRID_IS_SF = 6 # Golden Software Surfer format 6 (32-bit float) + GMT_GRID_IS_CB = 7 # GMT netCDF format (8-bit integer, depreciated) + GMT_GRID_IS_CS = 8 # GMT netCDF format (16-bit integer, depreciated) + GMT_GRID_IS_CI = 9 # GMT netCDF format (32-bit integer, depreciated) + GMT_GRID_IS_CF = 10 # GMT netCDF format (32-bit float, depreciated) + GMT_GRID_IS_CD = 11 # GMT netCDF format (64-bit float, depreciated) + GMT_GRID_IS_RF = 12 # GEODAS grid format GRD98 (NGDC) + GMT_GRID_IS_BI = 13 # GMT native, C-binary format (32-bit integer) + GMT_GRID_IS_BD = 14 # GMT native, C-binary format (64-bit float) + GMT_GRID_IS_NB = 15 # GMT netCDF format (8-bit integer) + GMT_GRID_IS_NS = 16 # GMT netCDF format (16-bit integer) + GMT_GRID_IS_NI = 17 # GMT netCDF format (32-bit integer) + GMT_GRID_IS_NF = 18 # GMT netCDF format (32-bit float) + GMT_GRID_IS_ND = 19 # GMT netCDF format (64-bit float) + GMT_GRID_IS_SD = 20 # Golden Software Surfer format 7 (64-bit float, read-only) + GMT_GRID_IS_AF = 21 # Atlantic Geoscience Center format AGC (32-bit float) + GMT_GRID_IS_GD = 22 # Import through GDAL + GMT_GRID_IS_EI = 23 # ESRI Arc/Info ASCII Grid Interchange format (ASCII integer) + GMT_GRID_IS_EF = 24 # ESRI Arc/Info ASCII Grid Interchange format (ASCII float) From ea1cc7978601f91e01e2d445fa5491a64c0edf58 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Tue, 24 Sep 2024 10:43:06 +0800 Subject: [PATCH 02/13] Add enums to the API documentation --- doc/api/index.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/api/index.rst b/doc/api/index.rst index 1c80d8d163f..04849715f03 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -242,6 +242,14 @@ In addition, there is also a special function to load XYZ tile maps via .. currentmodule:: pygmt +Enumerations +------------ + +.. autosummary:: + :toctree: generated + + enums + Exceptions ---------- From 77c0ba37c14ec88367e9618fe2d2f5c04b8a0235 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Tue, 24 Sep 2024 10:43:38 +0800 Subject: [PATCH 03/13] Only set the 'Conventions' attr to 'CF-1.7' for netCDF files --- pygmt/datatypes/header.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pygmt/datatypes/header.py b/pygmt/datatypes/header.py index 04e10ac0c72..7c4a5028412 100644 --- a/pygmt/datatypes/header.py +++ b/pygmt/datatypes/header.py @@ -6,6 +6,7 @@ from typing import Any, ClassVar import numpy as np +from pygmt.enums import GridID # Constants for lengths of grid header variables. # @@ -203,7 +204,14 @@ def data_attrs(self) -> dict[str, Any]: Attributes for the data variable from the grid header. """ attrs: dict[str, Any] = {} - attrs["Conventions"] = "CF-1.7" + if self.type in { # netCDF format + GridID.GMT_GRID_IS_NB, + GridID.GMT_GRID_IS_NS, + GridID.GMT_GRID_IS_NI, + GridID.GMT_GRID_IS_NF, + GridID.GMT_GRID_IS_ND, + }: + attrs["Conventions"] = "CF-1.7" attrs["title"] = self.title.decode() attrs["history"] = self.command.decode() attrs["description"] = self.remark.decode() From ce3c55cd71c65919c94861790be3f3ecb1c9e98e Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Tue, 24 Sep 2024 18:01:08 +0800 Subject: [PATCH 04/13] Change long enum names to shorter ones --- pygmt/enums.py | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/pygmt/enums.py b/pygmt/enums.py index d7c70658d0b..b10a090b0fe 100644 --- a/pygmt/enums.py +++ b/pygmt/enums.py @@ -12,28 +12,28 @@ class GridID(IntEnum): These enums are defined in 'gmt_grdio.h'. """ - GMT_GRD_UNKNOWN_FMT = 0 # If grid format cannot be auto-detected - GMT_GRID_IS_BF = 1 # GMT native, C-binary format (32-bit float) - GMT_GRID_IS_BS = 2 # GMT native, C-binary format (16-bit integer) - GMT_GRID_IS_RB = 3 # SUN rasterfile format (8-bit standard) - GMT_GRID_IS_BB = 4 # GMT native, C-binary format (8-bit integer) - GMT_GRID_IS_BM = 5 # GMT native, C-binary format (bit-mask) - GMT_GRID_IS_SF = 6 # Golden Software Surfer format 6 (32-bit float) - GMT_GRID_IS_CB = 7 # GMT netCDF format (8-bit integer, depreciated) - GMT_GRID_IS_CS = 8 # GMT netCDF format (16-bit integer, depreciated) - GMT_GRID_IS_CI = 9 # GMT netCDF format (32-bit integer, depreciated) - GMT_GRID_IS_CF = 10 # GMT netCDF format (32-bit float, depreciated) - GMT_GRID_IS_CD = 11 # GMT netCDF format (64-bit float, depreciated) - GMT_GRID_IS_RF = 12 # GEODAS grid format GRD98 (NGDC) - GMT_GRID_IS_BI = 13 # GMT native, C-binary format (32-bit integer) - GMT_GRID_IS_BD = 14 # GMT native, C-binary format (64-bit float) - GMT_GRID_IS_NB = 15 # GMT netCDF format (8-bit integer) - GMT_GRID_IS_NS = 16 # GMT netCDF format (16-bit integer) - GMT_GRID_IS_NI = 17 # GMT netCDF format (32-bit integer) - GMT_GRID_IS_NF = 18 # GMT netCDF format (32-bit float) - GMT_GRID_IS_ND = 19 # GMT netCDF format (64-bit float) - GMT_GRID_IS_SD = 20 # Golden Software Surfer format 7 (64-bit float, read-only) - GMT_GRID_IS_AF = 21 # Atlantic Geoscience Center format AGC (32-bit float) - GMT_GRID_IS_GD = 22 # Import through GDAL - GMT_GRID_IS_EI = 23 # ESRI Arc/Info ASCII Grid Interchange format (ASCII integer) - GMT_GRID_IS_EF = 24 # ESRI Arc/Info ASCII Grid Interchange format (ASCII float) + UNKNOWN = 0 # If grid format cannot be auto-detected + BF = 1 # GMT native, C-binary format (32-bit float) + BS = 2 # GMT native, C-binary format (16-bit integer) + RB = 3 # SUN rasterfile format (8-bit standard) + BB = 4 # GMT native, C-binary format (8-bit integer) + BM = 5 # GMT native, C-binary format (bit-mask) + SF = 6 # Golden Software Surfer format 6 (32-bit float) + CB = 7 # GMT netCDF format (8-bit integer, depreciated) + CS = 8 # GMT netCDF format (16-bit integer, depreciated) + CI = 9 # GMT netCDF format (32-bit integer, depreciated) + CF = 10 # GMT netCDF format (32-bit float, depreciated) + CD = 11 # GMT netCDF format (64-bit float, depreciated) + RF = 12 # GEODAS grid format GRD98 (NGDC) + BI = 13 # GMT native, C-binary format (32-bit integer) + BD = 14 # GMT native, C-binary format (64-bit float) + NB = 15 # GMT netCDF format (8-bit integer) + NS = 16 # GMT netCDF format (16-bit integer) + NI = 17 # GMT netCDF format (32-bit integer) + NF = 18 # GMT netCDF format (32-bit float) + ND = 19 # GMT netCDF format (64-bit float) + SD = 20 # Golden Software Surfer format 7 (64-bit float, read-only) + AF = 21 # Atlantic Geoscience Center format AGC (32-bit float) + GD = 22 # Import through GDAL + EI = 23 # ESRI Arc/Info ASCII Grid Interchange format (ASCII integer) + EF = 24 # ESRI Arc/Info ASCII Grid Interchange format (ASCII float) From 1640e6c5b5a84747f47125c49748f2e487760d37 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Tue, 24 Sep 2024 18:03:39 +0800 Subject: [PATCH 05/13] Use short enum names in header.py --- pygmt/datatypes/header.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/pygmt/datatypes/header.py b/pygmt/datatypes/header.py index 7c4a5028412..1b1c429b17d 100644 --- a/pygmt/datatypes/header.py +++ b/pygmt/datatypes/header.py @@ -204,13 +204,8 @@ def data_attrs(self) -> dict[str, Any]: Attributes for the data variable from the grid header. """ attrs: dict[str, Any] = {} - if self.type in { # netCDF format - GridID.GMT_GRID_IS_NB, - GridID.GMT_GRID_IS_NS, - GridID.GMT_GRID_IS_NI, - GridID.GMT_GRID_IS_NF, - GridID.GMT_GRID_IS_ND, - }: + if self.type in {GridID.NB, GridID.NS, GridID.NI, GridID.NF, GridID.ND}: + # Only set the 'Conventions' attribute for netCDF. attrs["Conventions"] = "CF-1.7" attrs["title"] = self.title.decode() attrs["history"] = self.command.decode() From ac6239fa4f31e6b6049be8757e251960b89357a3 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Fri, 27 Sep 2024 22:29:45 +0800 Subject: [PATCH 06/13] Update docs for enums --- doc/_templates/autosummary/class.rst | 4 ++- doc/api/index.rst | 2 +- pygmt/enums.py | 50 ++++++++++++++-------------- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/doc/_templates/autosummary/class.rst b/doc/_templates/autosummary/class.rst index cda380f316a..b88fa9a5585 100644 --- a/doc/_templates/autosummary/class.rst +++ b/doc/_templates/autosummary/class.rst @@ -8,8 +8,10 @@ .. rubric:: Attributes {% for item in attributes %} -.. autoproperty:: +{% if item not in inherited_members %} +.. autoattribute:: {{ objname }}.{{ item }} +{% endif %} {% endfor %} {% endif %} diff --git a/doc/api/index.rst b/doc/api/index.rst index 04849715f03..4a1693ae6c6 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -248,7 +248,7 @@ Enumerations .. autosummary:: :toctree: generated - enums + enums.GridID Exceptions ---------- diff --git a/pygmt/enums.py b/pygmt/enums.py index b10a090b0fe..dfba37c3e72 100644 --- a/pygmt/enums.py +++ b/pygmt/enums.py @@ -12,28 +12,28 @@ class GridID(IntEnum): These enums are defined in 'gmt_grdio.h'. """ - UNKNOWN = 0 # If grid format cannot be auto-detected - BF = 1 # GMT native, C-binary format (32-bit float) - BS = 2 # GMT native, C-binary format (16-bit integer) - RB = 3 # SUN rasterfile format (8-bit standard) - BB = 4 # GMT native, C-binary format (8-bit integer) - BM = 5 # GMT native, C-binary format (bit-mask) - SF = 6 # Golden Software Surfer format 6 (32-bit float) - CB = 7 # GMT netCDF format (8-bit integer, depreciated) - CS = 8 # GMT netCDF format (16-bit integer, depreciated) - CI = 9 # GMT netCDF format (32-bit integer, depreciated) - CF = 10 # GMT netCDF format (32-bit float, depreciated) - CD = 11 # GMT netCDF format (64-bit float, depreciated) - RF = 12 # GEODAS grid format GRD98 (NGDC) - BI = 13 # GMT native, C-binary format (32-bit integer) - BD = 14 # GMT native, C-binary format (64-bit float) - NB = 15 # GMT netCDF format (8-bit integer) - NS = 16 # GMT netCDF format (16-bit integer) - NI = 17 # GMT netCDF format (32-bit integer) - NF = 18 # GMT netCDF format (32-bit float) - ND = 19 # GMT netCDF format (64-bit float) - SD = 20 # Golden Software Surfer format 7 (64-bit float, read-only) - AF = 21 # Atlantic Geoscience Center format AGC (32-bit float) - GD = 22 # Import through GDAL - EI = 23 # ESRI Arc/Info ASCII Grid Interchange format (ASCII integer) - EF = 24 # ESRI Arc/Info ASCII Grid Interchange format (ASCII float) + UNKNOWN = 0 #: Unkown grid format + BF = 1 #: GMT native, C-binary format (32-bit float) + BS = 2 #: GMT native, C-binary format (16-bit integer) + RB = 3 #: SUN rasterfile format (8-bit standard) + BB = 4 #: GMT native, C-binary format (8-bit integer) + BM = 5 #: GMT native, C-binary format (bit-mask) + SF = 6 #: Golden Software Surfer format 6 (32-bit float) + CB = 7 #: GMT netCDF format (8-bit integer, depreciated) + CS = 8 #: GMT netCDF format (16-bit integer, depreciated) + CI = 9 #: GMT netCDF format (32-bit integer, depreciated) + CF = 10 #: GMT netCDF format (32-bit float, depreciated) + CD = 11 #: GMT netCDF format (64-bit float, depreciated) + RF = 12 #: GEODAS grid format GRD98 (NGDC) + BI = 13 #: GMT native, C-binary format (32-bit integer) + BD = 14 #: GMT native, C-binary format (64-bit float) + NB = 15 #: GMT netCDF format (8-bit integer) + NS = 16 #: GMT netCDF format (16-bit integer) + NI = 17 #: GMT netCDF format (32-bit integer) + NF = 18 #: GMT netCDF format (32-bit float) + ND = 19 #: GMT netCDF format (64-bit float) + SD = 20 #: Golden Software Surfer format 7 (64-bit float, read-only) + AF = 21 #: Atlantic Geoscience Center format AGC (32-bit float) + GD = 22 #: Import through GDAL + EI = 23 #: ESRI Arc/Info ASCII Grid Interchange format (ASCII integer) + EF = 24 #: ESRI Arc/Info ASCII Grid Interchange format (ASCII float) From d55ee9283868ac557bcd97a81abfcea37e03ce12 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Sat, 28 Sep 2024 14:32:59 +0800 Subject: [PATCH 07/13] Fix enum name from GridID to GridFormat Co-authored-by: Wei Ji <23487320+weiji14@users.noreply.github.com> --- pygmt/enums.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pygmt/enums.py b/pygmt/enums.py index dfba37c3e72..7f5c43cb46a 100644 --- a/pygmt/enums.py +++ b/pygmt/enums.py @@ -5,14 +5,14 @@ from enum import IntEnum -class GridID(IntEnum): +class GridFormat(IntEnum): """ Enum for the GMT grid format ID. These enums are defined in 'gmt_grdio.h'. """ - UNKNOWN = 0 #: Unkown grid format + UNKNOWN = 0 #: Unknown grid format BF = 1 #: GMT native, C-binary format (32-bit float) BS = 2 #: GMT native, C-binary format (16-bit integer) RB = 3 #: SUN rasterfile format (8-bit standard) From 889d5e487f3856ac2fe03998c22a10bce3925d9a Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Sat, 28 Sep 2024 14:35:48 +0800 Subject: [PATCH 08/13] Fix enum name from GridID to GridFormat --- pygmt/datatypes/header.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pygmt/datatypes/header.py b/pygmt/datatypes/header.py index 1b1c429b17d..f9f30aa5621 100644 --- a/pygmt/datatypes/header.py +++ b/pygmt/datatypes/header.py @@ -6,7 +6,7 @@ from typing import Any, ClassVar import numpy as np -from pygmt.enums import GridID +from pygmt.enums import GridFormat # Constants for lengths of grid header variables. # @@ -204,7 +204,13 @@ def data_attrs(self) -> dict[str, Any]: Attributes for the data variable from the grid header. """ attrs: dict[str, Any] = {} - if self.type in {GridID.NB, GridID.NS, GridID.NI, GridID.NF, GridID.ND}: + if self.type in { + GridFormat.NB, + GridFormat.NS, + GridFormat.NI, + GridFormat.NF, + GridFormat.ND, + }: # Only set the 'Conventions' attribute for netCDF. attrs["Conventions"] = "CF-1.7" attrs["title"] = self.title.decode() From de83cc49897fc848738a59de03e6d2a76df80729 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Sat, 28 Sep 2024 14:52:23 +0800 Subject: [PATCH 09/13] Fix one comment line --- pygmt/datatypes/header.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pygmt/datatypes/header.py b/pygmt/datatypes/header.py index f9f30aa5621..d7806e50a24 100644 --- a/pygmt/datatypes/header.py +++ b/pygmt/datatypes/header.py @@ -210,8 +210,7 @@ def data_attrs(self) -> dict[str, Any]: GridFormat.NI, GridFormat.NF, GridFormat.ND, - }: - # Only set the 'Conventions' attribute for netCDF. + }: # Only set the 'Conventions' attribute for netCDF. attrs["Conventions"] = "CF-1.7" attrs["title"] = self.title.decode() attrs["history"] = self.command.decode() From cb38a397af655544b6d6544bc9eca5c665792ed5 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Sat, 28 Sep 2024 14:54:17 +0800 Subject: [PATCH 10/13] Fix GridID to GridFormat in api --- doc/api/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/index.rst b/doc/api/index.rst index 4a1693ae6c6..4a4bccb6b0d 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -248,7 +248,7 @@ Enumerations .. autosummary:: :toctree: generated - enums.GridID + enums.GridFormat Exceptions ---------- From ccfd835fb35f558bb57504b10af1c4c7a741a012 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Sat, 28 Sep 2024 18:44:17 +0800 Subject: [PATCH 11/13] Revert changes in docs --- doc/_templates/autosummary/class.rst | 4 +--- doc/api/index.rst | 8 -------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/doc/_templates/autosummary/class.rst b/doc/_templates/autosummary/class.rst index b88fa9a5585..cda380f316a 100644 --- a/doc/_templates/autosummary/class.rst +++ b/doc/_templates/autosummary/class.rst @@ -8,10 +8,8 @@ .. rubric:: Attributes {% for item in attributes %} -{% if item not in inherited_members %} -.. autoattribute:: +.. autoproperty:: {{ objname }}.{{ item }} -{% endif %} {% endfor %} {% endif %} diff --git a/doc/api/index.rst b/doc/api/index.rst index 4a4bccb6b0d..1c80d8d163f 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -242,14 +242,6 @@ In addition, there is also a special function to load XYZ tile maps via .. currentmodule:: pygmt -Enumerations ------------- - -.. autosummary:: - :toctree: generated - - enums.GridFormat - Exceptions ---------- From b3f4f3fee0fab2999850a4ee673a7af1dd7eeb4d Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Sat, 28 Sep 2024 18:44:42 +0800 Subject: [PATCH 12/13] Revert changes in pygmt/datatypes/header.py --- pygmt/datatypes/header.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/pygmt/datatypes/header.py b/pygmt/datatypes/header.py index d7806e50a24..04e10ac0c72 100644 --- a/pygmt/datatypes/header.py +++ b/pygmt/datatypes/header.py @@ -6,7 +6,6 @@ from typing import Any, ClassVar import numpy as np -from pygmt.enums import GridFormat # Constants for lengths of grid header variables. # @@ -204,14 +203,7 @@ def data_attrs(self) -> dict[str, Any]: Attributes for the data variable from the grid header. """ attrs: dict[str, Any] = {} - if self.type in { - GridFormat.NB, - GridFormat.NS, - GridFormat.NI, - GridFormat.NF, - GridFormat.ND, - }: # Only set the 'Conventions' attribute for netCDF. - attrs["Conventions"] = "CF-1.7" + attrs["Conventions"] = "CF-1.7" attrs["title"] = self.title.decode() attrs["history"] = self.command.decode() attrs["description"] = self.remark.decode() From 4ddf321d329d5251a10b4866ed5959c7a14b7360 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Sat, 28 Sep 2024 20:38:40 +0800 Subject: [PATCH 13/13] Fix 'depreciated' to 'deprecated' Co-authored-by: Wei Ji <23487320+weiji14@users.noreply.github.com> --- pygmt/enums.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pygmt/enums.py b/pygmt/enums.py index 7f5c43cb46a..7c0984eccb9 100644 --- a/pygmt/enums.py +++ b/pygmt/enums.py @@ -19,11 +19,11 @@ class GridFormat(IntEnum): BB = 4 #: GMT native, C-binary format (8-bit integer) BM = 5 #: GMT native, C-binary format (bit-mask) SF = 6 #: Golden Software Surfer format 6 (32-bit float) - CB = 7 #: GMT netCDF format (8-bit integer, depreciated) - CS = 8 #: GMT netCDF format (16-bit integer, depreciated) - CI = 9 #: GMT netCDF format (32-bit integer, depreciated) - CF = 10 #: GMT netCDF format (32-bit float, depreciated) - CD = 11 #: GMT netCDF format (64-bit float, depreciated) + CB = 7 #: GMT netCDF format (8-bit integer, deprecated) + CS = 8 #: GMT netCDF format (16-bit integer, deprecated) + CI = 9 #: GMT netCDF format (32-bit integer, deprecated) + CF = 10 #: GMT netCDF format (32-bit float, deprecated) + CD = 11 #: GMT netCDF format (64-bit float, deprecated) RF = 12 #: GEODAS grid format GRD98 (NGDC) BI = 13 #: GMT native, C-binary format (32-bit integer) BD = 14 #: GMT native, C-binary format (64-bit float)