# SPDX-License-Identifier: GPL-2.0-only # # This file is part of Nominatim. (https://nominatim.org) # # Copyright (C) 2022 by the Nominatim developer community. # For a full list of authors see the git log. """ Functions for computation of centroids. """ from typing import Tuple, Any from collections.abc import Collection class PointsCentroid: """ Centroid computation from single points using an online algorithm. More points may be added at any time. Coordinates are internally treated as a 7-digit fixed-point float (i.e. in OSM style). """ def __init__(self) -> None: self.sum_x = 0 self.sum_y = 0 self.count = 0 def centroid(self) -> Tuple[float, float]: """ Return the centroid of all points collected so far. """ if self.count == 0: raise ValueError("No points available for centroid.") return (float(self.sum_x/self.count)/10000000, float(self.sum_y/self.count)/10000000) def __len__(self) -> int: return self.count def __iadd__(self, other: Any) -> 'PointsCentroid': if isinstance(other, Collection) and len(other) == 2: if all(isinstance(p, (float, int)) for p in other): x, y = other self.sum_x += int(x * 10000000) self.sum_y += int(y * 10000000) self.count += 1 return self raise ValueError("Can only add 2-element tuples to centroid.")