]> git.openstreetmap.org Git - nominatim.git/blob - src/nominatim_db/utils/centroid.py
Merge pull request #3586 from lonvia/reduce-lookup-calls
[nominatim.git] / src / nominatim_db / utils / centroid.py
1 # SPDX-License-Identifier: GPL-3.0-or-later
2 #
3 # This file is part of Nominatim. (https://nominatim.org)
4 #
5 # Copyright (C) 2024 by the Nominatim developer community.
6 # For a full list of authors see the git log.
7 """
8 Functions for computation of centroids.
9 """
10 from typing import Tuple, Any
11 from collections.abc import Collection
12
13
14 class PointsCentroid:
15     """ Centroid computation from single points using an online algorithm.
16         More points may be added at any time.
17
18         Coordinates are internally treated as a 7-digit fixed-point float
19         (i.e. in OSM style).
20     """
21
22     def __init__(self) -> None:
23         self.sum_x = 0
24         self.sum_y = 0
25         self.count = 0
26
27     def centroid(self) -> Tuple[float, float]:
28         """ Return the centroid of all points collected so far.
29         """
30         if self.count == 0:
31             raise ValueError("No points available for centroid.")
32
33         return (float(self.sum_x/self.count)/10000000,
34                 float(self.sum_y/self.count)/10000000)
35
36     def __len__(self) -> int:
37         return self.count
38
39     def __iadd__(self, other: Any) -> 'PointsCentroid':
40         if isinstance(other, Collection) and len(other) == 2:
41             if all(isinstance(p, (float, int)) for p in other):
42                 x, y = other
43                 self.sum_x += int(x * 10000000)
44                 self.sum_y += int(y * 10000000)
45                 self.count += 1
46                 return self
47
48         raise ValueError("Can only add 2-element tuples to centroid.")