Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _GenPosition(self, arcmode, s12_a12, outmask):
"""Private: General solution of position along geodesic"""
from geographiclib.geodesic import Geodesic
a12 = lat2 = lon2 = azi2 = s12 = m12 = M12 = M21 = S12 = Math.nan
outmask &= self.caps & Geodesic.OUT_MASK
if not (arcmode or
(self.caps & (Geodesic.OUT_MASK & Geodesic.DISTANCE_IN))):
# Uninitialized or impossible distance calculation requested
return a12, lat2, lon2, azi2, s12, m12, M12, M21, S12
# Avoid warning about uninitialized B12.
B12 = 0.0; AB1 = 0.0
if arcmode:
# Interpret s12_a12 as spherical arc length
sig12 = math.radians(s12_a12)
ssig12, csig12 = Math.sincosd(s12_a12)
else:
# Interpret s12_a12 as distance
tau12 = s12_a12 / (self._b * (1 + self._A1m1))
s = math.sin(tau12); c = math.cos(tau12)
# tau2 = tau1 + tau12
B12 = - Geodesic._SinCosSeries(True,
self._stau1 * c + self._ctau1 * s,
self._ctau1 * c - self._stau1 * s,
self._C1pa)
sig12 = tau12 - (B12 - self._B11)
ssig12 = math.sin(sig12); csig12 = math.cos(sig12)
if abs(self.f) > 0.01:
# Reverted distance series is inaccurate for |f| > 1/100, so correct
# sig12 with 1 Newton iteration. The following table shows the
# approximate maximum error for a = WGS_a() and various f relative to
# GeodesicExact.
lat2 *= latsign
# Now we have
#
# 0 <= lon12 <= 180
# -90 <= lat1 <= 0
# lat1 <= lat2 <= -lat1
#
# longsign, swapp, latsign register the transformation to bring the
# coordinates to this canonical form. In all cases, 1 means no change was
# made. We make these transformations so that there are few cases to
# check, e.g., on verifying quadrants in atan2. In addition, this
# enforces some symmetries in the results returned.
# real phi, sbet1, cbet1, sbet2, cbet2, s12x, m12x
sbet1, cbet1 = Math.sincosd(lat1); sbet1 *= self._f1
# Ensure cbet1 = +epsilon at poles
sbet1, cbet1 = Math.norm(sbet1, cbet1); cbet1 = max(Geodesic.tiny_, cbet1)
sbet2, cbet2 = Math.sincosd(lat2); sbet2 *= self._f1
# Ensure cbet2 = +epsilon at poles
sbet2, cbet2 = Math.norm(sbet2, cbet2); cbet2 = max(Geodesic.tiny_, cbet2)
# If cbet1 < -sbet1, then cbet2 - cbet1 is a sensitive measure of the
# |bet1| - |bet2|. Alternatively (cbet1 >= -sbet1), abs(sbet2) + sbet1 is
# a better measure. This logic is used in assigning calp2 in Lambda12.
# Sometimes these quantities vanish and in that case we force bet2 = +/-
# bet1 exactly. An example where is is necessary is the inverse problem
# 48.522876735459 0 -48.52287673545898293 179.599720456223079643
# which failed with Visual Studio 10 (Release and Debug)
if cbet1 < -sbet1:
lat2 *= latsign
# Now we have
#
# 0 <= lon12 <= 180
# -90 <= lat1 <= 0
# lat1 <= lat2 <= -lat1
#
# longsign, swapp, latsign register the transformation to bring the
# coordinates to this canonical form. In all cases, 1 means no change was
# made. We make these transformations so that there are few cases to
# check, e.g., on verifying quadrants in atan2. In addition, this
# enforces some symmetries in the results returned.
# real phi, sbet1, cbet1, sbet2, cbet2, s12x, m12x
sbet1, cbet1 = Math.sincosd(lat1); sbet1 *= self._f1
# Ensure cbet1 = +epsilon at poles
sbet1, cbet1 = Math.norm(sbet1, cbet1); cbet1 = max(Geodesic.tiny_, cbet1)
sbet2, cbet2 = Math.sincosd(lat2); sbet2 *= self._f1
# Ensure cbet2 = +epsilon at poles
sbet2, cbet2 = Math.norm(sbet2, cbet2); cbet2 = max(Geodesic.tiny_, cbet2)
# If cbet1 < -sbet1, then cbet2 - cbet1 is a sensitive measure of the
# |bet1| - |bet2|. Alternatively (cbet1 >= -sbet1), abs(sbet2) + sbet1 is
# a better measure. This logic is used in assigning calp2 in Lambda12.
# Sometimes these quantities vanish and in that case we force bet2 = +/-
# bet1 exactly. An example where is is necessary is the inverse problem
# 48.522876735459 0 -48.52287673545898293 179.599720456223079643
# which failed with Visual Studio 10 (Release and Debug)
if cbet1 < -sbet1:
def _GenPosition(self, arcmode, s12_a12, outmask):
"""Private: General solution of position along geodesic"""
from geographiclib.geodesic import Geodesic
a12 = lat2 = lon2 = azi2 = s12 = m12 = M12 = M21 = S12 = Math.nan
outmask &= self.caps & Geodesic.OUT_MASK
if not (arcmode or
(self.caps & (Geodesic.OUT_MASK & Geodesic.DISTANCE_IN))):
# Uninitialized or impossible distance calculation requested
return a12, lat2, lon2, azi2, s12, m12, M12, M21, S12
# Avoid warning about uninitialized B12.
B12 = 0.0; AB1 = 0.0
if arcmode:
# Interpret s12_a12 as spherical arc length
sig12 = math.radians(s12_a12)
ssig12, csig12 = Math.sincosd(s12_a12)
else:
# Interpret s12_a12 as distance
tau12 = s12_a12 / (self._b * (1 + self._A1m1))
s = math.sin(tau12); c = math.cos(tau12)
# tau2 = tau1 + tau12
B12 = - Geodesic._SinCosSeries(True,
self._stau1 * c + self._ctau1 * s,
self._ctau1 * c - self._stau1 * s,
self._C1pa)
sig12 = tau12 - (B12 - self._B11)
ssig12 = math.sin(sig12); csig12 = math.cos(sig12)
if abs(self.f) > 0.01:
# Reverted distance series is inaccurate for |f| > 1/100, so correct
# sig12 with 1 Newton iteration. The following table shows the
# approximate maximum error for a = WGS_a() and various f relative to
# GeodesicExact.
# -90 <= lat1 <= 0
# lat1 <= lat2 <= -lat1
#
# longsign, swapp, latsign register the transformation to bring the
# coordinates to this canonical form. In all cases, 1 means no change was
# made. We make these transformations so that there are few cases to
# check, e.g., on verifying quadrants in atan2. In addition, this
# enforces some symmetries in the results returned.
# real phi, sbet1, cbet1, sbet2, cbet2, s12x, m12x
sbet1, cbet1 = Math.sincosd(lat1); sbet1 *= self._f1
# Ensure cbet1 = +epsilon at poles
sbet1, cbet1 = Math.norm(sbet1, cbet1); cbet1 = max(Geodesic.tiny_, cbet1)
sbet2, cbet2 = Math.sincosd(lat2); sbet2 *= self._f1
# Ensure cbet2 = +epsilon at poles
sbet2, cbet2 = Math.norm(sbet2, cbet2); cbet2 = max(Geodesic.tiny_, cbet2)
# If cbet1 < -sbet1, then cbet2 - cbet1 is a sensitive measure of the
# |bet1| - |bet2|. Alternatively (cbet1 >= -sbet1), abs(sbet2) + sbet1 is
# a better measure. This logic is used in assigning calp2 in Lambda12.
# Sometimes these quantities vanish and in that case we force bet2 = +/-
# bet1 exactly. An example where is is necessary is the inverse problem
# 48.522876735459 0 -48.52287673545898293 179.599720456223079643
# which failed with Visual Studio 10 (Release and Debug)
if cbet1 < -sbet1:
if cbet2 == cbet1:
sbet2 = sbet1 if sbet2 < 0 else -sbet1
else:
if abs(sbet2) == -sbet1:
outmask &= Geodesic.OUT_MASK
# Compute longitude difference (AngDiff does this carefully). Result is
# 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
#
outmask &= Geodesic.OUT_MASK
# Compute longitude difference (AngDiff does this carefully). Result is
# 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
#