1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
"""Geometry models."""
from __future__ import annotations
class Geometry:
"""Represents a geometry."""
class Point(Geometry):
"""Represents a point."""
def __init__(self, latitude, longitude):
"""Initialise point."""
self._latitude = latitude
self._longitude = longitude
def __repr__(self):
"""Return string representation of this point."""
return f"<{self.__class__.__name__}(latitude={self.latitude}, longitude={self.longitude})>"
def __hash__(self) -> int:
"""Return unique hash of this geometry."""
return hash((self.latitude, self.longitude))
def __eq__(self, other: object) -> bool:
"""Return if this object is equal to other object."""
return (
self.__class__ == other.__class__
and self.latitude == other.latitude
and self.longitude == other.longitude
)
@property
def latitude(self) -> float | None:
"""Return the latitude of this point."""
return self._latitude
@property
def longitude(self) -> float | None:
"""Return the longitude of this point."""
return self._longitude
class Polygon(Geometry):
"""Represents a polygon."""
def __init__(self, points: list[Point]):
"""Initialise polygon."""
self._points: list[Point] = points
def __repr__(self):
"""Return string representation of this polygon."""
return f"<{self.__class__.__name__}(centroid={self.centroid})>"
def __hash__(self) -> int:
"""Return unique hash of this geometry."""
return hash(self.points)
def __eq__(self, other: object) -> bool:
"""Return if this object is equal to other object."""
return self.__class__ == other.__class__ and self.points == other.points
@property
def points(self) -> list[Point] | None:
"""Return the points of this polygon."""
return self._points
@property
def centroid(self) -> Point:
"""Find the polygon's centroid as a best approximation."""
longitudes_list: list[float] = [point.longitude for point in self.points]
latitudes_list: list[float] = [point.latitude for point in self.points]
number_of_points: int = len(self.points)
longitude: float = sum(longitudes_list) / number_of_points
latitude: float = sum(latitudes_list) / number_of_points
return Point(latitude, longitude)
|