Пример #1
0
 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())
Пример #2
0
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()
Пример #3
0
    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)))
Пример #4
0
    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)