ubuntuusers.de

Land in einer gpx-Datei finden

Status: Ungelöst | Ubuntu-Version: Xubuntu 19.10 (Eoan Ermine)
Antworten |

glaskugel

Anmeldungsdatum:
8. Juli 2010

Beiträge: 4224

Fällt jemanden eine Logik ein, um ein bestimmtes Land, zB Zypern, in gpx-Dateien zu finden, die sich in verschiedenen Unterverzeichnissen befinden?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17674

Wohnort: Berlin

Eine vielleicht dumme Gegenfrage von jmd. der nicht weiß, was eine gpx-Datei überhaupt ist:

Wie findet man denn ein Land, dass sich nur in einem Unterverzeichnis befindet?

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3826

Also ich kenne die Endung .gpx als Favoriten-Datei von Garmin-Navigationsgeräten (xml, also reiner Text).

Liste alle *.gpx, in denen Favoriten für UK enthalten sind:

find /pfad/zum/oberordner -type f -name *.gpx -exec grep -l "<gpxx:Country>UK</gpxx:Country>" {} +

Setzt natürlich voraus, das in deinen .gpx das Country-Flag für alle Einträge gepflegt / vorhanden ist:

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11311

Wohnort: München

GPX-Dateien enthalten u.a. GPS-Wegpunkte, die ihrerseits wiederum Koordinaten und ggf. Höheninformationen enthalten.

Du kannst mit den Koordinaten der Wegpunkte Geocoding betreiben, das hatten wir eigentlich schon alles in https://forum.ubuntuusers.de/topic/kommandozeilen-tool-um-koordinaten-geoinfo-aus/ durchgekaut - also z.B. mit gpxpy die Wegpunkte aus der .gpx-Datei extrahieren und dann mit einem Modul wie che0/countries aus den Koordinaten das Land ermitteln.

IMHO ist es nicht besonders effizient bei jeder Suche die GPX-Koordinaten erneut auszuwerten, da würde ich mir etwas einfallen lassen, um die erkannten Länder als Metadaten in den Verzeichnissen zu speichern.

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3826

Die ursprüngliche Frage beschreibt dann ja total exakt um was es eigentlich geht ... 🙄

TomLu

Anmeldungsdatum:
23. August 2014

Beiträge: 603

Du kannst Länderlisten einzeln¹ runterladen, oder auch 'All Countries'². Nur gerade Dein Beispiel Zypern scheint da zu fehlen.Die Listen enthalten ansonsten Landes-KZ, Post-Codes und eben auch Latitude- und Longitude-Parameter. Theoretisch könnte es damit möglich sein, sich über Deine GPX-Files an eine Stadt anzunähern und darüber dann die Landes-KZ zu ermitteln. Im Landesinnern steigt die Wahrscheinlichkeit auf einen Treffer, grenznah wirds vermutlich schwieriger. *hmmm* Aber um mal damit zu experimentieren scheint es vielleicht lohnend zu sein.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

grundsätzlich wird die nichts anderes übrigen bleiben, über alle Daten in den GPX-Dateien zu iterieren und dann mit einem geeigneten Tool gegen die Umrisse eine Landes zu vergleichen. Bei einer Inseln wie Zypern wäre das ja einfach, weil man einfach ein rechteckige Box um die Insel ziehen kann (davon ausgehend, dass in der GPX keine Punkte sind, die im Meer liegen).

Die angrenzenden Ländern wie z.B. Deutschland - Niederlande ist das aufwendiger. "Effizienter" kann man das IMHO nur gestalten, wenn man möglichst viele Daten im RAM hält, um I/O zu vermeiden.

Was ist denn der genau Hintergrund der Frage?

Gruß, noisefloor

glaskugel

(Themenstarter)

Anmeldungsdatum:
8. Juli 2010

Beiträge: 4224

seahawk1986 schrieb:

das hatten wir eigentlich schon alles in https://forum.ubuntuusers.de/topic/kommandozeilen-tool-um-koordinaten-geoinfo-aus/ durchgekaut

Nochmals vielen Dank für dein Script und gerade wenn ich daran denke, wie aufwendig es ist die Cache-Dateien zu erstellen, dann zeigt es auch hier die Grenzen, wenn man das kostenlos machen will.

