def test_is_inside(self): """Test checking if a polygon is inside of another.""" vertices = np.array([[1, 1, 20, 20], [1, 20, 20, 1]]).T rad_verts = np.deg2rad(vertices) polygon1 = SphPolygon(rad_verts) # make sure 64-bit floats don't get copied assert polygon1.vertices is rad_verts vertices = np.array([[0, 0, 30, 30], [0, 30, 30, 0]]).T polygon2 = SphPolygon(np.deg2rad(vertices)) assert polygon1._is_inside(polygon2) assert not polygon2._is_inside(polygon1) # Why checking the areas here!? It has nothing to do with the is_inside function! assert polygon2.area() > polygon1.area() polygon2.invert() assert not polygon1._is_inside(polygon2) assert not polygon2._is_inside(polygon1) vertices = np.array([[0, 0, 30, 30], [21, 30, 30, 21]]).T polygon2 = SphPolygon(np.deg2rad(vertices)) assert not polygon1._is_inside(polygon2) assert not polygon2._is_inside(polygon1) polygon2.invert() assert polygon1._is_inside(polygon2) assert not polygon2._is_inside(polygon1) vertices = np.array([[100, 100, 130, 130], [41, 50, 50, 41]]).T polygon2 = SphPolygon(np.deg2rad(vertices)) assert not polygon1._is_inside(polygon2) assert not polygon2._is_inside(polygon1) polygon2.invert() assert polygon1._is_inside(polygon2) assert not polygon2._is_inside(polygon1) vertices = VERTICES_TEST_IS_INSIDE1 polygon1 = SphPolygon(np.deg2rad(vertices)) vertices = VERTICES_TEST_IS_INSIDE2 polygon2 = SphPolygon(np.deg2rad(vertices)) assert not polygon2._is_inside(polygon1) assert not polygon1._is_inside(polygon2)
def test_area(self): """Test the area function.""" vertices = np.array([[1, 2, 3, 4, 3, 2], [3, 4, 3, 2, 1, 2]]).T polygon = SphPolygon(np.deg2rad(vertices)) self.assertAlmostEqual(0.00121732523118, polygon.area()) vertices = np.array([[1, 2, 3, 2], [3, 4, 3, 2]]).T polygon = SphPolygon(np.deg2rad(vertices)) self.assertAlmostEqual(0.000608430665842, polygon.area()) vertices = np.array([[0, 0, 1, 1], [0, 1, 1, 0]]).T polygon = SphPolygon(np.deg2rad(vertices)) self.assertAlmostEqual(0.000304609684862, polygon.area()) # Across the dateline vertices = np.array([[179.5, -179.5, -179.5, 179.5], [1, 1, 0, 0]]).T polygon = SphPolygon(np.deg2rad(vertices)) self.assertAlmostEqual(0.000304609684862, polygon.area()) vertices = np.array([[0, 90, 90, 0], [1, 1, 0, 0]]).T polygon = SphPolygon(np.deg2rad(vertices)) self.assertAlmostEqual(0.0349012696772, polygon.area()) vertices = np.array([[90, 0, 0], [0, 0, 90]]).T polygon = SphPolygon(np.deg2rad(vertices)) self.assertAlmostEqual(np.pi / 2, polygon.area()) # Around the north pole vertices = np.array([[0, -90, 180, 90], [89, 89, 89, 89]]).T polygon = SphPolygon(np.deg2rad(vertices)) self.assertAlmostEqual(0.000609265770322, polygon.area()) # Around the south pole vertices = np.array([[0, 90, 180, -90], [-89, -89, -89, -89]]).T polygon = SphPolygon(np.deg2rad(vertices)) self.assertAlmostEqual(0.000609265770322, polygon.area())
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_is_inside(self): """Test checking if a polygon is inside of another.""" vertices = np.array([[1, 1, 20, 20], [1, 20, 20, 1]]).T polygon1 = SphPolygon(np.deg2rad(vertices)) vertices = np.array([[0, 0, 30, 30], [0, 30, 30, 0]]).T polygon2 = SphPolygon(np.deg2rad(vertices)) self.assertTrue(polygon1._is_inside(polygon2)) self.assertFalse(polygon2._is_inside(polygon1)) self.assertTrue(polygon2.area() > polygon1.area()) polygon2.invert() self.assertFalse(polygon1._is_inside(polygon2)) self.assertFalse(polygon2._is_inside(polygon1)) vertices = np.array([[0, 0, 30, 30], [21, 30, 30, 21]]).T polygon2 = SphPolygon(np.deg2rad(vertices)) self.assertFalse(polygon1._is_inside(polygon2)) self.assertFalse(polygon2._is_inside(polygon1)) polygon2.invert() self.assertTrue(polygon1._is_inside(polygon2)) self.assertFalse(polygon2._is_inside(polygon1)) vertices = np.array([[100, 100, 130, 130], [41, 50, 50, 41]]).T polygon2 = SphPolygon(np.deg2rad(vertices)) self.assertFalse(polygon1._is_inside(polygon2)) self.assertFalse(polygon2._is_inside(polygon1)) polygon2.invert() self.assertTrue(polygon1._is_inside(polygon2)) self.assertFalse(polygon2._is_inside(polygon1)) vertices = np.array([[-1.54009253, 82.62402855], [3.4804808, 82.8105746], [20.7214892, 83.00875812], [32.8857629, 82.7607758], [41.53844302, 82.36024339], [47.92062759, 81.91317164], [52.82785062, 81.45769791], [56.75107895, 81.00613046], [59.99843787, 80.56042986], [62.76998034, 80.11814453], [65.20076209, 79.67471372], [67.38577498, 79.22428], [69.39480149, 78.75981318], [71.28163984, 78.27283234], [73.09016378, 77.75277976], [74.85864685, 77.18594725], [76.62327682, 76.55367303], [78.42162204, 75.82918893], [80.29698409, 74.97171721], [82.30538638, 73.9143231], [84.52973107, 72.53535661], [87.11696138, 70.57600156], [87.79163209, 69.98712409], [72.98142447, 67.1760143], [61.79517279, 63.2846272], [53.50600609, 58.7098766], [47.26725347, 53.70533139], [42.44083259, 48.42199571], [38.59682041, 42.95008531], [35.45189206, 37.3452509], [32.43435578, 30.72373327], [31.73750748, 30.89485287], [29.37284023, 31.44344415], [27.66001308, 31.81016309], [26.31358296, 32.08057499], [25.1963477, 32.29313986], [24.23118049, 32.46821821], [23.36993508, 32.61780082], [22.57998837, 32.74952569], [21.8375532, 32.86857867], [21.12396693, 32.97868717], [20.42339605, 33.08268331], [19.72121983, 33.18284728], [19.00268283, 33.28113306], [18.2515215, 33.3793305], [17.4482606, 33.47919405], [16.56773514, 33.58255576], [15.57501961, 33.6914282], [14.4180087, 33.8080799], [13.01234319, 33.93498577], [11.20625437, 34.0742239], [8.67990371, 34.22415978], [7.89344478, 34.26018768], [8.69446485, 41.19823568], [9.25707165, 47.17351118], [9.66283477, 53.14128114], [9.84134875, 59.09937166], [9.65054241, 65.04458004], [8.7667375, 70.97023122], [6.28280904, 76.85731403]]) polygon1 = SphPolygon(np.deg2rad(vertices)) vertices = np.array([[49.94506701, 46.52610743], [51.04293649, 46.52610743], [62.02163129, 46.52610743], [73.0003261, 46.52610743], [83.9790209, 46.52610743], [85.05493299, 46.52610743], [85.05493299, 45.76549301], [85.05493299, 37.58315571], [85.05493299, 28.39260587], [85.05493299, 18.33178739], [85.05493299, 17.30750918], [83.95706351, 17.30750918], [72.97836871, 17.30750918], [61.9996739, 17.30750918], [51.0209791, 17.30750918], [49.94506701, 17.30750918], [49.94506701, 18.35262921], [49.94506701, 28.41192025], [49.94506701, 37.60055422], [49.94506701, 45.78080831]]) polygon2 = SphPolygon(np.deg2rad(vertices)) self.assertFalse(polygon2._is_inside(polygon1)) self.assertFalse(polygon1._is_inside(polygon2))