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

Script um PQ nach Cachetyp aufteilen

Kalli

Geowizard
Hi,

ich suche nach einer Lösung, um die PQ in einzelne GPX-Files nach Cachetyp aufzuteilen, damit ich mit gpsbabel entsprechende .gpi-Dateien mit eigenen Icons erzeugen kann. Das Ganze sollte möglichst als Shell-Script (bash o.Ä.) laufen, bzw. der Code als Source zur Verfügung stehen.

Hintergrund:
Ich habe ein jailbroken iPad, ein Camera Connection Kit und iFile. Bei einem jailbroken iPad hat man Zugriff auf die Shell. Für den Einsatz im Urlaub möchte ich auf einen Laptop verzichten und nur das iPad mitnehmen, neben dem Oregon und dem Nüvi.
Gpsbabel habe ich auf dem iPad auch zu Laufen gebracht. Somit habe ich die Basis, um zumindest die PQ-GPX auf der Speicherkarte des Oregon abzulegen und GPX-Dateien nach GPI zu konvertieren.
Unter Windows mache ich es so, dass die Addi Wpts entweder über CacheWolf oder den POI-Frosch in POIs umgewandelt werden. Zusätzlich habe ich noch ein Garmin Nüvi, da kommen dann alle POIs drauf. Diesen Workflow möchte ich nun auf meine "Urlaubslösung" übertragen. Es kommen also keine Programme in Frage, die eine grafische Oberfläche haben und/oder nur unter Windows laufen.

Noch etwas:
Eine Diskussion darüber, dass das iPad kein Laptop-Ersatz ist, es mit Android besser geht etc. kann man sich sparen. Das iPad kommt sowie mit, der Laptop bleibt zu Hause.
 

me_mjt

Geocacher
Hallo,

mal eine Gegenfrage (nee, nicht wegen des Laptops :D ), kannst Du Perl?

Ich benutze ein Perlscript um aus GPX-Dateien und PocketQueries eine Textdatei zu erzeugen mit Kurzinfos zu jedem Cache (Smartphonefreies Cachen sozusagen ;) ). Das könntest Du als Grundlage nehmen um für die einzelnen Caches die Icons zu ändern. Soweit ich weiß, werden die mit dem "sym"-Tag festgelegt.

Markus
 
OP
Kalli

Kalli

Geowizard
Hi,

perl kann ich für den Hausgebrauch, wie gut das Perl für das iPad ist, kann ich nicht sagen. Ich hatte auch schon überlegt, mit gpsbabel eine xcsv-Datei zu machen, diese dann mit gawk aufzuteilen und dann aus den einzelnen Dateien wieder POIs zu machen, mit einem eigenen Symbol halt. In der xcsv-Datei ist allerdings auch viel Text drin, der dann das Aufteilen im einzelne Felder mit gawk erschwert.

Hauptsächlich geht es um die Addi Wpts, hier könnte es auch schon helfen, die sym-Tags mit sed umbenennen zu lassen.
 

me_mjt

Geocacher
Ich bin auch nicht der große Perl-Experte. Aber mir hat es oft gute Dienste geleistet.

Aber ich glaube da passt mein Skript nicht so richtig. Es legt für jeden Cache im PocketQuery drei Zeilen mit einer Kurzbeschreibung an, und zwar als LaTeX-Datei. Damit es Deinen Anforderungen gerecht wird, müsstest Du die Ausgabe in eine Datei entfernen. Das Skript durchläuft die komplette GPX-Datei und legt für jeden Cache einen Hash an mit GC-Code, Cachename, Größe, Koordinaten, Hint und so weiter. Die Hash-Referenzen werden in einem Array gespeichert. Als Parameter nimmt das Skript den Dateinamen vom Pockequery.

Es nimmt aber an keiner Stelle der GPX-Datei Veränderungen vor, das müsstes Du selbst einbauen. Vielleicht ist Deine Idee mit sed besser.

Ich poste es hier mal, hoffentlich ist es nicht zu lang...
Code:
#!/usr/bin/perl

# todo: Cachetypen wählen oder ausschließen

use strict ;
use warnings ;
use v5.10 ;

sub gettag {
    my ( $line, $sp ) = @_ ;
    for ( $line ) { 
        s/\s+<$sp>//g ;  
        s/<\/$sp>// ;  
        s/\r//g ;
        s/\n//g ;
    }
    return $line ;
}

sub escape {
    my $line = shift ;
    $$line =~ s/#/\\#/g ;
    $$line =~ s/&/\\&/g ;
    $$line =~ s/\[/(/g ;
    $$line =~ s/\]/)/g ;
    $$line =~ s/"(\w)/\\glqq\ $1/g ;
    $$line =~ s/(\w)"/$1\\grqq/g ;
}

my ( $ref_n, $ref_e ) ;
sub distance {
    my ( $north, $east ) = @_ ;
    my $ndist = ( $north - $ref_n ) * 111 ;
    my $edist = ( $east - $ref_e ) * 71.5 ; # gilt für den 51. Breitengrad
    my $dist = sqrt( $ndist**2 + $edist**2 ) ;
    say $dist ;
    return $dist ;
}

my $pquery = $ARGV[0] ;
#my $maxdist = $ARGV[1] ;
#my $refcache = $ARGV[2] ;
my $line ;
my @caches ;
my %cache ;
my @latlon ;

open PQUERY, $pquery or die "geht nicht $!" ;

