Re: Anteil Himmelsrichtung an Track

von: farnotfast

Re: Anteil Himmelsrichtung an Track - 03.07.20 11:50

Für das Distanzproblem gibt es die Haversine-Formel.

Ansonsten bevorzuge auch ich Python. Folgender Code gibt eine Liste mit 360 Einträgen aus. Der Index entspricht der Peilung, der entsprechende Wert ist die Distanz in Kilometer. Lauffähig ist das, die Korrektheit des Ergebnisses habe ich nicht überprüft.
Anklicken zum Enthüllen...

Code:
#!/usr/bin/env python

import gpxpy
from math import radians, cos, sin, asin, sqrt, atan2, degrees, pi, floor

def haversine(lon1, lat1, lon2, lat2):
    dlon = radians(lon2 - lon1)
    dlat = radians(lat2 - lat1)

    a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
    c = 2 * asin(sqrt(a))
    r_earth = 6372.8
    return c * r_earth


def bearing(lon1, lat1, lon2, lat2):
    bearing = atan2(
        sin(lon2 - lon1) * cos(lat2),
        cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2 - lon1),
    )
    return (round(degrees(bearing)) + 360) % 360


if __name__ == "__main__":
    with open("example.gpx", "r") as gpx_file:
        gpx = gpxpy.parse(gpx_file)

    distance_per_degree = [0] * 360
    for track in gpx.tracks:
        for segment in track.segments:
            for prev, cur in zip(segment.points, segment.points[1:]):
                distance = haversine(prev.longitude, prev.latitude, cur.longitude, cur.latitude)
                bearing_degree = bearing(prev.longitude, prev.latitude, cur.longitude, cur.latitude)
                distance_per_degree[bearing_degree] += distance

    print(distance_per_degree)