me_mjt
Geocacher
Ich bin zwar schon immer mit meinem Garmin cachen gegangen, hatte aber anfangs kein Smartphone. Daher hab ich mir die wichtigsten Informationen zu den Caches notiert. Anfangs im Editor, später dann mit einem kleinen Perlskript einen Text erzeugt, den ich dann ausgedruckt und zum Cachen mitgenommen habe.
Da ich privat sogut wie nie Windows nutze, brauchte ich eine Lösung für Linux. So sind mit der Zeit einige nützliche Perl-Skripte entstanden.
Vor einigen Wochen bin ich hier im Forum auf "geolog" gestoßen, welches ja auch ein Perlskript ist. Den Quellcode hab ich mir mal angesehen und darauf hin in meinem Skript einige Sachen vereinfacht (jetzt benutze ich keine Hashes mehr).
Ich poste hier also ein Skript, welches aus gpx-Dateien (einzelne Caches oder auch Pocketqueries) Notizen extrahiert und auf der Kommandozeile ausgibt.
Wenn keine Argumente übergeben werden liest es alle gpx-Dateien im aktuellen Arbeitsverzeichnis. Es können aber auch gpx-Dateien als Argumente übergeben werden.
Die Konfiguration der Notizen erfolgt am Anfang, weiter unten kann man die Sortierreihenfolge einstellen, im Moment nach GC-Name.
Multies werden Standardmäßig übersprungen, weil man dort ja mehr Text aus dem Listing benötigt.
Ich habe das Skript cachenotes.pl genannt, wer es ausprobieren möchte kann es abspeichern und (unter Linux/Unix) mit dem Befehl
ausführbar machen.
Um die Ausgabe als Text zu speichern, kann man sie in eine Textdatei umleiten, Beispiel
und das ganze dann ausdrucken. Das Skript läuft auch unter Windows wenn Perl installiert ist.
Vielleicht hilft es dem einen oder anderen.
Markus
Da ich privat sogut wie nie Windows nutze, brauchte ich eine Lösung für Linux. So sind mit der Zeit einige nützliche Perl-Skripte entstanden.
Vor einigen Wochen bin ich hier im Forum auf "geolog" gestoßen, welches ja auch ein Perlskript ist. Den Quellcode hab ich mir mal angesehen und darauf hin in meinem Skript einige Sachen vereinfacht (jetzt benutze ich keine Hashes mehr).
Ich poste hier also ein Skript, welches aus gpx-Dateien (einzelne Caches oder auch Pocketqueries) Notizen extrahiert und auf der Kommandozeile ausgibt.
Wenn keine Argumente übergeben werden liest es alle gpx-Dateien im aktuellen Arbeitsverzeichnis. Es können aber auch gpx-Dateien als Argumente übergeben werden.
Die Konfiguration der Notizen erfolgt am Anfang, weiter unten kann man die Sortierreihenfolge einstellen, im Moment nach GC-Name.
Multies werden Standardmäßig übersprungen, weil man dort ja mehr Text aus dem Listing benötigt.
Code:
#!/usr/bin/perl
use strict ;
use warnings ;
use v5.10 ;
# Konfiguration der Cachenotes
my $cachenote = "gcname -- name -- type -- size -- difficulty/terrain
coords
hint\n\n" ;
sub get_owner {
my $cache = shift ;
$cache =~ m/<groundspeak:placed_by>(.*?)<\/groundspeak:placed_by>/i ;
return $1 ;
}
sub get_gcname {
my $cache = shift ;
$cache =~ /<name>(.*?)<\/name>/i ;
return $1 ;
}
sub get_name {
my $cache = shift ;
$cache =~ m/<groundspeak:name>(.*?)<\/groundspeak:name>/i ;
return $1 ;
}
sub get_size {
my $cache = shift ;
$cache =~ m/<groundspeak:container>(.*?)<\/groundspeak:container>/i ;
return $1 ;
}
sub get_type {
my $cache = shift ;
$cache =~ m/<groundspeak:type>(.*?)<\/groundspeak:type>/i ;
return "Tradi" if $1 =~ m/traditional/i ;
return "Multi" if $1 =~ m/multi/i ;
return "Mystery" if $1 =~ m/unknown/i ;
return $1 ;
}
sub get_lat {
my $cache = shift ;
$cache =~ m/<wpt lat="(.*?)" lon=".*">/i ;
return $1 ;
}
sub get_lon {
my $cache = shift ;
$cache =~ m/<wpt lat=".*" lon="(.*?)">/i ;
return $1 ;
}
sub get_difficulty {
my $cache = shift ;
return $cache =~ m/<groundspeak:difficulty>(.*?)<\/groundspeak:difficulty>/i ;
return $1 ;
}
sub get_terrain {
my $cache = shift ;
$cache =~ m/<groundspeak:terrain>(.*?)<\/groundspeak:terrain>/i ;
return $1 ;
}
sub get_hint {
my $cache = shift ;
if ( $cache =~ m/<groundspeak:encoded_hints>(.*?)<\/groundspeak:encoded_hints>/i ) {
return $1 ;
}
else {
return "kein Hint" ;
}
}
sub coords {
my ( $lat, $lon ) = @_ ;
my ( $deg_lat, $min_lat ) = ( int $lat, ($lat-int($lat))*60 ) ;
my ( $deg_lon, $min_lon ) = ( int $lon, ($lon-int($lon))*60 ) ;
return sprintf("N %02d° %.3f' E %03d° %.3f'", $deg_lat, $min_lat, $deg_lon, $min_lon) ;
}
my ( @gpxfiles, $gpxfile ) ;
if ( @ARGV > 0 ) {
@gpxfiles = @ARGV ;
}
else {
opendir THISDIR, "." or die "geht nicht $!" ;
@gpxfiles = readdir THISDIR ;
}
my ( $cache, @caches ) ;
foreach $gpxfile ( @gpxfiles ) {
if ( $gpxfile =~ m/\.gpx$/ ) {
open GPXFILE, "$gpxfile" or die "geht nicht!\n" ;
do {
undef $/ ;
while (<GPXFILE>) {
push @caches, $_ =~ m/(<wpt.*?\/wpt>)/gsi ;
}
} ;
}
}
# Alle bis auf eine Sortiermodus auskommentieren
# sortiere nach Cachename
# @caches = sort { get_name($a) cmp get_name($b) } @caches ;
# sortiere nach GC-Code
@caches = sort { get_gcname($a) cmp get_gcname($b) } @caches ;
# sortiere nach Owner
# @caches = sort { get_owner($a) cmp get_owner($b) } @caches ;
# sortiere nach Entfernung vom Referenzpunkt
foreach $cache ( @caches ) {
my $text = $cachenote ;
my $gcname = get_gcname($cache) ;
my $name = get_name($cache) ;
my $owner = get_owner($cache) ;
my $type = get_type($cache) ;
# die nächste Zeile auskommentieren wenn Multis auch in die Cachenote sollen
next if $type =~ m/multi/i ;
my $size = get_size($cache) ;
my $difficulty = get_difficulty($cache) ;
my $terrain = get_terrain($cache) ;
my $coords = coords(get_lat($cache), get_lon($cache)) ;
my $hint = get_hint($cache) ;
$text =~ s/gcname/$gcname/ ;
$text =~ s/name/$name/ ;
$text =~ s/owner/$owner/ ;
$text =~ s/type/$type/ ;
$text =~ s/size/$size/ ;
$text =~ s/difficulty/$difficulty/ ;
$text =~ s/terrain/$terrain/ ;
$text =~ s/coords/$coords/ ;
$text =~ s/hint/$hint/ ;
say $text ;
}
Code:
chmod 755 chachenotes.pl
Um die Ausgabe als Text zu speichern, kann man sie in eine Textdatei umleiten, Beispiel
Code:
./cachenotes.pl > caches.txt
Vielleicht hilft es dem einen oder anderen.
Markus