foreach $line ( <PQUERY> ) {
    utf8::decode $line ;
    last if $line =~ m/<\/gpx/ ;
    if ( $line =~ m/<wpt / ) {
        @latlon  = split /"/,$line ; 
        $cache{ north } = $latlon[1] ; 
        $cache{ east } = $latlon[3] ; 
    }
    #######################
    elsif ( $line =~ /<name>GC/ && !exists $cache{ gcname } ) {
        $cache{ gcname } = gettag( $line, "name" ) ; 
    }
    elsif ( $line =~ /groundspeak:name/ && !exists $cache{ cachename } ) {
        $cache{ cachename } = gettag( $line, "groundspeak:name" ) ; 
    }
    elsif ( $line =~ /groundspeak:container/ && !exists $cache{ container } ) {
        $cache{ container } = gettag( $line, "groundspeak:container" ) ; 
    }
    elsif ( $line =~ /<groundspeak:type>/ && !exists $cache{ type } ) { 
        $line =~ s/Traditional Cache/Tradi/i ;
        $line =~ s/Multi-Cache/Multi/i ;
        $line =~ s/Unknown Cache/Mystery/i ;
        $cache{ type } = gettag( $line, "groundspeak:type" ) ; 
    } 
    elsif ( $line =~ /<groundspeak:difficulty>/ && !exists $cache{ difficulty } ) {
        $cache{ difficulty } = gettag( $line, "groundspeak:difficulty" ) ; 
    }
    elsif ( $line =~ /<groundspeak:terrain>/ && !exists $cache{ terrain } ) {
        $cache{ terrain } = gettag( $line, "groundspeak:terrain" ) ; 
    }
    elsif ( $line =~ /encoded_hints/ && !exists $cache{ hint } ) {
        $cache{ hint } = gettag( $line, "groundspeak:encoded_hints" ) ; 
        #last ;
    }
    ######################################
    elsif ( $line =~ m/<\/wpt/ ) {
        #if ( $cache{ 'gcname' } eq $refcache ) {
        #    $ref_n = $cache{ 'north' } ;
        #    $ref_e = $cache{ 'east' } ;
        #}
        my %newcache = %cache ;
        push @caches, \%newcache ;
    %cache = () ;
    }
}
close PQUERY ;

#my $cache ;
#my $key ;
#foreach $cache ( @caches ) {
#    foreach ( %$cache ) {
#        say $_ ;
#    }
#}

# Dateiname der LaTeX-Datei
my ($sek,$min,$std,$mtag,$mon,$jahr,$wtag,$jtag,$isdst) = localtime(time);
my $year = $jahr+1900 ;
my $month = qw(jan feb mrz apr mai jun jul aug sep okt nov dez)[$mon] ;
my $wday = qw(so mo di mi do fr sa)[$wtag] ;
my $filename = "pq." . $wday . '_' . $year . '_' . $month . '_' . $mtag . ".tex" ;

# LaTeX-Präambel
my $latexheader = <<HEADER;
\\documentclass[10pt]{scrartcl}
\\usepackage[ngerman]{babel}
\\usepackage{libertine}
\\usepackage[T1]{fontenc}
\\usepackage[latin1]{inputenc}
\\usepackage{mathpazo,avant,courier}
\\usepackage[inner=1.5cm,outer=1.5cm,top=0.5cm,bottom=0.5cm,includeheadfoot]{geometry}
\\usepackage{fancyhdr,lastpage}
\\pagestyle{fancy}
\\fancyhf{}
\\fancyhead[L]{Seite \\thepage von \\pageref{LastPage}}
\\fancyfoot[L]{Seite \\thepage von \\pageref{LastPage}}
\\parindent0pt
\\begin{document}
\\normalfont\\sf 
HEADER

my $latexfoot = "\\end{document}" ;

open CACHEFILE, ">$filename" or die "geht nicht $!" ;

print CACHEFILE $latexheader ;

my $cache ;
foreach $cache ( @caches ) {
    # next if distance( $$cache{ 'north' }, $$cache{ 'east' } ) > $maxdist ;
    my $line = "$$cache{ 'gcname' }  \\textbf\{$$cache{ 'cachename' }\}" ;
    escape \$line ;
    print CACHEFILE $line, "\\nopagebreak \\\\\n" ;
    my $type = "$$cache{ 'type' } -- $$cache{ 'container' } -- $$cache{ 'difficulty' }/$$cache{ 'terrain' }" ;
    printf CACHEFILE "\\textbf{N %d\260 %.3f'  E %d\260 %.3f'} -- $type \\nopagebreak \\\\\n", int($$cache{'north'}), ($$cache{'north'}-int($$cache{'north'}))*60, int($$cache{'east'}), ($$cache{'east'}-int($$cache{'east'}))*60 ;
    if ( $$cache{ hint } ) {
        $line = $$cache{ hint } ;
        escape \$line ;
        print CACHEFILE $line, "\\\\\n" ;
    }
    print CACHEFILE "\\\\\n" ;
}

print CACHEFILE $latexfoot ;

close CACHEFILE ;

Vielleicht ist es nützlich für Dich.

Markus
 
OP
Kalli

Kalli

Geowizard
Besten Dank, passt aber nicht so ganz. Ich suche etwas, wo ich die .gpx und wpts.gpx aus der PQ reinschmeisse und dann einzelne GPX-Dateien rauskommen, also z.B. Traditional.gpx, Mulitcache.gpx usw. sowie Parking.gpx, Trailhead.gpx usw. für die Addis.
 
Oben