geowatch.gis.elevation module

Tools for accessing querying for elevation data.

class geowatch.gis.elevation.ElevationDatabase[source]

Bases: object

An object that might use various backends to query elevation for a given latitude and longitude.

classmethod coerce(key)[source]

Attempt to resolve key to an elevation database.

Parameters:

key (str) – Available options are: * “open-elevation” * “gtop30” * A number for a constant elevation

class geowatch.gis.elevation.ConstantElevationDatabase(const)[source]

Bases: ElevationDatabase

Fallback compatibility API when no elevation information is available

query(lats, lons)[source]
class geowatch.gis.elevation.OpenElevationDatabase[source]

Bases: ElevationDatabase

Use open-elevation to query the elevation for a lat/lon point.

This issues a web request, so it can be slow.

Parameters:
  • lat (float) – degrees in latitude

  • lon (float) – degrees in longitude

  • cache (bool) – if True uses on-disk caching

  • attempts (int) – number of attempts before giving up

  • verbose (int) – verbosity flag

Returns:

elevation in meters

Return type:

float

References

https://gis.stackexchange.com/questions/338392/getting-elevation-for-multiple-lat-long-coordinates-in-python https://gis.stackexchange.com/questions/212106/seeking-alternative-to-google-maps-elevation-api https://open-elevation.com/ https://www.freemaptools.com/elevation-finder.htm

Example

>>> # xdoctest: +REQUIRES(--network)
>>> # xdoctest: +REQUIRES(--slow)
>>> from geowatch.gis.elevation import *  # NOQA
>>> lat = 37.65026538818887
>>> lon = 128.81096081618637
>>> eldb = OpenElevationDatabase()
>>> elevation = eldb.query(lat, lon, verbose=3)
>>> print('elevation = {!r}'.format(elevation))
elevation = 449
query(lat, lon, **kwargs)[source]
class geowatch.gis.elevation.DEM_Collection(dem_paths)[source]

Bases: ElevationDatabase

Manage a collection of DEM geotiffs

Example

>>> # xdoctest: +REQUIRES(--network)
>>> # xdoctest: +REQUIRES(--slow)
>>> # Use the gtop30 DEM dataset from GIRDER to find elevation.
>>> from geowatch.gis.elevation import *  # NOQA
>>> dems = DEM_Collection.gtop30()
>>> lat, lon = (37.7455555555556, 128.780555555556)
>>> print(dems.query(lat, lon))
499.0
>>> # Running one query on the CI is good enough
>>> # xdoctest: +REQUIRES(--slow)
>>> # xdoctest: +REQUIRES(--slow)
>>> lat, lon = (37.7280555555556, 129.008888888889)
>>> print(dems.query(lat, lon))
0
>>> lat, lon = (37.6947222222222, 129.008888888889)
>>> print(dems.query(lat, lon))
95.0
>>> lat, lon = (37.7127777777778, 128.780555555556)
>>> print(dems.query(lat, lon))
452.0
>>> lat, lon = (0, 0)
>>> print(dems.query(lat, lon))
0
>>> lon_basis = np.linspace(-175, 175, 100)
>>> lat_basis = np.linspace(-85, 85, 100)
>>> lats_, lons_ = np.meshgrid(lat_basis, lon_basis)
>>> lats = lats_.ravel()
>>> lons = lons_.ravel()
>>> elevations = dems.query(lats, lons)
find_reference_fpath(lat, lon)[source]
query(lats, lons)[source]

TODO: the API supports vectorization, but we need to make it more efficient.

classmethod gtop30()[source]

Build the gtop30 dataset

Example

>>> # xdoctest: +REQUIRES(--network)
>>> # xdoctest: +REQUIRES(--slow)
>>> dems = DEM_Collection.gtop30()
>>> lats = [1, 2, 3]
>>> lons = [1, 2, 3]
>>> dems.query(lats, lons)
geowatch.gis.elevation.ensure_iterable_latlons(lats, lons)[source]
geowatch.gis.elevation.girder_gtop30_elevation_dem()[source]
geowatch.gis.elevation.ensure_girder_gtop30_elevation_maps()[source]

Ensure that we have the GTOP30 Digital Elevation Maps (DEMS) available locally.

References

https://data.kitware.com/#collection/59eb64168d777f31ac6477e7/folder/59fb784d8d777f31ac6480fb https://www.google.com/url?sa=j&url=https%3A%2F%2Fwww.usgs.gov%2Fcenters%2Feros%2Fscience%2Fusgs-eros-archive-digital-elevation-global-30-arc-second-elevation-gtopo30%3Fqt-science_center_objects%3D0%23qt-science_center_objects&uct=1599876275&usg=jBvv8w64RCBJd2SyQA3kUtKhMQ4.&source=chat