Mam GPX file ze ścieżką GPS. Teraz chcę obliczyć odległość jaką pokonałem tym torem.Jak obliczyć odległość od pliku GPX?
Jaki jest najlepszy sposób obliczenia tego?
Mam GPX file ze ścieżką GPS. Teraz chcę obliczyć odległość jaką pokonałem tym torem.Jak obliczyć odległość od pliku GPX?
Jaki jest najlepszy sposób obliczenia tego?
Tradycyjny sposób obliczania odległości między dwoma punktami (każdą parą punktów na drodze w pliku GPX) ma formułę Haversine.
Mam funkcję serwera SQL, który implementuje algorytm. To powinno być łatwe do przetłumaczenia na inne języki:
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
Powoduje zwrócenie odległości w milach. Dla kilometrów zastąp promień ziemi równaniem km.
Here to bardziej szczegółowe wyjaśnienie.
Edytuj: Ta funkcja jest wystarczająco szybka i wystarczająco dokładna, aby umożliwić wyszukiwanie za pomocą kodów z kodem ZIP. Przez lata robił świetną robotę na this site (ale to już nie działa, ponieważ link jest teraz zepsuty).
Mike Gavaghan has an algorithm do obliczania odległości na swojej stronie. Istnieje kod języka C# i wersja JAVA.
Wykonanie Delphi Vincenty formulae można znaleźć here.
Czy masz zaktualizowany link do tego? –
@Adam Carter: Sprawdziłem adres URL i nadal jest OK. – menjaraz
Oto implementacja Scala.
3958.761 to mean radius of the Earth w milach. Aby uzyskać wynik w km (lub jakiejś innej jednostce), wystarczy zmienić tę liczbę.
// 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
}
}
To pytanie jest dość stare, ale chciałbym dodać opcję Pythona dla kompletności. GeoPy ma zarówno great-circle distance
, jak i Vincenty distance
.
Wielkie dzięki. Przekażę go do java i opublikuję tutaj. Co oznacza @DtoR? Odległość do promienia? – guerda
To jest czynnik, który konwertuje stopnie na Radians, pi/180. – cdonner
Dzięki za link. Wkrótce opublikuję moją wersję Java. – guerda