staging.inyokaproject.org

GPX Dateien nach Koordinatenpaar durchsuchen

Status: Gelöst | Ubuntu-Version: Xubuntu 22.04 (Jammy Jellyfish)
Antworten |

FranzausK

Avatar von FranzausK

Anmeldungsdatum:
13. Dezember 2022

Beiträge: 21

Guten Morgen,

Ich habe mehr als 2500 GPX-Dateien und möchte gerne mit Hilfe einer Batch die Dateien suchen die eine bestimmte Koordinate (Wegepunkt etc.) haben.

Diese Eingabe funktioniert:

1
grep 'lat="54.3333' *.gpx |grep 'lon="10.1111' |cut -d: -f1 |sort -u

Gerne würde ich das aber als Batch nach diesem Muster umsetzen "suchKoordinate 54.444 10.111"

Es kneift da am Quoting davon habe ich nicht so viel Ahnung.

Danke für die Hilfe

FranzausK

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Eigentlich musst du da nur eine Funktion erstellen, die das kapselt:

1
2
3
4
5
function find_coordinates {
    grep "lat=\"$1\"" *.gpx | grep "lon=\"$2\"" | cut -d: -f1 | sort -u
}
# Nutzung:
find_coordinates 54.3333 10.1111

Das klappt natürlich nur, wenn beide Werte in der selben Zeile stehen - wenn das nicht gegeben ist, kann es sinnvoll sein XML-Dateien mit einem XML-Parser auszuwerten, z.B. xmlstarlet

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

das GPX-Dateien XML sind würde ich hier auch eher zu einem XML-Parser greifen. Kannst du mal einen Ausschnitt aus einer Datei posten, wo man die Struktur sieht? Sind die 2500 Dateien alle identisch aufgebaut?

Gruß, noisefloor

FranzausK

(Themenstarter)
Avatar von FranzausK

Anmeldungsdatum:
13. Dezember 2022

Beiträge: 21

Danke schon mal für die Antworten,

die Dateien sind nicht alle in gleicher Struktur und stammen von verschiedenen GPS Geräten / verschiedener Herrsteller (seit 1999).

Die XML-Parser hatte ich "gar nicht im Sinn" - da lese ich mich mal ein.

FranzausK

homer65

Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 586

lat und lon auf Gleichheit zu vergleichen ist keine gute Idee, da es sich um Gleitkomma Zahlen handelt und man nicht weiß wie gerundet wird. Habe ein kleines Java Programm geschrieben, das alle Dateien eines Verzeichnisses einliest und prüft, ob die Datei Koordinaten in einem angegebenen Fenster enthält. Vielleicht kann es Dir als Anregung dienen.

 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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package pack;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Main {
	private static boolean istok = false;
	private static double minlat = 1.0;
	private static double maxlat = 100.0;
	private static double minlon = 1.0;
	private static double maxlon = 100.0;
	private static Document doc = null;
	private static String filename = null;
	public static void main(String[] args) throws Exception {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		File dir = new File("/home/christian/gpx/");
		File[] fileList = dir.listFiles();
		for (int i=0;i<fileList.length;i++)
		{
			File file = fileList[i];
			if (file.isFile())
			{
				istok = false;
				filename = file.getAbsolutePath();
				doc = db.parse(filename);
				NodeList nl = doc.getChildNodes();
				parse(nl);
				if (istok) System.out.println(filename);
			}
		}
	}
	public static void parse(NodeList nl)
	{
		String lat = "0.0";
		String lon = "0.0";
		for (int i=0;i<nl.getLength();i++)
		{
			Node node = nl.item(i);
			NamedNodeMap nnm = node.getAttributes();
			if (nnm != null)
			{
				for (int j=0;j<nnm.getLength();j++)
				{
					Node node2 = nnm.item(j);
					if (node2.getNodeName().equals("lat"))
					{
						lat = node2.getNodeValue();
					}
					if (node2.getNodeName().equals("lon"))
					{
						lon = node2.getNodeValue();
						double dlat = Double.parseDouble(lat);
						double dlon = Double.parseDouble(lon);
						if (minlat < dlat && dlat < maxlat)
						{
							if (minlon < dlon && dlon < maxlon)
							{
								istok = true;
							}
						}
					}
				}
			}
			NodeList nl2 = node.getChildNodes();
			if (nl2 != null) parse(nl2);
		}
	}
}

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

wenn die Dateien nicht gleich sind muss du in jeden Typ Datei dann mal reinschauen, weil Lat und Lon da gepspeichert sind. Könnte ja sein, dass das eine Gerät ein Konstrukt wie

<lat>12.345</lat>
<lon>08.789</lon>

hat und das andere

<lat="12.345"></lat>
<lon="08.789"></lon>

Je nach dem, wie "kreativ" die Hersteller der Geräte waren.

Gruß, noisefloor

FranzausK

(Themenstarter)
Avatar von FranzausK

Anmeldungsdatum:
13. Dezember 2022

Beiträge: 21

Oh,

Sie sind sehr kreativ,

da muss ich doch noch ein wenig Arbeit investieren um die Fehlerquote klein zu halten.

Danke an Alle die geantwortet haben

homer65

Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 586

Diese "Kreativität" würde Dir ein XML Parser abnehmen. ☺

homer65

Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 586

Da mich das Thema interessiert, habe ich dem OSMWV (Open Street Map Website Viewer) eine Funktion spendiert, die genau die gewünschte Aufgabe erledigt. Man markiert auf der Karte die Untere linke Ecke eines Bereichs mit dem Button "mark ul" dann markiert man die obere rechte Ecke eines Bereichs mit dem Button "mark or". Anschließend startet man im GPX Menu die "Search GPX Track Directory" und gibt ein Directory mit GPX Tracks vor. Und schon werden im Protokol die gewünschten Tracks gelistet. Um das Programm zu installieren: git clone https://git.launchpad.net/osmwv

Antworten |