]> git.openstreetmap.org Git - nominatim.git/blob - nominatim/utils/centroid.py
add class for online centroid computation
[nominatim.git] / nominatim / utils / centroid.py
1 # SPDX-License-Identifier: GPL-2.0-only
2 #
3 # This file is part of Nominatim. (https://nominatim.org)
4 #
5 # Copyright (C) 2022 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 collections.abc import Collection
11
12 class PointsCentroid:
13     """ Centroid computation from single points using an online algorithm.
14         More points may be added at any time.
15
16         Coordinates are internally treated as a 7-digit fixed-point float
17         (i.e. in OSM style).
18     """
19
20     def __init__(self):
21         self.sum_x = 0
22         self.sum_y = 0
23         self.count = 0
24
25     def centroid(self):
26         """ Return the centroid of all points collected so far.
27         """
28         if self.count == 0:
29             raise ValueError("No points available for centroid.")
30
31         return (float(self.sum_x/self.count)/10000000,
32                 float(self.sum_y/self.count)/10000000)
33
34
35     def __len__(self):
36         return self.count
37
38
39     def __iadd__(self, other):
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.")