From 8507d8e4d69b12c0b88ea414bbb917d1ff1c3c2d Mon Sep 17 00:00:00 2001 From: josidd <joseph.siddons@noc.ac.uk> Date: Wed, 25 Sep 2024 14:50:19 +0100 Subject: [PATCH] test(ellipse): add tests for QuadTree and OctTree ellipse comparisons. --- test/test_octtree.py | 51 +++++++++++++++++++++++++++++++++++++++++++ test/test_quadtree.py | 41 +++++++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/test/test_octtree.py b/test/test_octtree.py index 0fd57d4..6f39bcb 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 3c913ff..d117872 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() -- GitLab