diff --git a/GeoSpatialTools/kdtree.py b/GeoSpatialTools/kdtree.py index cd54c1c376b7c5aea2cc62f70ed1b96036402368..f99ea9069c312e061fb61e89d2a5dbd3005a0169 100644 --- a/GeoSpatialTools/kdtree.py +++ b/GeoSpatialTools/kdtree.py @@ -82,13 +82,27 @@ class KDTree: else: return self.child_right.delete(point) - def query( + def query(self, point) -> tuple[Record | None, float]: + """Find the nearest Record within the KDTree to a _query Record""" + if point.lon < 0: + point2 = Record(point.lon + 360, point.lat) + else: + point2 = Record(point.lon - 360, point.lat) + + r1, d1 = self._query(point) + r2, d2 = self._query(point2) + if d1 <= d2: + r = r1 + else: + r = r2 + return r, point.distance(r) + + def _query( self, point: Record, current_best: Record | None = None, best_distance: float = inf, ) -> tuple[Record | None, float]: - """Find the nearest Record within the KDTree to a query Record""" if not self.split: for p in self.points: dist = point.distance(p) @@ -98,25 +112,25 @@ class KDTree: return current_best, best_distance if getattr(point, self.variable) < self.partition_value: - current_best, best_distance = self.child_left.query( + current_best, best_distance = self.child_left._query( point, current_best, best_distance ) if ( point.distance(self._get_partition_record(point)) < best_distance ): - current_best, best_distance = self.child_right.query( + current_best, best_distance = self.child_right._query( point, current_best, best_distance ) else: - current_best, best_distance = self.child_right.query( + current_best, best_distance = self.child_right._query( point, current_best, best_distance ) if ( point.distance(self._get_partition_record(point)) < best_distance ): - current_best, best_distance = self.child_left.query( + current_best, best_distance = self.child_left._query( point, current_best, best_distance )