Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion python/python-examples/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ authors = [
requires-python = ">=3.13"
dependencies = [
"pydantic",
"fastapi"
"fastapi",
"scikit-learn"
]

[dependency-groups]
Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"""
Utility class to use python to calculate the haversine distance between two longitude
and latitude points.
"""
import logging as log

from math import radians, sin, cos, atan2, sqrt

log.basicConfig(level=log.INFO)

# Radius of earth in meters
RADIUS_OF_EARTH = 6371000

def calculate_haversine_distince(lat_long_start:list, lat_long_end:list):
"""Calculate the haversine distance."""
# Taken from here
# https://community.esri.com/t5/coordinate-reference-systems-blog/distance-on-a-sphere-the-haversine-formula/ba-p/902128

# Direct Unpack the
# Minor correction to code unpack should
lat1, lon1 = lat_long_start
lat2, lon2 = lat_long_end

# Radians???
phi_1 = radians(lat1)
phi_2 = radians(lat2)

delta_phi = radians(lat2 - lat1)
delta_lambda = radians(lon2 - lon1)

a = sin(delta_phi / 2.0) ** 2 + cos(phi_1) * cos(phi_2) * sin(delta_lambda / 2.0) ** 2
c = 2 * atan2(sqrt(a), sqrt(1 - a))

# Output distance in meters
meters = RADIUS_OF_EARTH * c

return meters
31 changes: 31 additions & 0 deletions python/python-examples/test/test_haversine_distance.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""
Test for haversine distance.
"""
import logging as log
from math import radians
import pytest
from sklearn.metrics.pairwise import haversine_distances
from python_examples.math.haversine_distance import calculate_haversine_distince, RADIUS_OF_EARTH

@pytest.mark.parametrize("lat_long_origin,lat_long_destination", [
# Scikit Learn example Ezeiza Airport -> Charles de Gaulle Airport
pytest.param(
[-34.83333, -58.5166646],
[49.0083899664, 2.53844117956]
)
])
def test_calculate_haversince_distance(lat_long_origin:list, lat_long_destination:list):
"""Test haversine_distance against """
# log.info(f"origin:{lat_long_origin} destination:{lat_long_destination}")
log.info(f"{lat_long_origin} - {lat_long_destination}")
origin_in_radians = [radians(_) for _ in lat_long_origin]
destination_in_radians = [radians(_) for _ in lat_long_destination]
distance_matrix_result = haversine_distances([origin_in_radians, destination_in_radians])
km_distance_matrix_result = distance_matrix_result * RADIUS_OF_EARTH / 1000

haversine_distance = calculate_haversine_distince(lat_long_origin, lat_long_destination)
km_haversine_distance = round(haversine_distance / 1000, 8)
sklearn_distance = km_distance_matrix_result[0][1]
log.info(f"Raw Calc={km_haversine_distance}, Sklearn Calc={sklearn_distance}")
# Rounding both to 8 digits of accuracy...
assert km_haversine_distance == round(km_distance_matrix_result[0][1], 8)
Loading