Which library is more accurate in measuring geodesic distances in meters between points? (pyproj, geopy and haversine)

115 Views Asked by At

I calculated the distance in meters between 2 points using 3 different libraries in Python (pyproj, geopy, and haversine). The results showed a major difference. How can I determine which result is more accurate?

Libraries versions:

  • geopy==2.4.0
  • pyproj==3.6.0
  • shapely==2.0.1

Coordinates:

  • Point_1 = (32.08018794644396, 34.766797643121166)
  • Point_2 = (32.08270240179803, 34.76742074006736)

Results:

  • haversine - 290.0 meters
  • geopy - 284.96 meters
  • pyproj - 240.34 meters

The code:

import geopy.distance
import pyproj
from haversine import haversine
from shapely.geometry import Point, LineString


def measure_distance_using_pyproj(first_point: Point, second_point: Point) -> float:
    """Source - https://pyproj4.github.io/pyproj/stable/api/geod.html#pyproj.Geod.geometry_length"""
    line_between_points = LineString([first_point, second_point])
    geod = pyproj.Geod(ellps="WGS84")
    distance = geod.geometry_length(line_between_points)
    return round(distance, 2)


def measure_distance_using_geopy(
    first_coordinates: tuple[float, float],
    second_coordinates: tuple[float, float]
) -> float:
    """Source - https://www.askpython.com/python/examples/find-distance-between-two-geo-locations"""
    distance = geopy.distance.geodesic(first_coordinates, second_coordinates).meters
    return round(distance, 2)


def measure_distance_using_haversine(
    first_coordinates: tuple[float, float],
    second_coordinates: tuple[float, float]
) -> float:
    """Source - https://www.section.io/engineering-education/using-geopy-to-calculate-the-distance-between-two-points"""
    distance = haversine(first_coordinates, second_coordinates)
    return round(distance, 2) * 1000  # convert km to meters


POINT_1_COORDINATES = (32.08018794644396, 34.766797643121166)
POINT_2_COORDINATES = (32.08270240179803, 34.76742074006736)

point_1_geometry = Point(POINT_1_COORDINATES)
point_2_geometry = Point(POINT_2_COORDINATES)

distance_by_haversine = measure_distance_using_haversine(POINT_1_COORDINATES, POINT_2_COORDINATES)
distance_by_geopy = measure_distance_using_geopy(POINT_1_COORDINATES, POINT_2_COORDINATES)
distance_by_pyproj = measure_distance_using_pyproj(point_1_geometry, point_2_geometry)

print(f'{distance_by_haversine=} meters')
print(f'{distance_by_geopy=} meters')
print(f'{distance_by_pyproj=} meters')

Thanks to all helpers

0

There are 0 best solutions below