"""
Geographical functions for sondera
"""
# for type hints and cyclic imports of Coordinate
from __future__ import annotations
from copy import deepcopy
from typing import TYPE_CHECKING
import geopandas
import numpy as np
if TYPE_CHECKING:
from .datatypes import Coordinate
[docs]
def find_nearby_stations():
raise NotImplementedError
[docs]
def find_stations_in_polygon():
raise NotImplementedError
[docs]
def distance_euclidean(coord1: Coordinate, coord2: Coordinate) -> float:
"""Euclidean Distance in meter between two coordinates
Parameters
----------
coord1
coord2
Returns
-------
Distance between coord1 and coord2 in meters
"""
return np.sqrt((coord2.x - coord1.x) ** 2 + (coord2.y - coord1.y) ** 2)
[docs]
def distance_haversine(coord1: Coordinate, coord2: Coordinate) -> float:
"""Distance in meter between two spherical coordinates on Earth using
Haversine method
Parameters
----------
coord1
coord2
Returns
-------
Distance between coord1 and coord2 in meters
"""
r_earth = 6371 # mean Earth radius in km
# Coordinates in radians
lat1 = np.deg2rad(coord1.y)
lat2 = np.deg2rad(coord2.y)
lon1 = np.deg2rad(coord1.x)
lon2 = np.deg2rad(coord2.x)
d_lat = lat2 - lat1
d_lon = lon2 - lon1
a = (np.sin(d_lat / 2) ** 2 + np.cos(lat1) * np.cos(lat2)
* np.sin(d_lon / 2) ** 2)
c = 2 * np.asin(np.sqrt(a))
d = r_earth * c * 1000 # distance in meters
return d