diff --git a/test/test_octtree.py b/test/test_octtree.py index 0fd57d4231c06b8a68bf06a057a5832568ec653f..6f39bcb4e6abb0264605667ac7ea251a98dd399e 100644 --- a/test/test_octtree.py +++ b/test/test_octtree.py @@ -1,10 +1,12 @@ import unittest from datetime import datetime, timedelta +from GeoSpatialTools import haversine from GeoSpatialTools.octtree import ( OctTree, SpaceTimeRecord as Record, SpaceTimeRectangle as Rectangle, + SpaceTimeEllipse as Ellipse, ) @@ -128,6 +130,55 @@ class TestOctTree(unittest.TestCase): assert res == expected + def test_ellipse_query(self): + d1 = haversine(0, 2.5, 1, 2.5) + d2 = haversine(0, 2.5, 0, 3.0) + theta = 0 + + d = datetime(2023, 3, 24, 12, 0) + test_datetime = d + timedelta(hours=4) + test_timedelta = timedelta(hours=5) + ellipse = Ellipse( + 12.5, 2.5, test_datetime, d1, d2, theta, test_timedelta + ) + # TEST: distint locii + assert (ellipse.p1_lon, ellipse.p1_lat) != ( + ellipse.p2_lon, + ellipse.p2_lat, + ) + + d = datetime(2023, 3, 24, 12, 0) + dt = timedelta(days=10) + boundary = Rectangle(10, 4, d, 20, 8, dt) + + otree = OctTree(boundary, capacity=3) + points: list[Record] = [ + Record(10, 4, d, "main"), + Record(12, 1, d + timedelta(hours=3), "main2"), + Record(3, 7, d - timedelta(days=3), "main3"), + Record(13, 2, d + timedelta(hours=17), "southeastfwd"), + Record(3, 6, d - timedelta(days=1), "northwestback"), + Record(10, 4, d, "northwestback"), + Record(18, 2, d + timedelta(days=23), "not added"), + Record(12.6, 2.1, d + timedelta(hours=2), "northeastfwd"), + Record(13.5, 2.6, test_datetime, "too north of eastern edge"), + Record(12.6, 3.0, test_datetime, "too east of northern edge"), + # Locii + Record(ellipse.p1_lon, ellipse.p1_lat, test_datetime, "locii1"), + Record(ellipse.p2_lon, ellipse.p2_lat, test_datetime, "locii2"), + ] + expected = [ + Record(12.6, 2.1, d + timedelta(hours=2), "northeastfwd"), + Record(ellipse.p1_lon, ellipse.p1_lat, test_datetime, "locii1"), + Record(ellipse.p2_lon, ellipse.p2_lat, test_datetime, "locii2"), + ] + + for point in points: + otree.insert(point) + + res = otree.query_ellipse(ellipse) + assert res == expected + if __name__ == "__main__": unittest.main() diff --git a/test/test_quadtree.py b/test/test_quadtree.py index 3c913ff5c5c639dd7f7d52cec9b020b3bb132f58..d11787224e5ac868345578e0e6cc898b70b08b9a 100644 --- a/test/test_quadtree.py +++ b/test/test_quadtree.py @@ -1,5 +1,7 @@ +from math import pi import unittest -from GeoSpatialTools.quadtree import QuadTree, Record, Rectangle +from GeoSpatialTools import haversine +from GeoSpatialTools.quadtree import QuadTree, Record, Rectangle, Ellipse class TestRect(unittest.TestCase): @@ -96,6 +98,43 @@ class TestQuadTree(unittest.TestCase): assert res == expected + def test_ellipse_query(self): + d1 = haversine(0, 2.5, 1, 2.5) + d2 = haversine(0, 2.5, 0, 3.0) + theta = 0 + + ellipse = Ellipse(12.5, 2.5, d1, d2, theta) + # TEST: distint locii + assert (ellipse.p1_lon, ellipse.p1_lat) != ( + ellipse.p2_lon, + ellipse.p2_lat, + ) + boundary = Rectangle(10, 4, 20, 8) + qtree = QuadTree(boundary, capacity=3) + points: list[Record] = [ + Record(10, 5), + Record(19, 1), + Record(0, 0), + Record(-2, -9.2), + Record(13.5, 2.6), # Just North of Eastern edge + Record(12.6, 3.0), # Just East of Northern edge + Record(12.8, 2.1), + # Locii + Record(ellipse.p1_lon, ellipse.p1_lat), + Record(ellipse.p2_lon, ellipse.p2_lat), + ] + expected = [ + Record(12.8, 2.1), + Record(ellipse.p1_lon, ellipse.p1_lat), + Record(ellipse.p2_lon, ellipse.p2_lat), + ] + + for point in points: + qtree.insert(point) + + res = qtree.query_ellipse(ellipse) + assert res == expected + if __name__ == "__main__": unittest.main()