Skip to content
Merged
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
47 changes: 46 additions & 1 deletion python/python-examples/test/test_haversine_distance.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
Test for haversine distance.
"""
import logging as log
import numpy as np
from math import radians
import pytest
from sklearn.metrics.pairwise import haversine_distances
Expand All @@ -12,6 +13,11 @@
pytest.param(
[-34.83333, -58.5166646],
[49.0083899664, 2.53844117956]
),
# Google location vs USDA Location
pytest.param(
[39.0168311, -76.92883499999999],
[39.01644, -76.928925]
)
])
def test_calculate_haversince_distance(lat_long_origin:list, lat_long_destination:list):
Expand All @@ -28,4 +34,43 @@ def test_calculate_haversince_distance(lat_long_origin:list, lat_long_destinatio
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)
assert km_haversine_distance == round(km_distance_matrix_result[0][1], 8)


def test_shortest_distance():
# Lincoln Memorial Latlong
lincoln_memorial = [38.889248, -77.050636]

# Ducinni's off U St
ducinnis_pizza = [38.91706701509112, -77.04118715785616]

# Admo Jumbo Slice
jumbo_slice_pizza = [38.92105748065034, -77.04170211776945]

# Manny Olgas Near U
manny_olgas = [38.91543818061708, -77.03174726038766]

# Based off Haversine which is closest to Lincoln Memorial
dataset = [
{'name': 'Lincoln Memorial', 'geocode': lincoln_memorial},
{'name': "Ducinni's Pizza", 'geocode': ducinnis_pizza},
{'name': 'Jumbo Slice Pizza', 'geocode': jumbo_slice_pizza},
{'name': "Manny Olga's", 'geocode': manny_olgas}
]

# Put all these in radians
radian_distances = list(map(lambda x: [radians(_) for _ in x['geocode']], dataset))

# Calculate the Haversine Distances
distance_matrix_result = haversine_distances(radian_distances)

# Pull out the first Entry in the 2D array
km_distance_matrix_result = distance_matrix_result * RADIUS_OF_EARTH / 1000
log.info(f"\nDistance Matrix in Kilometers:\n {km_distance_matrix_result}")

# Get the index of the minimum distance for the lincoln memorial
np_array = np.array(km_distance_matrix_result[0][1:])
idx_min = np.argmin(np_array)
# Closest Should be Ducinnis
assert idx_min + 1 == 1
log.info(f"\nClosest Jumbo Slice spot to Lincoln Memorial by Haversine Distance is {dataset[idx_min + 1]['name']}")