def test_consistent_radius(self): poly1 = np.array([(-50, 69), (-36, 69), (-36, 64), (-50, 64)]) poly2 = np.array([(-46, 68), (-40, 68), (-40, 65), (-45, 65)]) poly_outer = SphPolygon(np.deg2rad(poly1), radius=6371) poly_inner = SphPolygon(np.deg2rad(poly2), radius=6371) poly_inter = poly_outer.intersection(poly_inner) self.assertAlmostEqual(poly_inter.radius, poly_inner.radius) # Well, now when we are at it. self.assertAlmostEqual(poly_inter.area(), poly_inner.area())
def _get_intersection_coverage(source_polygon: SphPolygon, target_polygon: SphPolygon) -> float: """Get fraction of output grid that will be filled with input data.""" intersect_polygon = source_polygon.intersection(target_polygon) if intersect_polygon is None: same_shape = source_polygon.vertices.shape == target_polygon.vertices.shape if same_shape and (source_polygon.vertices == target_polygon.vertices).all(): # they are exactly the same return 1.0 return 0.0 return intersect_polygon.area() / target_polygon.area()
def test_bool(self): """Test the intersection and union functions.""" vertices = np.array([[180, 90, 0, -90], [89, 89, 89, 89]]).T poly1 = SphPolygon(np.deg2rad(vertices)) vertices = np.array([[-45, -135, 135, 45], [89, 89, 89, 89]]).T poly2 = SphPolygon(np.deg2rad(vertices)) uni = np.array([[157.5, 89.23460094], [-225., 89.], [112.5, 89.23460094], [90., 89.], [67.5, 89.23460094], [45., 89.], [22.5, 89.23460094], [0., 89.], [-22.5, 89.23460094], [-45., 89.], [-67.5, 89.23460094], [-90., 89.], [-112.5, 89.23460094], [-135., 89.], [-157.5, 89.23460094], [-180., 89.]]) inter = np.array([[157.5, 89.23460094], [112.5, 89.23460094], [67.5, 89.23460094], [22.5, 89.23460094], [-22.5, 89.23460094], [-67.5, 89.23460094], [-112.5, 89.23460094], [-157.5, 89.23460094]]) poly_inter = poly1.intersection(poly2) poly_union = poly1.union(poly2) self.assertTrue(poly_inter.area() <= poly_union.area()) self.assertTrue(np.allclose(poly_inter.vertices, np.deg2rad(inter))) self.assertTrue(np.allclose(poly_union.vertices, np.deg2rad(uni))) # Test 2 polygons sharing 2 contiguous edges. vertices1 = np.array([[-10, 10], [-5, 10], [0, 10], [5, 10], [10, 10], [10, -10], [-10, -10]]) vertices2 = np.array([[-5, 10], [0, 10], [5, 10], [5, -5], [-5, -5]]) vertices3 = np.array([[5, 10], [5, -5], [-5, -5], [-5, 10], [0, 10]]) poly1 = SphPolygon(np.deg2rad(vertices1)) poly2 = SphPolygon(np.deg2rad(vertices2)) poly_inter = poly1.intersection(poly2) self.assertTrue(np.allclose(poly_inter.vertices, np.deg2rad(vertices3))) # Test when last node of the intersection is the last vertice of the # second polygon. swath_vertices = np.array([[-115.32268301, 66.32946139], [-61.48397172, 58.56799254], [-60.25004314, 58.00754686], [-71.35057076, 49.60229517], [-113.746486, 56.03008985]]) area_vertices = np.array([[-68.32812107, 52.3480829], [-67.84993896, 53.07015692], [-55.54651296, 64.9254637], [-24.63341856, 74.24628796], [-31.8996363, 27.99907764], [-39.581043, 37.0639821], [-50.90185988, 45.56296169], [-67.43022017, 52.12399581]]) res = np.array([[-62.77837918, 59.12607053], [-61.48397172, 58.56799254], [-60.25004314, 58.00754686], [-71.35057076, 49.60229517], [-113.746486, 56.03008985], [-115.32268301, 66.32946139]]) poly1 = SphPolygon(np.deg2rad(swath_vertices)) poly2 = SphPolygon(np.deg2rad(area_vertices)) poly_inter = poly1.intersection(poly2) self.assertTrue(np.allclose(poly_inter.vertices, np.deg2rad(res))) poly_inter = poly2.intersection(poly1) self.assertTrue(np.allclose(poly_inter.vertices, np.deg2rad(res)))
def test_intersection(self): """Test the intersection function.""" vertices = np.array([[180, 90, 0, -90], [89, 89, 89, 89]]).T poly1 = SphPolygon(np.deg2rad(vertices)) vertices = np.array([[-45, -135, 135, 45], [89, 89, 89, 89]]).T poly2 = SphPolygon(np.deg2rad(vertices)) inter = np.array([[157.5, 89.23460094], [112.5, 89.23460094], [67.5, 89.23460094], [22.5, 89.23460094], [-22.5, 89.23460094], [-67.5, 89.23460094], [-112.5, 89.23460094], [-157.5, 89.23460094]]) poly_inter = poly1.intersection(poly2) np.testing.assert_allclose(poly_inter.vertices, np.deg2rad(inter)) # Test 2 polygons sharing 2 contiguous edges. vertices1 = np.array([[-10, 10], [-5, 10], [0, 10], [5, 10], [10, 10], [10, -10], [-10, -10]]) vertices2 = np.array([[-5, 10], [0, 10], [5, 10], [5, -5], [-5, -5]]) vertices3 = np.array([[5, 10], [5, -5], [-5, -5], [-5, 10], [0, 10]]) poly1 = SphPolygon(np.deg2rad(vertices1)) poly2 = SphPolygon(np.deg2rad(vertices2)) poly_inter = poly1.intersection(poly2) np.testing.assert_allclose(poly_inter.vertices, np.deg2rad(vertices3)) # Test when last node of the intersection is the last vertice of the # second polygon. swath_vertices = np.array([[-115.32268301, 66.32946139], [-61.48397172, 58.56799254], [-60.25004314, 58.00754686], [-71.35057076, 49.60229517], [-113.746486, 56.03008985]]) area_vertices = np.array([[-68.32812107, 52.3480829], [-67.84993896, 53.07015692], [-55.54651296, 64.9254637], [-24.63341856, 74.24628796], [-31.8996363, 27.99907764], [-39.581043, 37.0639821], [-50.90185988, 45.56296169], [-67.43022017, 52.12399581]]) res = np.array([[-62.77837918, 59.12607053], [-61.48397172, 58.56799254], [-60.25004314, 58.00754686], [-71.35057076, 49.60229517], [-113.746486, 56.03008985], [-115.32268301, 66.32946139]]) poly1 = SphPolygon(np.deg2rad(swath_vertices)) poly2 = SphPolygon(np.deg2rad(area_vertices)) poly_inter = poly1.intersection(poly2) np.testing.assert_allclose(poly_inter.vertices, np.deg2rad(res)) poly_inter = poly2.intersection(poly1) np.testing.assert_allclose(poly_inter.vertices, np.deg2rad(res)) # Test when intersection occurs across the antimeridian vertices_epsg_4326 = np.deg2rad(np.array([[-180, -90], [-180, 90], [0, 90], [180, 90], [180, -90]])) vertices_goes_west = np.array([[2.50919361e+00, 1.19782309e-16], [2.51252770e+00, 1.27991660e-01], [2.97300443e+00, 1.24550237e+00], [-2.98515478e+00, 1.33966326e+00], [-1.00821045e+00, -0.00000000e+00], [-2.98515478e+00, -1.33966326e+00], [2.97300443e+00, -1.24550237e+00], [2.51252770e+00, -1.27991660e-01]]) goes_west_poly = SphPolygon(vertices_goes_west) epsg_4326_poly = SphPolygon(vertices_epsg_4326) intersection_poly = epsg_4326_poly.intersection(goes_west_poly) # Assert found the correct intersection point assert np.allclose(intersection_poly.vertices[2, :], np.array([-2.98515478, 1.33966326])) # Check bounded between -180 and 180 assert np.all(intersection_poly.vertices >= -np.pi) assert np.all(intersection_poly.vertices <= np.pi)