• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Warum eigentlich papierlos Cachen?

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.
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 ;
}
Ich habe das Skript cachenotes.pl genannt, wer es ausprobieren möchte kann es abspeichern und (unter Linux/Unix) mit dem Befehl
Code:
chmod 755 chachenotes.pl
ausführbar machen.
Um die Ausgabe als Text zu speichern, kann man sie in eine Textdatei umleiten, Beispiel
Code:
./cachenotes.pl > caches.txt
und das ganze dann ausdrucken. Das Skript läuft auch unter Windows wenn Perl installiert ist.

Vielleicht hilft es dem einen oder anderen.

Markus
 

wilde-maus

Geomaster
intereressant. Werde ich testen. Ich halte von paperless auch nicht viel und arbeite auch mit kleinen Notitzen. Allerdings ist meine Art deutlich anders.
 

httpneo

Geonewbie
Cool, muss ich auch ausprobieren.

Trotzt toller Geräte, finde ich auch Papier weiterhin wichtig. Geht auch viel schneller vor allem wenn es Kalt ist.
 
Oben