def testOffsetValue(self): """Test if offset() returns the expected value. """ # This should cover arcs over the meridian, across the pole, etc. for lon1, lat1 in self._dataset: point1 = SpherePoint(lon1, lat1) if point1.atPole(): continue for lon2, lat2 in self._dataset: if lon1 == lon2 and lat1 == lat2: continue point2 = SpherePoint(lon2, lat2) bearing = point1.bearingTo(point2) distance = point1.separation(point2) newPoint = point1.offset(bearing, distance) self.assertIsInstance(newPoint, SpherePoint) if point1.isFinite() and point2.isFinite(): if not point2.atPole(): self.assertAnglesAlmostEqual( point2.getLongitude(), newPoint.getLongitude()) self.assertAnglesAlmostEqual( point2.getLatitude(), newPoint.getLatitude()) else: self.assertTrue(math.isnan( newPoint.getLongitude().asRadians())) self.assertTrue(math.isnan( newPoint.getLatitude().asRadians())) # Test precision near the poles lon = 123.0*degrees almostPole = SpherePoint(lon, self.nextDown(90.0*degrees)) goSouth = almostPole.offset(-90.0*degrees, 90.0*degrees) self.assertAnglesAlmostEqual(lon, goSouth.getLongitude()) self.assertAnglesAlmostEqual(0.0*degrees, goSouth.getLatitude()) goEast = almostPole.offset(0.0*degrees, 90.0*degrees) self.assertAnglesAlmostEqual(lon + 90.0*degrees, goEast.getLongitude()) self.assertAnglesAlmostEqual(0.0*degrees, goEast.getLatitude())
def testOffsetError(self): """Test if offset() correctly handles invalid input. """ northPole = SpherePoint(0.0*degrees, 90.0*degrees) southPole = SpherePoint(0.0*degrees, -90.0*degrees) nonSingularity = SpherePoint(0.0*degrees, 45.0*degrees) with self.assertRaises(pexEx.DomainError): northPole.offset(-90.0*degrees, 10.0*degrees) with self.assertRaises(pexEx.DomainError): southPole.offset(90.0*degrees, 0.1*degrees) with self.assertRaises(pexEx.InvalidParameterError): nonSingularity.offset(90.0*degrees, -0.1*degrees)
def testOffsetValue(self): """Test if offset() returns the expected value. """ # This should cover arcs over the meridian, across the pole, etc. for lon1, lat1 in self._dataset: point1 = SpherePoint(lon1, lat1) for lon2, lat2 in self._dataset: if lon1 == lon2 and lat1 == lat2: continue point2 = SpherePoint(lon2, lat2) bearing = point1.bearingTo(point2) distance = point1.separation(point2) # offsetting point1 by bearing and distance should produce the same result as point2 newPoint = point1.offset(bearing, distance) self.assertIsInstance(newPoint, SpherePoint) self.assertSpherePointsAlmostEqual(point2, newPoint) if newPoint.atPole(): self.assertAnglesAlmostEqual(newPoint.getLongitude(), 0 * degrees) # measuring the separation and bearing from point1 to the new point # should produce the requested separation and bearing measuredDistance = point1.separation(newPoint) self.assertAnglesAlmostEqual(measuredDistance, distance) if abs(measuredDistance.asDegrees() - 180) > 1e-5: # The two points are not opposite each other on the sphere, # so the bearing has a well defined value measuredBearing = point1.bearingTo(newPoint) self.assertAnglesAlmostEqual(measuredBearing, bearing) # offset by a negative amount in the opposite direction should produce the same result newPoint2 = point1.offset(bearing + 180 * degrees, -distance) self.assertIsInstance(newPoint2, SpherePoint) # check angular separation (longitude is checked below) self.assertSpherePointsAlmostEqual(newPoint, newPoint2) if point1.isFinite() and point2.isFinite(): if not point2.atPole(): self.assertAnglesAlmostEqual(point2.getLongitude(), newPoint.getLongitude()) self.assertAnglesAlmostEqual(point2.getLongitude(), newPoint2.getLongitude()) self.assertAnglesAlmostEqual(point2.getLatitude(), newPoint.getLatitude()) self.assertAnglesAlmostEqual(point2.getLatitude(), newPoint2.getLatitude()) else: self.assertTrue( math.isnan(newPoint.getLongitude().asRadians())) self.assertTrue( math.isnan(newPoint2.getLongitude().asRadians())) self.assertTrue( math.isnan(newPoint.getLatitude().asRadians())) self.assertTrue( math.isnan(newPoint2.getLatitude().asRadians())) # Test precision near the poles lon = 123.0 * degrees almostPole = SpherePoint(lon, self.nextDown(90.0 * degrees)) goSouth = almostPole.offset(-90.0 * degrees, 90.0 * degrees) self.assertAnglesAlmostEqual(lon, goSouth.getLongitude()) self.assertAnglesAlmostEqual(0.0 * degrees, goSouth.getLatitude()) goEast = almostPole.offset(0.0 * degrees, 90.0 * degrees) self.assertAnglesAlmostEqual(lon + 90.0 * degrees, goEast.getLongitude()) self.assertAnglesAlmostEqual(0.0 * degrees, goEast.getLatitude())