Zum Hintergrund der Frage. Ich habe aus der Familie Zypern-Fotos erhalten und angeblich auch eine gpx-Datei schon früher. Auf dieser gpx-Datei sind Daten aus Zypern, wobei ich keine Ahnung habe, wo diese Datei auf meinem PC sein soll. Ich bin mir ziemlich sicher, ich habe die gpx-Datei nicht erhalten. Also dachte ich mir, ich durchsuche alle gpx-Dateien nach Zypern-Koordinaten. Die aus dem GPS-Logger ausgelesene gpx-Datei enthält den Zeitpunkt des Auslesens, dh es kommen nur Dateien ab der Zypern-Reise in Frage und da finde ich beim Datum im Dateinamen nichts. Diese Datei wird im Stanardard-Ordner behalten und in den Albumordner umkopiert und vielleicht in einer 3. Variante um fehlerhafete Koordinaten korrigiert. Variante 2 und 3 haben das Auslesedatum nicht mehr im Namen und unter diesen könnte sich die Zypern-gpx-Datei verstecken.

Bei näherer Überlegung ergibt sich ein viel einfacher Ansatz. Man nimmt ein Zypern-Foto, sieht sich mit exiftool das Datum an und sucht nach diesem Datum in den gpx-Dateien. Damut sollte ich das Problem mit einem einfach grep lösen können.

BTW seahawk, mein Fotoscript in das dein Script integriert ist, funktioniert unter Eoan nicht mehr. Ein simples

identify -format "%w"

bringt bei jpg gar nichts und bei RAW-Dateien eine Fehlermeldung.

identify-im6.q16: delegate failed `'ufraw-batch' --silent --create-id=also --out-type=png --out-depth=16 '--output=%u.png' '%i'' @ error/delegate.c/InvokeDelegate/1928.
identify-im6.q16: unable to open image `/tmp/magick-5347Y1wSQAEMga2v.ppm': Datei oder Verzeichnis nicht gefunden @ error/blob.c/OpenBlob/2874.

https://launchpad.net/ubuntu/eoan/+source/ufraw There is no current release of this source package in The Eoan Ermine. You can still report bugs, make translations, and so on, but they might not be used until the package is published.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

wenn du wirklich nur "irgendwo auf Zypern - ja/nein?" wissen willst, dann kannst du wirklich einfach mit der vorgeschlagenen Box um Zypern arbeiten. Heißt du suchst dir die max Nord-Ost und min Süd-West Koordinaten eines Rechtecks, dass Zypern umschließt und prüfst dagegen deine Koordinaten aus der GPX-Datei.

BTW: GPX-Dateien sind XML, d.h. die Daten willst du lieber mit einem XML-Parser als grep / RegEx durchsuchen.

Gruß, noisefloor

glaskugel

(Themenstarter)

Anmeldungsdatum:
8. Juli 2010

Beiträge: 4224

Hmmh, wie soll ich das rekursiv machen? Ich hatte an "grep -r" gedacht. Wenn sich da irgendein Eintrag mit einem Datum aus dieser Zeit befindet, habe ich die entsprechende gpx-Datei gefunden.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11311

Wohnort: München

glaskugel schrieb:

https://launchpad.net/ubuntu/eoan/+source/ufraw There is no current release of this source package in The Eoan Ermine. You can still report bugs, make translations, and so on, but they might not be used until the package is published.

