У меня есть GPX file с дорожкой GPS. Теперь я хочу рассчитать расстояние, которое я покрыл этой дорожкой.Как рассчитать расстояние от файла GPX?
Каков наилучший способ рассчитать это?
У меня есть GPX file с дорожкой GPS. Теперь я хочу рассчитать расстояние, которое я покрыл этой дорожкой.Как рассчитать расстояние от файла GPX?
Каков наилучший способ рассчитать это?
Традиционный способ вычисления расстояния между двумя точками (каждая пара путевых точек в вашем файле 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([email protected]))
select @d = @R * @c
return @d
end
Это возвращает расстояние в Майлсе. В километрах замените радиус земли эквивалентом в килограммах.
Here является более подробным объяснением.
Редактировать: Эта функция достаточно быстрая и точная для выполнения радиального поиска с использованием базы данных почтовых индексов. Он отлично справляется с this site годами (но он больше не работает, так как ссылка сейчас сломана).
Mike Gavaghan has an algorithm для расчета расстояний на своем сайте. Существует C#, а также версия JAVA кода.
Внедрение Delphi Vincenty formulae можно найти here.
У вас есть обновленная ссылка для этого? –
@Adam Carter: Я проверил URL-адрес, и он все еще в порядке. – menjaraz
Настоящая реализация Scala.
3958.761 - это mean radius of the Earth в милях. Чтобы получить результат в км (или какой-либо другой части), просто измените это число.
// The Haversine formula
def haversineDistance(pointA: (Double, Double), pointB: (Double, Double)): Double = {
val deltaLat = math.toRadians(pointB._1 - pointA._1)
val deltaLong = math.toRadians(pointB._2 - pointA._2)
val a = math.pow(math.sin(deltaLat/2), 2) + math.cos(math.toRadians(pointA._1)) * math.cos(math.toRadians(pointB._1)) * math.pow(math.sin(deltaLong/2), 2)
val greatCircleDistance = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
3958.761 * greatCircleDistance
}
// A sequence of gpx trackpoint lat,long pairs parsed from the track GPX data
val trkpts: Seq[(Double, Double)] = {
val x = scala.xml.XML.loadString(track)
(x \\ "trkpt").map(trkpt => ((trkpt \ "@lat").text.toDouble, (trkpt \ "@lon").text.toDouble))
}
// Distance of track in miles using Haversine formula
val trackDistance: Double = {
trkpts match {
case head :: tail => tail.foldLeft(head, 0.0)((accum, elem) => (elem, accum._2 + haversineDistance(accum._1, elem)))._2
case Nil => 0.0
}
}
Этот вопрос довольно старый, но я хотел бы добавить опцию python для полноты. GeoPy имеет как great-circle distance
, так и Vincenty distance
.
Большое спасибо. Я пошлю его в java и отправлю его здесь. Что означает @DtoR? Расстояние до радиуса? – guerda
Это тот фактор, который преобразует градусы в радианы, pi/180. – cdonner
Спасибо за ссылку. Я скоро отправлю свою версию Java – guerda