def distance_and_azimuth(self, point, long_unroll=False, degrees=False): """ Return ellipsoidal distance between positions as well as the direction. Parameters ---------- point: GeoPoint object Latitude and longitude of position B. degrees: bool azimuths are returned in degrees if True otherwise in radians. Returns ------- s_ab: real scalar ellipsoidal distance [m] between position A and B. azimuth_a, azimuth_b direction [rad or deg] of line at position A and B relative to North, respectively. """ _check_frames(self, point) lat_a, lon_a = self.latitude, self.longitude lat_b, lon_b = point.latitude, point.longitude if degrees: lat_a, lon_a, lat_b, lon_b = deg((lat_a, lon_a, lat_b, lon_b)) return self.frame.inverse(lat_a, lon_a, lat_b, lon_b, z=self.z, long_unroll=long_unroll, degrees=degrees)
def geo_point(self, distance, azimuth, long_unroll=False, degrees=False): """ Return position B computed from current position, distance and azimuth. Parameters ---------- distance: real scalar ellipsoidal distance [m] between position A and B. azimuth_a: azimuth [rad or deg] of line at position A. degrees: bool azimuths are given in degrees if True otherwise in radians. Returns ------- point_b: GeoPoint object latitude and longitude of position B. azimuth_b azimuth [rad or deg] of line at position B. """ E = self.frame z = self.z if not degrees: azimuth = deg(azimuth) lat_a, lon_a = self.latitude_deg, self.longitude_deg latb, lonb, azimuth_b = E.direct(lat_a, lon_a, azimuth, distance, z=z, long_unroll=long_unroll, degrees=True) if not degrees: azimuth_b = rad(azimuth_b) point_b = GeoPoint(latitude=latb, longitude=lonb, z=z, frame=E, degrees=True) return point_b, azimuth_b
def direct(self, lat_a, lon_a, azimuth, distance, z=0, long_unroll=False, degrees=False): """ Return position B computed from position A, distance and azimuth. Parameters ---------- lat_a, lon_a: real scalars Latitude and longitude [rad or deg] of position a. azimuth_a: azimuth [rad or deg] of line at position A. distance: real scalar ellipsoidal distance [m] between position A and B. z : real scalar depth relative to Earth ellipsoid. degrees: bool angles are given in degrees if True otherwise in radians. Returns ------- lat_b, lon_b: real scalars Latitude and longitude of position b. azimuth_b azimuth [rad or deg] of line at position B. References ---------- C. F. F. Karney, Algorithms for geodesics, J. Geodesy 87(1), 43-55 `geographiclib <https://pypi.python.org/pypi/geographiclib>`_ """ geo = _Geodesic(self.a - z, self.f) outmask = _Geodesic.STANDARD if long_unroll: outmask = _Geodesic.STANDARD | _Geodesic.LONG_UNROLL if not degrees: lat_a, lon_a, azimuth = deg((lat_a, lon_a, azimuth)) result = geo.Direct(lat_a, lon_a, azimuth, distance, outmask=outmask) latb, lonb, azimuth_b = result['lat2'], result['lon2'], result['azi2'] if not degrees: return rad(latb), rad(lonb), rad(azimuth_b) return latb, lonb, azimuth_b
def inverse(self, lat_a, lon_a, lat_b, lon_b, z=0, long_unroll=False, degrees=False): """ Return ellipsoidal distance between positions as well as the direction. Parameters ---------- lat_a, lon_a: real scalars Latitude and longitude of position a. lat_b, lon_b: real scalars Latitude and longitude of position b. z : real scalar depth relative to Earth ellipsoid. degrees: bool angles are given in degrees if True otherwise in radians. Returns ------- s_ab: real scalar ellipsoidal distance [m] between position A and B. azimuth_a, azimuth_b direction [rad or deg] of line at position A and B relative to North, respectively. References ---------- C. F. F. Karney, Algorithms for geodesics, J. Geodesy 87(1), 43-55 `geographiclib <https://pypi.python.org/pypi/geographiclib>`_ """ outmask = _Geodesic.STANDARD if long_unroll: outmask = _Geodesic.STANDARD | _Geodesic.LONG_UNROLL geo = _Geodesic(self.a - z, self.f) if not degrees: lat_a, lon_a, lat_b, lon_b = deg((lat_a, lon_a, lat_b, lon_b)) result = geo.Inverse(lat_a, lon_a, lat_b, lon_b, outmask=outmask) azimuth_a = result['azi1'] if degrees else rad(result['azi1']) azimuth_b = result['azi2'] if degrees else rad(result['azi2']) return result['s12'], azimuth_a, azimuth_b
def direct(self, lat_a, lon_a, azimuth, distance, z=0, long_unroll=False, degrees=False): """ Return position B computed from position A, distance and azimuth. Parameters ---------- lat_a, lon_a: real scalars Latitude and longitude [rad or deg] of position a. azimuth_a: azimuth [rad or deg] of line at position A. distance: real scalar ellipsoidal distance [m] between position A and B. z : real scalar depth relative to Earth ellipsoid. degrees: bool angles are given in degrees if True otherwise in radians. Returns ------- lat_b, lon_b: real scalars Latitude and longitude of position b. azimuth_b azimuth [rad or deg] of line at position B. References ---------- C. F. F. Karney, Algorithms for geodesics, J. Geodesy 87(1), 43-55 `geographiclib <https://pypi.python.org/pypi/geographiclib>`_ """ geo = _Geodesic(self.a-z, self.f) outmask = _Geodesic.STANDARD if long_unroll: outmask = _Geodesic.STANDARD | _Geodesic.LONG_UNROLL if not degrees: lat_a, lon_a, azimuth = deg((lat_a, lon_a, azimuth)) result = geo.Direct(lat_a, lon_a, azimuth, distance, outmask=outmask) latb, lonb, azimuth_b = result['lat2'], result['lon2'], result['azi2'] if not degrees: return rad(latb), rad(lonb), rad(azimuth_b) return latb, lonb, azimuth_b
def inverse(self, lat_a, lon_a, lat_b, lon_b, z=0, long_unroll=False, degrees=False): """ Return ellipsoidal distance between positions as well as the direction. Parameters ---------- lat_a, lon_a: real scalars Latitude and longitude of position a. lat_b, lon_b: real scalars Latitude and longitude of position b. z : real scalar depth relative to Earth ellipsoid. degrees: bool angles are given in degrees if True otherwise in radians. Returns ------- s_ab: real scalar ellipsoidal distance [m] between position A and B. azimuth_a, azimuth_b direction [rad or deg] of line at position A and B relative to North, respectively. References ---------- C. F. F. Karney, Algorithms for geodesics, J. Geodesy 87(1), 43-55 `geographiclib <https://pypi.python.org/pypi/geographiclib>`_ """ outmask = _Geodesic.STANDARD if long_unroll: outmask = _Geodesic.STANDARD | _Geodesic.LONG_UNROLL geo = _Geodesic(self.a-z, self.f) if not degrees: lat_a, lon_a, lat_b, lon_b = deg((lat_a, lon_a, lat_b, lon_b)) result = geo.Inverse(lat_a, lon_a, lat_b, lon_b, outmask=outmask) azimuth_a = result['azi1'] if degrees else rad(result['azi1']) azimuth_b = result['azi2'] if degrees else rad(result['azi2']) return result['s12'], azimuth_a, azimuth_b
def displace(self, distance, azimuth, long_unroll=False, degrees=False): """ Return position B computed from current position, distance and azimuth. Parameters ---------- distance: real scalar ellipsoidal distance [m] between position A and B. azimuth_a: azimuth [rad or deg] of line at position A. degrees: bool azimuths are given in degrees if True otherwise in radians. Returns ------- point_b: GeoPoint object latitude and longitude of position B. azimuth_b azimuth [rad or deg] of line at position B. """ frame = self.frame z = self.z if not degrees: azimuth = deg(azimuth) lat_a, lon_a = self.latitude_deg, self.longitude_deg latb, lonb, azimuth_b = frame.direct(lat_a, lon_a, azimuth, distance, z=z, long_unroll=long_unroll, degrees=True) if not degrees: azimuth_b = rad(azimuth_b) point_b = frame.GeoPoint(latitude=latb, longitude=lonb, z=z, degrees=True) return point_b, azimuth_b
def distance_and_azimuth(self, point, long_unroll=False, degrees=False): """ Return ellipsoidal distance between positions as well as the direction. Parameters ---------- point: GeoPoint object Latitude and longitude of position B. degrees: bool azimuths are returned in degrees if True otherwise in radians. Returns ------- s_ab: real scalar ellipsoidal distance [m] between position A and B. azimuth_a, azimuth_b direction [rad or deg] of line at position A and B relative to North, respectively. """ _check_frames(self, point) gpoint = point.to_geo_point() lat_a, lon_a = self.latitude, self.longitude lat_b, lon_b = gpoint.latitude, gpoint.longitude z = 0.5 * (self.z + gpoint.z) if not np.allclose(self.z, gpoint.z): warnings.warn('Depths differ. Calculating distance at average ' 'depth={}'.format(str(z))) if degrees: lat_a, lon_a, lat_b, lon_b = deg((lat_a, lon_a, lat_b, lon_b)) return self.frame.inverse(lat_a, lon_a, lat_b, lon_b, z=z, long_unroll=long_unroll, degrees=degrees)
def elevation_deg(self): return deg(self.elevation)
def azimuth_deg(self): return deg(self.azimuth)
def longitude_deg(self): return deg(self.longitude)
def latitude_deg(self): return deg(self.latitude)