Традиционный способ вычисления расстояния между двумя точками (каждая пара путевых точек в вашем файле GPX) - по формуле Хаверсайна.
У меня есть функция SQL Server, которая реализует алгоритм. Это должно быть легко перевести на другие языки:
create function dbo.udf_Haversine(@lat1 float, @long1 float,
@lat2 float, @long2 float) returns float begin
declare @dlon float, @dlat float, @rlat1 float,
@rlat2 float, @rlong1 float, @rlong2 float,
@a float, @c float, @R float, @d float, @DtoR float
select @DtoR = 0.017453293
select @R = 3959 -- Earth radius
select
@rlat1 = @lat1 * @DtoR,
@rlong1 = @long1 * @DtoR,
@rlat2 = @lat2 * @DtoR,
@rlong2 = @long2 * @DtoR
select
@dlon = @rlong1 - @rlong2,
@dlat = @rlat1 - @rlat2
select @a = power(sin(@dlat/2), 2) + cos(@rlat1) *
cos(@rlat2) * power(sin(@dlon/2), 2)
select @c = 2 * atn2(sqrt(@a), sqrt(1-@a))
select @d = @R * @c
return @d
end
Возвращает расстояние в милях. Для километров замените радиус Земли его эквивалентом в км.
Здесь - более подробное объяснение.
Редактировать: эта функция достаточно быстрая и точная для поиска по радиусу в базе данных по почтовому индексу. Он много лет работал на этом сайте (но теперь этого не происходит, так как ссылка теперь не работает).