Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# east-going and meridional geodesics.
lon12, lon12s = Math.AngDiff(lon1, lon2)
# Make longitude difference positive.
lonsign = 1 if lon12 >= 0 else -1
# If very close to being on the same half-meridian, then make it so.
lon12 = lonsign * Math.AngRound(lon12)
lon12s = Math.AngRound((180 - lon12) - lonsign * lon12s)
lam12 = math.radians(lon12)
if lon12 > 90:
slam12, clam12 = Math.sincosd(lon12s); clam12 = -clam12
else:
slam12, clam12 = Math.sincosd(lon12)
# If really close to the equator, treat as on equator.
lat1 = Math.AngRound(Math.LatFix(lat1))
lat2 = Math.AngRound(Math.LatFix(lat2))
# Swap points so that point with higher (abs) latitude is point 1
# If one latitude is a nan, then it becomes lat1.
swapp = -1 if abs(lat1) < abs(lat2) else 1
if swapp < 0:
lonsign *= -1
lat2, lat1 = lat1, lat2
# Make lat1 <= 0
latsign = 1 if lat1 < 0 else -1
lat1 *= latsign
lat2 *= latsign
# Now we have
#
# 0 <= lon12 <= 180
# -90 <= lat1 <= 0
# lat1 <= lat2 <= -lat1
#
:param a12: spherical arc length from the first point to the second
in degrees
:param outmask: the :ref:`output mask `
:return: a :ref:`dict`
Compute geodesic starting at (*lat1*, *lon1*) with azimuth *azi1*
and arc length *a12*. The default value of *outmask* is STANDARD,
i.e., the *lat1*, *lon1*, *azi1*, *lat2*, *lon2*, *azi2*, *s12*,
*a12* entries are returned.
"""
a12, lat2, lon2, azi2, s12, m12, M12, M21, S12 = self._GenDirect(
lat1, lon1, azi1, True, a12, outmask)
outmask &= Geodesic.OUT_MASK
result = {'lat1': Math.LatFix(lat1),
'lon1': lon1 if outmask & Geodesic.LONG_UNROLL else
Math.AngNormalize(lon1),
'azi1': Math.AngNormalize(azi1),
'a12': a12}
if outmask & Geodesic.DISTANCE: result['s12'] = s12
if outmask & Geodesic.LATITUDE: result['lat2'] = lat2
if outmask & Geodesic.LONGITUDE: result['lon2'] = lon2
if outmask & Geodesic.AZIMUTH: result['azi2'] = azi2
if outmask & Geodesic.REDUCEDLENGTH: result['m12'] = m12
if outmask & Geodesic.GEODESICSCALE:
result['M12'] = M12; result['M21'] = M21
if outmask & Geodesic.AREA: result['S12'] = S12
return result
# in [-180, 180] but -180 is only for west-going geodesics. 180 is for
# east-going and meridional geodesics.
lon12, lon12s = Math.AngDiff(lon1, lon2)
# Make longitude difference positive.
lonsign = 1 if lon12 >= 0 else -1
# If very close to being on the same half-meridian, then make it so.
lon12 = lonsign * Math.AngRound(lon12)
lon12s = Math.AngRound((180 - lon12) - lonsign * lon12s)
lam12 = math.radians(lon12)
if lon12 > 90:
slam12, clam12 = Math.sincosd(lon12s); clam12 = -clam12
else:
slam12, clam12 = Math.sincosd(lon12)
# If really close to the equator, treat as on equator.
lat1 = Math.AngRound(Math.LatFix(lat1))
lat2 = Math.AngRound(Math.LatFix(lat2))
# Swap points so that point with higher (abs) latitude is point 1
# If one latitude is a nan, then it becomes lat1.
swapp = -1 if abs(lat1) < abs(lat2) else 1
if swapp < 0:
lonsign *= -1
lat2, lat1 = lat1, lat2
# Make lat1 <= 0
latsign = 1 if lat1 < 0 else -1
lat1 *= latsign
lat2 *= latsign
# Now we have
#
# 0 <= lon12 <= 180
# -90 <= lat1 <= 0
# lat1 <= lat2 <= -lat1
returned.
"""
a12, s12, salp1,calp1, salp2,calp2, m12, M12, M21, S12 = self._GenInverse(
lat1, lon1, lat2, lon2, outmask)
outmask &= Geodesic.OUT_MASK
if outmask & Geodesic.LONG_UNROLL:
lon12, e = Math.AngDiff(lon1, lon2)
lon2 = (lon1 + lon12) + e
else:
lon2 = Math.AngNormalize(lon2)
result = {'lat1': Math.LatFix(lat1),
'lon1': lon1 if outmask & Geodesic.LONG_UNROLL else
Math.AngNormalize(lon1),
'lat2': Math.LatFix(lat2),
'lon2': lon2}
result['a12'] = a12
if outmask & Geodesic.DISTANCE: result['s12'] = s12
if outmask & Geodesic.AZIMUTH:
result['azi1'] = Math.atan2d(salp1, calp1)
result['azi2'] = Math.atan2d(salp2, calp2)
if outmask & Geodesic.REDUCEDLENGTH: result['m12'] = m12
if outmask & Geodesic.GEODESICSCALE:
result['M12'] = M12; result['M21'] = M21
if outmask & Geodesic.AREA: result['S12'] = S12
return result
Compute geodesic between (*lat1*, *lon1*) and (*lat2*, *lon2*).
The default value of *outmask* is STANDARD, i.e., the *lat1*,
*lon1*, *azi1*, *lat2*, *lon2*, *azi2*, *s12*, *a12* entries are
returned.
"""
a12, s12, salp1,calp1, salp2,calp2, m12, M12, M21, S12 = self._GenInverse(
lat1, lon1, lat2, lon2, outmask)
outmask &= Geodesic.OUT_MASK
if outmask & Geodesic.LONG_UNROLL:
lon12, e = Math.AngDiff(lon1, lon2)
lon2 = (lon1 + lon12) + e
else:
lon2 = Math.AngNormalize(lon2)
result = {'lat1': Math.LatFix(lat1),
'lon1': lon1 if outmask & Geodesic.LONG_UNROLL else
Math.AngNormalize(lon1),
'lat2': Math.LatFix(lat2),
'lon2': lon2}
result['a12'] = a12
if outmask & Geodesic.DISTANCE: result['s12'] = s12
if outmask & Geodesic.AZIMUTH:
result['azi1'] = Math.atan2d(salp1, calp1)
result['azi2'] = Math.atan2d(salp2, calp2)
if outmask & Geodesic.REDUCEDLENGTH: result['m12'] = m12
if outmask & Geodesic.GEODESICSCALE:
result['M12'] = M12; result['M21'] = M21
if outmask & Geodesic.AREA: result['S12'] = S12
return result
"""
from geographiclib.geodesic import Geodesic
self.a = geod.a
"""The equatorial radius in meters (readonly)"""
self.f = geod.f
"""The flattening (readonly)"""
self._b = geod._b
self._c2 = geod._c2
self._f1 = geod._f1
self.caps = (caps | Geodesic.LATITUDE | Geodesic.AZIMUTH |
Geodesic.LONG_UNROLL)
"""the capabilities (readonly)"""
# Guard against underflow in salp0
self.lat1 = Math.LatFix(lat1)
"""the latitude of the first point in degrees (readonly)"""
self.lon1 = lon1
"""the longitude of the first point in degrees (readonly)"""
if Math.isnan(salp1) or Math.isnan(calp1):
self.azi1 = Math.AngNormalize(azi1)
self.salp1, self.calp1 = Math.sincosd(Math.AngRound(azi1))
else:
self.azi1 = azi1
"""the azimuth at the first point in degrees (readonly)"""
self.salp1 = salp1
"""the sine of the azimuth at the first point (readonly)"""
self.calp1 = calp1
"""the cosine of the azimuth at the first point (readonly)"""
# real cbet1, sbet1
sbet1, cbet1 = Math.sincosd(Math.AngRound(lat1)); sbet1 *= self._f1
# east-going and meridional geodesics.
lon12, lon12s = Math.AngDiff(lon1, lon2)
# Make longitude difference positive.
lonsign = 1 if lon12 >= 0 else -1
# If very close to being on the same half-meridian, then make it so.
lon12 = lonsign * Math.AngRound(lon12)
lon12s = Math.AngRound((180 - lon12) - lonsign * lon12s)
lam12 = math.radians(lon12)
if lon12 > 90:
slam12, clam12 = Math.sincosd(lon12s); clam12 = -clam12
else:
slam12, clam12 = Math.sincosd(lon12)
# If really close to the equator, treat as on equator.
lat1 = Math.AngRound(Math.LatFix(lat1))
lat2 = Math.AngRound(Math.LatFix(lat2))
# Swap points so that point with higher (abs) latitude is point 1
# If one latitude is a nan, then it becomes lat1.
swapp = -1 if abs(lat1) < abs(lat2) else 1
if swapp < 0:
lonsign *= -1
lat2, lat1 = lat1, lat2
# Make lat1 <= 0
latsign = 1 if lat1 < 0 else -1
lat1 *= latsign
lat2 *= latsign
# Now we have
#
# 0 <= lon12 <= 180
# -90 <= lat1 <= 0
# lat1 <= lat2 <= -lat1
#
Compute geodesic between (*lat1*, *lon1*) and (*lat2*, *lon2*).
The default value of *outmask* is STANDARD, i.e., the *lat1*,
*lon1*, *azi1*, *lat2*, *lon2*, *azi2*, *s12*, *a12* entries are
returned.
"""
a12, s12, salp1,calp1, salp2,calp2, m12, M12, M21, S12 = self._GenInverse(
lat1, lon1, lat2, lon2, outmask)
outmask &= Geodesic.OUT_MASK
if outmask & Geodesic.LONG_UNROLL:
lon12, e = Math.AngDiff(lon1, lon2)
lon2 = (lon1 + lon12) + e
else:
lon2 = Math.AngNormalize(lon2)
result = {'lat1': Math.LatFix(lat1),
'lon1': lon1 if outmask & Geodesic.LONG_UNROLL else
Math.AngNormalize(lon1),
'lat2': Math.LatFix(lat2),
'lon2': lon2}
result['a12'] = a12
if outmask & Geodesic.DISTANCE: result['s12'] = s12
if outmask & Geodesic.AZIMUTH:
result['azi1'] = Math.atan2d(salp1, calp1)
result['azi2'] = Math.atan2d(salp2, calp2)
if outmask & Geodesic.REDUCEDLENGTH: result['m12'] = m12
if outmask & Geodesic.GEODESICSCALE:
result['M12'] = M12; result['M21'] = M21
if outmask & Geodesic.AREA: result['S12'] = S12
return result