Question

Je fichier GPX avec une piste GPS. Maintenant, je veux calculer la distance que je couvert avec cette piste.

Quelle est la meilleure façon de calculer cela?

Était-ce utile?

La solution

La manière traditionnelle de calculer la distance entre deux points (chaque paire de points de cheminement dans votre fichier GPX) est la formule Haversine.

J'ai une fonction SQL Server qui implémente l'algorithme. Cela devrait être facile à traduire dans d'autres langues:

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

retourne la distance en milles. Pour kilomètres, remplacer le rayon de la Terre avec elle équivalent de km.

est une explication plus approfondie.

Edit: Cette fonction est assez rapide et assez précis pour faire des recherches de rayon avec une base de données de code postal. Il a fait un excellent travail sur ce site depuis des années (mais il ne le fait plus, comme le lien est rompu maintenant).

Autres conseils

Mike Gavaghan a un algorithme pour le calcul de la distance sur son site. Il y a un C # et aussi une version JAVA du code.

la mise en œuvre des formules Delphi Vincenty peuvent être trouvés < a href = "http://www.programmersheaven.com/download/48584/19/ZipView.aspx" rel = "nofollow"> ici .

Voici une implémentation Scala.

3958.761 est rayon moyen de la Terre en miles. Pour obtenir un résultat en km (ou une autre unité) modifier simplement ce nombre.

// 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
  }
}

Cette question est assez vieux, mais je voudrais ajouter une option python pour être complet. GeoPy a à la fois great-circle distance et Vincenty distance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top