Coverage for pygeodesy/lcc.py : 97%

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 -*-
classes L{Conic}, L{Conics} registry, L{LCCError} and position class L{Lcc}.
See U{LCC<https://WikiPedia.org/wiki/Lambert_conformal_conic_projection>}, U{Lambert Conformal Conic to Geographic Transformation Formulae <https://www.Linz.govt.NZ/data/geodetic-system/coordinate-conversion/ projection-conversions/lambert-conformal-conic-geographic>}, U{Lambert Conformal Conic Projection <https://MathWorld.Wolfram.com/LambertConformalConicProjection.html>} and John P. Snyder U{'Map Projections - A Working Manual' <https://pubs.er.USGS.gov/djvu/PP/PP_1395.pdf>}, 1987, pp 107-109.
@newfield example: Example, Examples '''
_xinstanceof, _xsubclassof LatLon4Tuple, LatLonDatum3Tuple, \ _NamedBase, _NamedEnum, _NamedEnumItem, nameof, \ PhiLam2Tuple, _xnamed # PYCHOK indent
# all public constants, classes and functions
'''Lambert conformal conic projection (1- or 2-SP). '''
k0=1, opt3=0, name='', auth=''): '''New Lambert conformal conic projection.
@arg latlon0: Origin with (ellipsoidal) datum (C{LatLon}). @arg par1: First standard parallel (C{degrees90}). @kwarg par2: Optional, second standard parallel (C{degrees90}). @kwarg E0: Optional, false easting (C{meter}). @kwarg N0: Optional, false northing (C{meter}). @kwarg k0: Optional scale factor (C{scalar}). @kwarg opt3: Optional meridian (C{degrees180}). @kwarg name: Optional name of the conic (C{str}). @kwarg auth: Optional authentication authority (C{str}).
@return: A Lambert projection (L{Conic}).
@raise TypeError: Non-ellipsoidal B{C{latlon0}}.
@raise ValueError: Invalid B{C{par1}}, B{C{par2}}, B{C{E0}}, B{C{N0}}, B{C{k0}} or B{C{opt3}}.
@example:
>>> from pygeodesy import Conic, Datums, ellipsoidalNvector >>> ll0 = ellipsoidalNvector.LatLon(23, -96, datum=Datums.NAD27) >>> Snyder = Conic(ll0, 33, 45, E0=0, N0=0, name='Snyder') '''
self._k0 = Scalar_(k0, name='k0') self._opt3 = Lam_(opt3, name='opt3')
def auth(self): '''Get the authentication authority (C{str}). '''
def datum(self): '''Get the datum (L{Datum}). '''
def E0(self): '''Get the false easting (C{meter}). '''
def k0(self): '''Get scale factor (C{float}). '''
def lat0(self): '''Get the origin latitude (C{degrees90}). '''
def latlon0(self): '''Get the central origin (L{LatLon2Tuple}C{(lat, lon)}). '''
def lam0(self): '''Get the central meridian (C{radians}). '''
def lon0(self): '''Get the central meridian (C{degrees180}). '''
def N0(self): '''Get the false northing (C{meter}). '''
def name2(self): '''Get the conic and datum names as "conic.datum" (C{str}). '''
def opt3(self): '''Get the optional meridian (C{degrees180}). '''
def par1(self): '''Get the 1st standard parallel (C{degrees90}). '''
def par2(self): '''Get the 2nd standard parallel (C{degrees90}). '''
def phi0(self): '''Get the origin latitude (C{radians}). '''
def philam0(self): '''Get the central origin (L{PhiLam2Tuple}C{(phi, lam)}). '''
def SP(self): '''Get the number of standard parallels (C{int}). '''
'''Convert this conic to the given datum.
@arg datum: Ellipsoidal datum to use (L{Datum}).
@return: Converted conic, unregistered (L{Conic}).
@raise TypeError: Non-ellipsoidal B{C{datum}}. ''' raise IsnotError('ellipsoidal', datum=datum)
else: / (log(t1) - log(t2))
'''Return this conic as a string.
@kwarg prec: Optional number of decimals, unstripped (C{int}).
@return: Conic attributes (C{str}). ''' 'E0', 'N0', 'k0', 'SP', datum=self.datum) else: 'E0', 'N0', 'k0', 'SP', datum=self.datum)
'''(INTERNAL) Copy this conic to c. @arg c: Duplicate (L{Conic}). '''
'''(INTERNAL) Compute m(lat). '''
'''(INTERNAL) Compute p(lat). '''
'''(INTERNAL) Compute r(t). '''
'''(INTERNAL) Compute t(lat). '''
'''(INTERNAL) Compute x(t_x). '''
# AsLb = Conic(_LLEB(-14.2666667, 170, datum=Datums.NAD27), 0, 0, E0=500000, N0=0, name='AsLb', auth='EPSG:2155'), # American Samoa ... SP=1 ! Be08Lb = Conic(_LLEB(50.7978150, 4.359215833, datum=Datums.GRS80), 49.833333, 51.166667, E0=649328.0, N0=665262.0, name='Be08Lb', auth='EPSG:9802'), # Belgium Be72Lb = Conic(_LLEB(90, 4.3674867, datum=Datums.NAD83), 49.8333339, 51.1666672, E0=150000.013, N0=5400088.438, name='Be72Lb', auth='EPSG:31370'), # Belgium Fr93Lb = Conic(_LLEB(46.5, 3, datum=Datums.WGS84), 49, 44, E0=700000, N0=6600000, name='Fr93Lb', auth='EPSG:2154'), # RFG93, France MaNLb = Conic(_LLEB(33.3, -5.4, datum=Datums.NTF), 31.73, 34.87, E0=500000, N0=300000, name='MaNLb'), # Marocco MxLb = Conic(_LLEB(12, -102, datum=Datums.WGS84), 17.5, 29.5, E0=2500000, N0=0, name='MxLb', auth='EPSG:2155'), # Mexico PyT_Lb = Conic(_LLEB(46.8, 2.33722917, datum=Datums.NTF), 45.89893890000052, 47.69601440000037, E0=600000, N0=200000, name='PyT_Lb', auth='Test'), # France? USA_Lb = Conic(_LLEB(23, -96, datum=Datums.WGS84), 33, 45, E0=0, N0=0, name='USA_Lb'), # Conterminous, contiguous USA? WRF_Lb = Conic(_LLEB(40, -97, datum=Datums.WGS84), 33, 45, E0=0, N0=0, name='WRF_Lb', auth='EPSG:4326') # World )
'''Lambert Conformal Conic C{LCC} or other L{Lcc} issue. '''
'''Lambert conformal conic East-/Northing location. '''
'''New L{Lcc} Lamber conformal conic position.
@arg e: Easting (C{meter}). @arg n: Northing (C{meter}). @kwarg h: Optional height (C{meter}). @kwarg conic: Optional, the conic projection (L{Conic}). @kwarg name: Optional name (C{str}).
@return: The Lambert location (L{Lcc}).
@raise LCCError: Invalid B{C{h}} or invalid or negative B{C{e}} or B{C{n}}.
@raise TypeError: If B{C{conic}} is not L{Conic}.
@example:
>>> lb = Lcc(448251, 5411932.0001) ''' self._height = Height(h, name='h', Error=LCCError)
def conic(self): '''Get the conic projection (L{Conic}). '''
def easting(self): '''Get the easting (C{meter}). '''
def height(self): '''Get the height (C{meter}). '''
def latlon(self): '''Get the lat- and longitude in C{degrees} (L{LatLon2Tuple}). '''
def northing(self): '''Get the northing (C{meter}). '''
def philam(self): '''Get the lat- and longitude in C{radians} (L{PhiLam2Tuple}). ''' radians(self.latlon.lon))
def to3lld(self, datum=None): # PYCHOK no cover '''DEPRECATED, use method C{toLatLon}.
@kwarg datum: Optional datum to use, otherwise use this B{C{Lcc}}'s conic.datum (C{Datum}).
@return: A L{LatLonDatum3Tuple}C{(lat, lon, datum)}.
@raise TypeError: If B{C{datum}} is not ellipsoidal. ''' if datum in (None, self.conic.datum): r = LatLonDatum3Tuple(self.latlon.lat, self.latlon.lon, self.conic.datum) else: r = self.toLatLon(LatLon=None, datum=datum) r = LatLonDatum3Tuple(r.lat, r.lon, r.datum) return self._xnamed(r)
'''Convert this L{Lcc} to an (ellipsoidal) geodetic point.
@kwarg LatLon: Optional, ellipsoidal class to return the geodetic point (C{LatLon}) or C{None}. @kwarg datum: Optional datum to use, otherwise use this B{C{Lcc}}'s conic.datum (C{Datum}). @kwarg height: Optional height for the point, overriding the default height (C{meter}).
@return: The point (B{C{LatLon}}) or a L{LatLon4Tuple}C{(lat, lon, height, datum)} if B{C{LatLon}} is C{None}.
@raise TypeError: If B{C{LatLon}} or B{C{datum}} is not ellipsoidal. '''
c = c.toDatum(datum)
LatLon(lat, lon, height=h, datum=d)
'''Return a string representation of this L{Lcc} position.
@kwarg prec: Optional number of decimals, unstripped (C{int}). @kwarg fmt: Optional, enclosing backets format (C{str}). @kwarg sep: Optional separator between name:values (C{str}). @kwarg m: Optional unit of the height, default meter (C{str}). @kwarg C: Optionally, include name of conic and datum (C{bool}).
@return: This Lcc as "[E:meter, N:meter, H:m, C:Conic.Datum]" (C{str}). ''' k += 'C' t += [self.conic.name2]
'''Return a string representation of this L{Lcc} position.
@kwarg prec: Optional number of decimal, unstripped (C{int}). @kwarg sep: Optional separator to join (C{str}). @kwarg m: Optional height units, default C{meter} (C{str}).
@return: This Lcc as "easting nothing" C{str} in C{meter} plus " height" and 'm' if heigth is non-zero (C{str}).
@example:
>>> lb = Lcc(448251, 5411932.0001) >>> lb.toStr(4) # 448251.0 5411932.0001 >>> lb.toStr(sep=', ') # 448251, 5411932 ''' fstr(self._northing, prec=prec)] t += ['%+.2f%s' % (self._height, m)]
**Lcc_kwds): '''Convert an (ellipsoidal) geodetic point to a I{Lambert} location.
@arg latlon: Ellipsoidal point (C{LatLon}). @kwarg conic: Optional Lambert projection to use (L{Conic}). @kwarg height: Optional height for the point, overriding the default height (C{meter}). @kwarg Lcc: Optional class to return the I{Lambert} location (L{Lcc}). @kwarg name: Optional B{C{Lcc}} name (C{str}). @kwarg Lcc_kwds: Optional, additional B{C{Lcc}} keyword arguments, ignored if B{C{Lcc=None}}.
@return: The I{Lambert} location (L{Lcc}) or an L{EasNor3Tuple}C{(easting, northing, height)} if B{C{Lcc}} is C{None}.
@raise TypeError: If B{C{latlon}} is not ellipsoidal. '''
Lcc(e, n, h=h, conic=c, **Lcc_kwds)
if __name__ == '__main__':
# print all for c in (Conics,): c = '\n' + repr(c) print('\n# '.join(c.split('\n')))
# **) MIT License # # Copyright (C) 2016-2020 -- 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.lcc
# Conics.Be08Lb: Conic(name='Be08Lb', lat0=50.797815, lon0=4.35921583, par1=49.833333, par2=51.166667, E0=649328, N0=665262, k0=1, SP=2, datum=(name='GRS80', ellipsoid=Ellipsoids.GRS80, transform=Transforms.WGS84), # Conics.Be72Lb: Conic(name='Be72Lb', lat0=90, lon0=4.3674867, par1=49.8333339, par2=51.1666672, E0=150000.013, N0=5400088.438, k0=1, SP=2, datum=(name='NAD83', ellipsoid=Ellipsoids.GRS80, transform=Transforms.NAD83), # Conics.Fr93Lb: Conic(name='Fr93Lb', lat0=46.5, lon0=3, par1=49, par2=44, E0=700000, N0=6600000, k0=1, SP=2, datum=(name='WGS84', ellipsoid=Ellipsoids.WGS84, transform=Transforms.WGS84), # Conics.MaNLb: Conic(name='MaNLb', lat0=33.3, lon0=-5.4, par1=31.73, par2=34.87, E0=500000, N0=300000, k0=1, SP=2, datum=(name='NTF', ellipsoid=Ellipsoids.Clarke1880IGN, transform=Transforms.NTF), # Conics.MxLb: Conic(name='MxLb', lat0=12, lon0=-102, par1=17.5, par2=29.5, E0=2500000, N0=0, k0=1, SP=2, datum=(name='WGS84', ellipsoid=Ellipsoids.WGS84, transform=Transforms.WGS84), # Conics.PyT_Lb: Conic(name='PyT_Lb', lat0=46.8, lon0=2.33722917, par1=45.8989389, par2=47.6960144, E0=600000, N0=200000, k0=1, SP=2, datum=(name='NTF', ellipsoid=Ellipsoids.Clarke1880IGN, transform=Transforms.NTF), # Conics.USA_Lb: Conic(name='USA_Lb', lat0=23, lon0=-96, par1=33, par2=45, E0=0, N0=0, k0=1, SP=2, datum=(name='WGS84', ellipsoid=Ellipsoids.WGS84, transform=Transforms.WGS84), # Conics.WRF_Lb: Conic(name='WRF_Lb', lat0=40, lon0=-97, par1=33, par2=45, E0=0, N0=0, k0=1, SP=2, datum=(name='WGS84', ellipsoid=Ellipsoids.WGS84, transform=Transforms.WGS84), |