Coverage for pygeodesy/elevations.py : 99%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# -*- coding: utf-8 -*-
Functions to obtain elevations and geoid heights thru web services, for (lat, lon) locations, currently limited to the U{Conterminous US (CONUS)<https://WikiPedia.org/wiki/Contiguous_United_States>}, see also modules L{pygeodesy.geoids} and L{pygeodesy.heights} and U{USGS10mElev.py<https://Gist.GitHub.com/pyRobShrk>}.
B{macOS}: If an C{SSLCertVerificationError} occurs, especially this I{"[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self "signed certificate in certificate chain ..."}, review U{this post<https://StackOverflow.com/questions/27835619/ urllib-and-ssl-certificate-verify-failed-error>} for a remedy. From a C{Terminal} window run: C{"/Applications/Python\\ X.Y/Install\\ Certificates.command"} '''
_elevation_, _height_, _LCURLY_, \ _n_a_, _no_, _RCURLY_, _SPACE_
from httplib import HTTPException as HTTPError
except (ImportError, NameError): # Python 3+ from urllib.request import urlopen # urlcleanup # from urllib.parse import quote from urllib.error import HTTPError
except ImportError:
from pygeodesy.interns import _COMMA_, _QUOTE2_ _QUOTE2COLONSPACE_ = _QUOTE2_ + _COLONSPACE_
def _json(ngs): '''(INTERNAL) Convert an NGS response in JSON to a C{dict}. ''' # b'{"geoidModel": "GEOID12A", # "station": "UserStation", # "lat": 37.8816, # "latDms": "N375253.76000", # "lon": -121.9142, # "lonDms": "W1215451.12000", # "geoidHeight": -31.703, # "error": 0.064 # }' # # or in case of errors: # # b'{"error": "No suitable Geoid model found for model 15" # }' d = {} for t in ngs.strip().lstrip(_LCURLY_).rstrip(_RCURLY_).split(_COMMA_): t = t.strip() j = t.strip(_QUOTE2_).split(_QUOTE2COLONSPACE_) if len(j) != 2: raise ParseError(json=t) k, v = j try: v = float(v) except (TypeError, ValueError): v = Str(ub2str(v.lstrip().lstrip(_QUOTE2_)), name=k) d[k] = v return d
'''(INTERNAL) Format an error '''
'''(INTERNAL) Build B{C{url}} query, get and verify response. '''
raise HTTPError('code %d: %s' % (s, u.geturl()))
# urlcleanup()
'''(INTERNAL) Get a <tag>value</tag> from XML. ''' # b'<?xml version="1.0" encoding="utf-8" ?> # <USGS_Elevation_Point_Query_Service> # <Elevation_Query x="-121.914200" y="37.881600"> # <Data_Source>3DEP 1/3 arc-second</Data_Source> # <Elevation>3851.03</Elevation> # <Units>Feet</Units> # </Elevation_Query> # </USGS_Elevation_Point_Query_Service>' return _no_(_XML_, Fmt.TAG(tag)) # PYCHOK no cover
'''2-Tuple C{(elevation, data_source)} in C{meter} and C{str}. '''
'''Get the geoid elevation at an C{NAD83} to C{NAVD88} location.
@arg lat: Latitude (C{degrees}). @arg lon: Longitude (C{degrees}). @kwarg timeout: Optional, query timeout (seconds).
@return: An L{Elevation2Tuple}C{(elevation, data_source)} or (C{None, "error"}) in case of errors.
@raise ValueError: Invalid B{C{timeout}}.
@note: The returned C{elevation} is C{None} if B{C{lat}} or B{C{lon}} is invalid or outside the C{Conterminous US (CONUS)}, if conversion failed or if the query timed out. The C{"error"} is the C{HTTP-, IO-, SSL-} or other C{-Error} as a string (C{str}).
@see: U{USGS National Map<https://NationalMap.gov/epqs>}, the U{FAQ<https://www.USGS.gov/faqs/what-are-projection- horizontal-and-vertical-datum-units-and-resolution-3dep-standard-dems>}, U{geoid.py<https://Gist.GitHub.com/pyRobShrk>}, module L{geoids}, classes L{GeoidG2012B}, L{GeoidKarney} and L{GeoidPGM}. ''' x=Lon(lon).toStr(prec=6), y=Lat(lat).toStr(prec=6), units='Meters', # 'Feet', capitalized output=_XML_.lower(), # _JSON_, lowercase only timeout=Scalar(timeout=timeout)) except (TypeError, ValueError): pass else: # PYCHOK no cover e = _no_(_XML_, Fmt.QUOTE2(clips(x, limit=128, white=_SPACE_))) except Exception as x: # (HTTPError, IOError, TypeError, ValueError) e = repr(x)
'''2-Tuple C{(height, model_name)}, geoid C{height} in C{meter} and C{model_name} as C{str}. '''
'''Get the C{NAVD88} geoid height at an C{NAD83} location.
@arg lat: Latitude (C{degrees}). @arg lon: Longitude (C{degrees}). @kwarg model: Optional, geoid model ID (C{int}). @kwarg timeout: Optional, query timeout (seconds).
@return: An L{GeoidHeight2Tuple}C{(height, model_name)} or C{(None, "error"}) in case of errors.
@raise ValueError: Invalid B{C{timeout}}.
@note: The returned C{height} is C{None} if B{C{lat}} or B{C{lon}} is invalid or outside the C{Conterminous US (CONUS)}, if the B{C{model}} was invalid, if conversion failed or if the query timed out. The C{"error"} is the C{HTTP-, IO-, SSL-, URL-} or other C{-Error} as a string (C{str}).
@see: U{NOAA National Geodetic Survey <https://www.NGS.NOAA.gov/INFO/geodesy.shtml>}, U{Geoid<https://www.NGS.NOAA.gov/web_services/geoid.shtml>}, U{USGS10mElev.py<https://Gist.GitHub.com/pyRobShrk>}, module L{geoids}, classes L{GeoidG2012B}, L{GeoidKarney} and L{GeoidPGM}. ''' lat=Lat(lat).toStr(prec=6), lon=Lon(lon).toStr(prec=6), model=(model if model else NN), timeout=Scalar(timeout=timeout)) # PYCHOK indent else: except Exception as x: # (HTTPError, IOError, ParseError, TypeError, ValueError) e = repr(x)
if __name__ == '__main__':
# <https://WikiPedia.org/wiki/Mount_Diablo> for f in (elevation2, # (1173.79, '3DEP 1/3 arc-second') geoidHeight2): # (-31.699, u'GEOID12B') t = f(37.8816, -121.9142) print(_COLONSPACE_(f.__name__, t))
# **) MIT License # # Copyright (C) 2016-2022 -- mrJean1 at Gmail -- All Rights Reserved. # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE.
# % python -m pygeodesy.elevations # elevation2: (1173.79, '3DEP 1/3 arc-second') # geoidHeight2: (-31.703, 'GEOID12B') |