diff --git a/docs/source/data-publishing/ogcapi-coverages.rst b/docs/source/data-publishing/ogcapi-coverages.rst index 140843f..9387b7a 100644 --- a/docs/source/data-publishing/ogcapi-coverages.rst +++ b/docs/source/data-publishing/ogcapi-coverages.rst @@ -45,6 +45,10 @@ capable of handling. name: GRIB mimetype: application/x-grib2 +.. note:: + The rasterio provider ``format.name`` directive **requires** a valid + `GDAL raster driver short name`_. + xarray ^^^^^^^^ @@ -89,3 +93,4 @@ Data access examples .. _`rasterio`: https://rasterio.readthedocs.io .. _`xarray`: https://xarray.pydata.org .. _`NetCDF`: https://en.wikipedia.org/wiki/NetCDF +.. _`GDAL raster driver short name`: https://gdal.org/drivers/raster/index.html diff --git a/pygeoapi/provider/rasterio_.py b/pygeoapi/provider/rasterio_.py index f3affba..68fdefa 100644 --- a/pygeoapi/provider/rasterio_.py +++ b/pygeoapi/provider/rasterio_.py @@ -27,7 +27,6 @@ # # ================================================================= -import io import logging import rasterio @@ -36,6 +35,7 @@ import rasterio.mask from pygeoapi.provider.base import (BaseProvider, ProviderConnectionError, ProviderQueryError) +from pygeoapi.util import read_data LOGGER = logging.getLogger(__name__) @@ -178,9 +178,8 @@ class RasterioProvider(BaseProvider): shapes = [] if not bands and not subsets and format_ != 'json': - LOGGER.debug('No parameters specified, returning native file') - with io.open(self.data, 'rb') as fh: - return fh.read() + LOGGER.debug('No parameters specified, returning native data') + return read_data(self.data) if (self._coverage_properties['x_axis_label'] in subsets and self._coverage_properties['y_axis_label'] in subsets): diff --git a/pygeoapi/provider/xarray_.py b/pygeoapi/provider/xarray_.py index c3222a3..ecb429a 100644 --- a/pygeoapi/provider/xarray_.py +++ b/pygeoapi/provider/xarray_.py @@ -37,6 +37,7 @@ from pygeoapi.provider.base import (BaseProvider, ProviderConnectionError, ProviderNoDataError, ProviderQueryError) +from pygeoapi.util import read_data LOGGER = logging.getLogger(__name__) @@ -183,6 +184,10 @@ class XarrayProvider(BaseProvider): :returns: coverage data as dict of CoverageJSON or native format """ + if not range_subset and not subsets and format_ != 'json': + LOGGER.debug('No parameters specified, returning native data') + return read_data(self.data) + if len(range_subset) < 1: range_subset = self.fields diff --git a/pygeoapi/util.py b/pygeoapi/util.py index 194ca61..cbe78cb 100644 --- a/pygeoapi/util.py +++ b/pygeoapi/util.py @@ -32,11 +32,13 @@ import base64 from datetime import date, datetime, time from decimal import Decimal +import io import json import logging import mimetypes import os import re +from urllib.request import urlopen from urllib.parse import urlparse from jinja2 import Environment, FileSystemLoader @@ -335,3 +337,21 @@ def get_provider_default(providers): LOGGER.debug('Default provider: {}'.format(default['type'])) return default + + +def read_data(path): + """ + helper function to read data (file or networrk) + """ + + LOGGER.debug('Attempting to read {}'.format(path)) + scheme = urlparse(path).scheme + + if scheme in ['', 'file']: + LOGGER.debug('local file on disk') + with io.open(path, 'rb') as fh: + return fh.read() + else: + LOGGER.debug('network file') + with urlopen(path) as r: + return r.read() diff --git a/tests/test_util.py b/tests/test_util.py index 671ccc9..d98b927 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -158,3 +158,9 @@ def test_get_provider_default(): assert pd['name'] == 'CSV' pd = util.get_provider_default(d['resources']['obs']['providers']) + + +def test_read_data(): + data = util.read_data(get_test_file_path('pygeoapi-test-config.yml')) + + assert isinstance(data, bytes)