ufraw ist schon länger ungepflegt und wurde aufgrund ausnutzbarer Sicherheitslücken aus Debian und Ubuntu entfernt (https://www.mail-archive.com/ubuntu-bugs@lists.ubuntu.com/msg5660571.html). Welche Informationen brauchst du genau von den RAW-Images? Wenn es um die Größeninformationen geht, tut es auch das noch aktiv entwickelte libraw in Verbindung mit rawpy (oder einem kleinen C(++) Programm, wenn man zu viel Zeit hat):

sudo apt install python3-venv libraw-dev build-essential
python3 -m venv rawpy_venv # Der Name bzw. Pfad kann nachträglich nicht mehr geändert werden, ohne das venv zu beschädigen!
. rawpy_venv/bin/activate
pip install -U pip rawpy 

Dann ein kleines Python-Skript, dem man die RAW-Dateien als Argument(e) übergeben kann:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/usr/bin/env python3
import sys
import rawpy

for raw_file in sys.argv[1:]:
    try:
        with rawpy.imread(raw_file) as raw:
            print(raw_file, raw.sizes.raw_width, raw.sizes.raw_height)
    except Exception as e:
        print(e, file=sys.stderr)

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11311

Wohnort: München

glaskugel schrieb:

Hmmh, wie soll ich das rekursiv machen? Ich hatte an "grep -r" gedacht. Wenn sich da irgendein Eintrag mit einem Datum aus dieser Zeit befindet, habe ich die entsprechende gpx-Datei gefunden.

z.B. mit Python >= 3.6 und gpxpy (hier mal nur mit der von @noisefloor angesprochenen Prüfung, ob mindestens eine Koordinate innerhalb der Bounding Box liegt, den timestamp der Wegpunkte kann man sich natürlich auch noch ansehen, wenn man weiß, welche Kriterien dafür genutzt werden sollen):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python3
from pathlib import Path
import sys
import gpxpy
from gpxpy import gpx

class BoundingBox:
    def __init__(self, x1, y1, x2, y2):
        self.x1, self.x2 = sorted((x1, x2))
        self.y1, self.y2 = sorted((y1, y2))

    def in_box(self, point):
        if (Cyprus.x1 <= point.longitude <= Cyprus.x2 and
            Cyprus.y1 <= point.latitude <= Cyprus.y2
        ):
            return True
        else:
            print(f"point {point.longitude}, {point.latitude} is outside area")

Cyprus = BoundingBox(32.00, 34.54, 35.57, 35.25)  # use https://boundingbox.klokantech.com/ to get custom coordinates for your bounding box

def check_gpx_file(gpx_file):
    try:
        with open(gpx_file) as f:
            gpx_data = gpxpy.parse(f)
            for track in gpx_data.tracks:
                for segment in track.segments:
                    for point in segment.points:
                        if Cyprus.in_box(point):
                            return True
    except gpx.GPXException as e:
        print(e, file=sys.stderr)
        return false

def search_gpx_files(path='.'):
    return [gpx_file for gpx_file in Path(path).rglob('*.gpx')
            if gpx_file.is_file() and check_gpx_file(gpx_file)]

matches = []
if len(sys.argv) > 1:
    for directory in sys.argv[1:]:
        matches.exend(search_gpx_files(directory))
else:
    matches.extend(search_gpx_files())

if matches:
    print("Folders with gpx data for Cyrus:", file=sys.stderr)
    for match in sorted(matches):
        print(match)
else:
    print("no gpx data for Cyprus found.", file=sys.stderr)

glaskugel

(Themenstarter)

Anmeldungsdatum:
8. Juli 2010

Beiträge: 4224

Danke dir seahawk, ich glaube das diskutieren wir besser im Thread weiter, der vom Titel besser passt. Hier nur ganz kurz, ich brauche eine funktionierende ImageMagick Suite für RAW.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

ich glaube das diskutieren wir besser im Thread weiter, der vom Titel besser passt.

??? - warum? Passt doch alles hier. Und das Python-Skript von seahawk1986 macht genau das, wonach du in deinem Ausgangspost fragst.

Gruß, noisefloor

glaskugel

(Themenstarter)

Anmeldungsdatum:
8. Juli 2010

Beiträge: 4224

Letztlich ist es mir egal, wo es diskutiert wird, aber "Land in einer gpx-Datei finden" hat vom Titel wesentlich weniger im Vergleich zu "Eoan: Auflösung von (RAW-)Fotos bestimmen" zu tun um mein Problem zu lösen. Bei https://forum.ubuntuusers.de/topic/eoan-aufloesung-von-raw-fotos-bestimmen/ habe ich schon mehr zu meinem Problem geschrieben. Das Python-Script passt in dieser Form nicht besonders gut meinem bestehenden riesigen Bash-Script. Ich veffolge mittlerweile den Ansatz Imagemagick zu "reparieren". Siehe bei https://forum.ubuntuusers.de/topic/eoan-aufloesung-von-raw-fotos-bestimmen/

Antworten |