From 99ae16be76fdd5e4cbc6e83b871dcb381f5dcdef Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20A=2E=20Holm?= Date: Fri, 14 May 2010 01:22:05 +0200 Subject: [PATCH] Removing branches/gpst.postgis/, nothing valuable there 68270612-5ee6-11df-9523-90e6ba3022ac --- branches/gpst.postgis/BUGS | 11 - branches/gpst.postgis/GPST.pm | 192 -- branches/gpst.postgis/GPSTdate.pm | 75 - branches/gpst.postgis/GPSTdebug.pm | 41 - branches/gpst.postgis/GPSTgeo.pm | 95 - branches/gpst.postgis/GPSTxml.pm | 50 - branches/gpst.postgis/Patch/events+func.patch | 39 - branches/gpst.postgis/Patch/files.patch | 60 - branches/gpst.postgis/Patch/gpst-xmlsimple | 1432 ------------ branches/gpst.postgis/Patch/hvor.patch | 30 - branches/gpst.postgis/Patch/mayko-comments.patch | 40 - .../gpst.postgis/Patch/xgraph-fix_plus_more.patch | 101 - branches/gpst.postgis/Patch/ygraph-midnight.patch | 38 - branches/gpst.postgis/TODO | 56 - branches/gpst.postgis/addpoints | 309 --- branches/gpst.postgis/doc/Makefile | 22 - branches/gpst.postgis/doc/currpos.ods | Bin 8913 -> 0 bytes branches/gpst.postgis/doc/distance.txt | 33 - branches/gpst.postgis/doc/gpst.1 | 670 ------ branches/gpst.postgis/doc/gpst.html | 136 -- branches/gpst.postgis/doc/gpst.xml | 682 ------ branches/gpst.postgis/doc/mayko.txt | 37 - branches/gpst.postgis/doc/til_postgres.txt | 56 - branches/gpst.postgis/gpslist | 14 - branches/gpst.postgis/gpsman2gpx | 266 --- branches/gpst.postgis/gpst | 1269 ----------- branches/gpst.postgis/gpst-pic | 399 ---- branches/gpst.postgis/makemesh | 248 --- branches/gpst.postgis/poisync | 16 - .../postgres/Patch/floatingpoint-testing.patch | 48 - .../gpst.postgis/postgres/Patch/wheretype.patch | 49 - branches/gpst.postgis/postgres/allupdate.sql | 3 - branches/gpst.postgis/postgres/create_funcs.sql | 200 -- branches/gpst.postgis/postgres/create_index.sql | 32 - branches/gpst.postgis/postgres/create_table.sql | 80 - branches/gpst.postgis/postgres/create_views.sql | 155 -- branches/gpst.postgis/postgres/distupdate.sql | 30 - branches/gpst.postgis/postgres/div.txt | 5 - branches/gpst.postgis/postgres/init.sh | 9 - branches/gpst.postgis/postgres/init.sql | 6 - branches/gpst.postgis/postgres/path.sql | 8 - branches/gpst.postgis/postgres/update_things.sql | 126 -- branches/gpst.postgis/run | 13 - branches/gpst.postgis/tests/Makefile | 10 - branches/gpst.postgis/tests/addpoints/Makefile | 7 - branches/gpst.postgis/tests/addpoints/addpoints.t | 341 --- .../gpst.postgis/tests/addpoints/log/tests.log | 13 - .../tests/addpoints/log/todo-tests.log | 4 - branches/gpst.postgis/tests/chronology-error.gpsml | 19 - branches/gpst.postgis/tests/comments.mayko | 13 - branches/gpst.postgis/tests/compact.gpx | 1 - branches/gpst.postgis/tests/date_error.mayko | 6 - .../gpst.postgis/tests/different_dateformats.gpsml | 10 - branches/gpst.postgis/tests/gpst-pic/Makefile | 8 - .../gpst.postgis/tests/gpst-pic/files/DSC_4426.JPG | Bin 109366 -> 0 bytes branches/gpst.postgis/tests/gpst-pic/gpst-pic.t | 517 ----- branches/gpst.postgis/tests/gpst-pic/log/tests.log | 50 - .../gpst.postgis/tests/gpst-pic/log/todo-tests.log | 40 - branches/gpst.postgis/tests/gpst-pic/testcmd | 9 - branches/gpst.postgis/tests/log.dos.gpstxt | 11 - branches/gpst.postgis/tests/log.dos.mayko | 7 - branches/gpst.postgis/tests/log.gpstxt | 18 - branches/gpst.postgis/tests/log.mcsv | 47 - branches/gpst.postgis/tests/log.unix.mcsv | 13 - branches/gpst.postgis/tests/log/tests.log | 413 ---- branches/gpst.postgis/tests/log/todo-tests.log | 195 -- branches/gpst.postgis/tests/missing.gpsml | 20 - branches/gpst.postgis/tests/multitrack-pause.gpsml | 28 - branches/gpst.postgis/tests/multitrack-pause.gpx | 44 - branches/gpst.postgis/tests/multitrack.gpx | 81 - branches/gpst.postgis/tests/no_signal.mayko | 10 - branches/gpst.postgis/tests/one_ele.dos.gpsml | 12 - branches/gpst.postgis/tests/pause.gpx | 44 - branches/gpst.postgis/tests/run-tests.pl | 2319 -------------------- branches/gpst.postgis/tests/testcmd | 9 - branches/gpst.postgis/tests/two-digit_year.mcsv | 11 - 76 files changed, 11511 deletions(-) delete mode 100644 branches/gpst.postgis/BUGS delete mode 100644 branches/gpst.postgis/GPST.pm delete mode 100644 branches/gpst.postgis/GPSTdate.pm delete mode 100644 branches/gpst.postgis/GPSTdebug.pm delete mode 100644 branches/gpst.postgis/GPSTgeo.pm delete mode 100644 branches/gpst.postgis/GPSTxml.pm delete mode 100644 branches/gpst.postgis/Patch/events+func.patch delete mode 100644 branches/gpst.postgis/Patch/files.patch delete mode 100755 branches/gpst.postgis/Patch/gpst-xmlsimple delete mode 100644 branches/gpst.postgis/Patch/hvor.patch delete mode 100644 branches/gpst.postgis/Patch/mayko-comments.patch delete mode 100644 branches/gpst.postgis/Patch/xgraph-fix_plus_more.patch delete mode 100644 branches/gpst.postgis/Patch/ygraph-midnight.patch delete mode 100644 branches/gpst.postgis/TODO delete mode 100755 branches/gpst.postgis/addpoints delete mode 100644 branches/gpst.postgis/doc/Makefile delete mode 100644 branches/gpst.postgis/doc/currpos.ods delete mode 100644 branches/gpst.postgis/doc/distance.txt delete mode 100644 branches/gpst.postgis/doc/gpst.1 delete mode 100644 branches/gpst.postgis/doc/gpst.html delete mode 100644 branches/gpst.postgis/doc/gpst.xml delete mode 100644 branches/gpst.postgis/doc/mayko.txt delete mode 100644 branches/gpst.postgis/doc/til_postgres.txt delete mode 100755 branches/gpst.postgis/gpslist delete mode 100755 branches/gpst.postgis/gpsman2gpx delete mode 100755 branches/gpst.postgis/gpst delete mode 100755 branches/gpst.postgis/gpst-pic delete mode 100755 branches/gpst.postgis/makemesh delete mode 100755 branches/gpst.postgis/poisync delete mode 100644 branches/gpst.postgis/postgres/Patch/floatingpoint-testing.patch delete mode 100644 branches/gpst.postgis/postgres/Patch/wheretype.patch delete mode 100644 branches/gpst.postgis/postgres/allupdate.sql delete mode 100644 branches/gpst.postgis/postgres/create_funcs.sql delete mode 100644 branches/gpst.postgis/postgres/create_index.sql delete mode 100644 branches/gpst.postgis/postgres/create_table.sql delete mode 100644 branches/gpst.postgis/postgres/create_views.sql delete mode 100644 branches/gpst.postgis/postgres/distupdate.sql delete mode 100644 branches/gpst.postgis/postgres/div.txt delete mode 100755 branches/gpst.postgis/postgres/init.sh delete mode 100644 branches/gpst.postgis/postgres/init.sql delete mode 100644 branches/gpst.postgis/postgres/path.sql delete mode 100644 branches/gpst.postgis/postgres/update_things.sql delete mode 100755 branches/gpst.postgis/run delete mode 100644 branches/gpst.postgis/tests/Makefile delete mode 100644 branches/gpst.postgis/tests/addpoints/Makefile delete mode 100755 branches/gpst.postgis/tests/addpoints/addpoints.t delete mode 100644 branches/gpst.postgis/tests/addpoints/log/tests.log delete mode 100644 branches/gpst.postgis/tests/addpoints/log/todo-tests.log delete mode 100644 branches/gpst.postgis/tests/chronology-error.gpsml delete mode 100644 branches/gpst.postgis/tests/comments.mayko delete mode 100644 branches/gpst.postgis/tests/compact.gpx delete mode 100644 branches/gpst.postgis/tests/date_error.mayko delete mode 100644 branches/gpst.postgis/tests/different_dateformats.gpsml delete mode 100644 branches/gpst.postgis/tests/gpst-pic/Makefile delete mode 100644 branches/gpst.postgis/tests/gpst-pic/files/DSC_4426.JPG delete mode 100755 branches/gpst.postgis/tests/gpst-pic/gpst-pic.t delete mode 100644 branches/gpst.postgis/tests/gpst-pic/log/tests.log delete mode 100644 branches/gpst.postgis/tests/gpst-pic/log/todo-tests.log delete mode 100644 branches/gpst.postgis/tests/gpst-pic/testcmd delete mode 100644 branches/gpst.postgis/tests/log.dos.gpstxt delete mode 100644 branches/gpst.postgis/tests/log.dos.mayko delete mode 100644 branches/gpst.postgis/tests/log.gpstxt delete mode 100644 branches/gpst.postgis/tests/log.mcsv delete mode 100644 branches/gpst.postgis/tests/log.unix.mcsv delete mode 100644 branches/gpst.postgis/tests/log/tests.log delete mode 100644 branches/gpst.postgis/tests/log/todo-tests.log delete mode 100644 branches/gpst.postgis/tests/missing.gpsml delete mode 100644 branches/gpst.postgis/tests/multitrack-pause.gpsml delete mode 100644 branches/gpst.postgis/tests/multitrack-pause.gpx delete mode 100644 branches/gpst.postgis/tests/multitrack.gpx delete mode 100644 branches/gpst.postgis/tests/no_signal.mayko delete mode 100644 branches/gpst.postgis/tests/one_ele.dos.gpsml delete mode 100644 branches/gpst.postgis/tests/pause.gpx delete mode 100755 branches/gpst.postgis/tests/run-tests.pl delete mode 100644 branches/gpst.postgis/tests/testcmd delete mode 100644 branches/gpst.postgis/tests/two-digit_year.mcsv diff --git a/branches/gpst.postgis/BUGS b/branches/gpst.postgis/BUGS deleted file mode 100644 index 69965a6..0000000 --- a/branches/gpst.postgis/BUGS +++ /dev/null @@ -1,11 +0,0 @@ -$Id$ - -gpst - - Does not create elements in GPX output. - Affected tests: - - "../gpst -e -o gpx pause.gpx" - --epoch is ignored in gpx output - - "../gpst -o gpx missing.gpsml" - Output GPX from gpsml with missing data - - "../gpst -w -o gpx pause.gpx" - Strip whitespace from GPX output - -vim: set ts=2 sts=2 sw=2 et tw=78 : diff --git a/branches/gpst.postgis/GPST.pm b/branches/gpst.postgis/GPST.pm deleted file mode 100644 index d2e9863..0000000 --- a/branches/gpst.postgis/GPST.pm +++ /dev/null @@ -1,192 +0,0 @@ -package GPST; - -#======================================================================= -# $Id$ -# -# Character set: UTF-8 -# ©opyleft 2002– Øyvind A. Holm -# License: GNU General Public License, see end of file for legal stuff. -#======================================================================= - -use strict; -use warnings; - -use GPSTdebug; -use GPSTgeo; - -BEGIN { - use Exporter (); - our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); - - my $rcs_id = '$Id$'; - push(@main::version_array, $rcs_id); - $VERSION = ($rcs_id =~ / (\d+) /, $1); - - @ISA = qw(Exporter); - @EXPORT = qw(&trackpoint &postgresql_copy_safe); - %EXPORT_TAGS = (); -} -our @EXPORT_OK; - -our $Spc = " "; - -sub trackpoint { - # Receive a hash and return a trackpoint as a string {{{ - my %Dat = @_; - - defined($Dat{'what'}) || return(undef); - defined($Dat{'format'}) || return(undef); - defined($Dat{'error'}) || return(undef); - - defined($Dat{'year'}) || ($Dat{'year'} = 0); - defined($Dat{'month'}) || ($Dat{'month'} = 0); - defined($Dat{'day'}) || ($Dat{'day'} = 0); - defined($Dat{'hour'}) || ($Dat{'hour'} = ""); - defined($Dat{'min'}) || ($Dat{'min'} = ""); - defined($Dat{'sec'}) || ($Dat{'sec'} = ""); - my $print_time = ( - !$Dat{'year'} || - !$Dat{'month'} || - !$Dat{'day'} || - !length($Dat{'hour'}) || - !length($Dat{'min'}) || - !length($Dat{'sec'}) - ) ? 0 : 1; - - if ( - ("$Dat{'year'}$Dat{'month'}$Dat{'day'}$Dat{'hour'}$Dat{'min'}" =~ - /[^\d]/) || ($Dat{'sec'} =~ /[^\d\.]/) - ) { - ($print_time = 0); - } - "$Dat{'lat'}$Dat{'lon'}" =~ /[^\d\.\-\+]/ && return(undef); - - defined($Dat{'lat'}) || ($Dat{'lat'} = ""); - defined($Dat{'lon'}) || ($Dat{'lon'} = ""); - defined($Dat{'ele'}) || ($Dat{'ele'} = ""); - defined($Dat{'desc'}) || ($Dat{'desc'} = ""); - - my $Retval = ""; - - if ($Dat{'what'} eq "tp") { - my $err_str = length($Dat{'error'}) ? $Dat{'error'} : ""; - if ($Dat{'format'} eq "gpsml") { - # {{{ - my $Elem = length($err_str) ? "etp" : "tp"; - $Retval .= join("", - $print_time - ? sprintf(" ", - $Dat{'year'}, $Dat{'month'}, $Dat{'day'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}*1.0 - ) - : "", - (length($Dat{'lat'})) - ? "" . $Dat{'lat'}*1.0 . " " - : "", - (length($Dat{'lon'})) - ? "" . $Dat{'lon'}*1.0 . " " - : "", - (length($Dat{'ele'})) - ? "" . $Dat{'ele'}*1.0 . " " - : "", - (length($Dat{'desc'})) - ? sprintf("%s ", - $Dat{'desc'}) - : "" - ); - length($Retval) && - ($Retval = sprintf("<%s%s> %s\n", - $Elem, - length($err_str) ? " err=\"$err_str\"" : "", - $Retval, - $Elem) - ); - # }}} - } elsif($Dat{'format'} eq "gpx") { - # {{{ - my $lat_str = length($Dat{'lat'}) ? " lat=\"$Dat{'lat'}\"" : ""; - my $lon_str = length($Dat{'lon'}) ? " lon=\"$Dat{'lon'}\"" : ""; - my ($estr_begin, $estr_ext, $estr_end) = - ( "", "", ""); - if (length($err_str)) { - $estr_begin = ""; - } - if (length("$lat_str$lon_str$Dat{'ele'}")) { - $Retval .= - join("", - "$Spc$Spc$Spc$Spc$Spc$Spc", - $estr_begin, - "", - "$Spc", - length($Dat{'ele'}) - ? "$Dat{'ele'}$Spc" - : "", - $print_time - ? "$Spc" - : "", - $estr_ext, - "$estr_end\n" - ); - } - # }}} - } elsif($Dat{'format'} eq "clean") { - $Retval .= "$Dat{'lon'}\t$Dat{'lat'}\t$Dat{'ele'}\n"; - } elsif($Dat{'format'} eq "xgraph") { - if (length($Dat{'lat'}) && length($Dat{'lon'})) { - $Retval .= "$Dat{'lon'} $Dat{'lat'}\n"; - } - } elsif ($Dat{'format'} eq "pgtab") { - $Retval .= join("\t", - $Dat{'year'} - ? "$Dat{'year'}-$Dat{'month'}-$Dat{'day'}T" . - "$Dat{'hour'}:$Dat{'min'}:$Dat{'sec'}Z" - : '\N', # date - (length($Dat{'lat'}) && length($Dat{'lon'})) - ? "($Dat{'lat'},$Dat{'lon'})" - : '\N', # coor - length($Dat{'ele'}) ? $Dat{'ele'} : '\N', # ele - '\N', # sted - '\N', # dist - '\N', # description - '\N' # avst - ) . "\n"; - } elsif ($Dat{'format'} eq "gpstrans") { - # {{{ - my ($gpt_lat, $gpt_lon) = - (ddd_to_dms($Dat{'lat'}), ddd_to_dms($Dat{'lon'})); - if ($print_time) { - $Retval .= "T\t$Dat{'month'}/$Dat{'day'}/$Dat{'year'} " . - "$Dat{'hour'}:$Dat{'min'}:$Dat{'sec'}\t" . - "$gpt_lat\t$gpt_lon\n"; - } else { - $Retval .= "T\t00/00/00 00:00:00\t$gpt_lat\t$gpt_lon\n"; - } - # }}} - } else { - $Retval = undef; - } - } else { - $Retval = undef; - } - return $Retval; - # }}} -} - -sub postgresql_copy_safe { - # {{{ - my $Str = shift; - $Str =~ s/\\/\\\\/gs; - $Str =~ s/\n/\\n/gs; - $Str =~ s/\r/\\r/gs; - $Str =~ s/\t/\\t/gs; - return($Str); - # }}} -} - -1; diff --git a/branches/gpst.postgis/GPSTdate.pm b/branches/gpst.postgis/GPSTdate.pm deleted file mode 100644 index a837efd..0000000 --- a/branches/gpst.postgis/GPSTdate.pm +++ /dev/null @@ -1,75 +0,0 @@ -package GPSTdate; - -#======================================================================= -# $Id$ -# -# Character set: UTF-8 -# ©opyleft 2002– Øyvind A. Holm -# License: GNU General Public License, see end of file for legal stuff. -#======================================================================= - -use strict; -use warnings; - -BEGIN { - use Exporter (); - our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); - - my $rcs_id = '$Id$'; - push(@main::version_array, $rcs_id); - $VERSION = ($rcs_id =~ / (\d+) /, $1); - - @ISA = qw(Exporter); - @EXPORT = qw(&sec_to_string &sec_to_readable); - %EXPORT_TAGS = (); -} -our @EXPORT_OK; - -sub sec_to_string { - # Convert seconds since 1970 to "yyyy-mm-dd hh:mm:ss" with optional - # separator - # {{{ - my ($Seconds, $Sep) = @_; - length($Seconds) || return(undef); - ($Seconds =~ /^(\d*)(\.\d+)?$/) || return(undef); - my $Secfrac = ($Seconds =~ /^([\-\d]*)(\.\d+)$/) ? 1.0*$2 : ""; - $Secfrac =~ s/^0//; - - defined($Sep) || ($Sep = " "); - my @TA = gmtime($Seconds); - my($DateString) = sprintf("%04u-%02u-%02u%s%02u:%02u:%02u%s", - $TA[5]+1900, $TA[4]+1, $TA[3], $Sep, - $TA[2], $TA[1], $TA[0], $Secfrac); - return($DateString); - # }}} -} - -sub sec_to_readable { - # Convert seconds since 1970 to human-readable format (d:hh:mm:ss) - # {{{ - my $Seconds = shift; - my ($Day, $Hour, $Min, $Sec) = - ( 0, 0, 0, 0); - - length($Seconds) || ($Seconds = 0); - ($Seconds =~ /^(\d*)(\.\d+)?$/) || return(undef); - my $Secfrac = ($Seconds =~ /^(\d*)(\.\d+)$/) ? 1.0*$2 : ""; - $Secfrac =~ s/^0//; - - $Day = int($Seconds/86400); - $Seconds -= $Day * 86400; - - $Hour = int($Seconds/3600); - $Seconds -= $Hour * 3600; - - $Min = int($Seconds/60); - $Seconds -= $Min * 60; - - $Sec = $Seconds; - - return(sprintf("%u:%02u:%02u:%02u%s", - $Day, $Hour, $Min, $Sec, $Secfrac)); - # }}} -} - -1; diff --git a/branches/gpst.postgis/GPSTdebug.pm b/branches/gpst.postgis/GPSTdebug.pm deleted file mode 100644 index 472fc2c..0000000 --- a/branches/gpst.postgis/GPSTdebug.pm +++ /dev/null @@ -1,41 +0,0 @@ -package GPSTdebug; - -#======================================================================= -# $Id$ -# -# Character set: UTF-8 -# ©opyleft 2002– Øyvind A. Holm -# License: GNU General Public License, see end of file for legal stuff. -#======================================================================= - -use strict; -use warnings; - -BEGIN { - use Exporter (); - our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); - - my $rcs_id = '$Id$'; - push(@main::version_array, $rcs_id); - $VERSION = ($rcs_id =~ / (\d+) /, $1); - - @ISA = qw(Exporter); - @EXPORT = qw(&D); - %EXPORT_TAGS = (); -} -our @EXPORT_OK; - -sub D { - # Print a debugging message {{{ - $main::Debug || return; - my @call_info = caller; - chomp(my $Txt = shift); - my $File = $call_info[1]; - $File =~ s#\\#/#g; - $File =~ s#^.*/(.*?)$#$1#; - print(STDERR "$File:$call_info[2] $$ $Txt\n"); - return(""); - # }}} -} # D() - -1; diff --git a/branches/gpst.postgis/GPSTgeo.pm b/branches/gpst.postgis/GPSTgeo.pm deleted file mode 100644 index ac9091e..0000000 --- a/branches/gpst.postgis/GPSTgeo.pm +++ /dev/null @@ -1,95 +0,0 @@ -package GPSTgeo; - -#======================================================================= -# $Id$ -# -# Character set: UTF-8 -# ©opyleft 2002– Øyvind A. Holm -# License: GNU General Public License, see end of file for legal stuff. -#======================================================================= - -use strict; -use warnings; - -BEGIN { - use Exporter (); - our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); - - my $rcs_id = '$Id$'; - push(@main::version_array, $rcs_id); - $VERSION = ($rcs_id =~ / (\d+) /, $1); - - @ISA = qw(Exporter); - @EXPORT = qw(&list_nearest_waypoints &ddd_to_dms); - %EXPORT_TAGS = (); -} -our @EXPORT_OK; - -sub list_nearest_waypoints { - # {{{ - my ($Lat, $Lon, $Count) = @_; - - # FIXME: Hardcoding - my $waypoint_file = "/home/sunny/gps/waypoints.gpx"; - - # FIXME: Incredible unfinished and kludgy. - if (open(WaypFP, "$main::Cmd{'gpsbabel'} -i gpx -f $waypoint_file " . - "-x radius,lat=$Lat,lon=$Lon,distance=1000 " . - "-o gpx -F - |") - ) { - my $Str = join("", ); - $Str =~ s{ - ^.*?.*?(.+?).*?.*? - .*?.*?(.+?).*?.*? - .*?.*?(.+?).*?.*$ - }{ - "($1, $2, $3)"; - }sex; - return($Str); - } else { - die("$main::progname: Cannot open $main::Cmd{'gpsbabel'} pipe: $!\n"); - } - # }}} -} - -sub ddd_to_dms { - # Convert floating-point degrees into D°M'S.S" (ISO-8859-1). - # Necessary for import into GPSman. Based on toDMS() from - # gpstrans-0.39 to ensure compatibility. - # {{{ - my $ddd = shift; - my $Neg = 0; - my ($Hour, $Min, $Sec) = - ( 0, 0, 0); - my $Retval = ""; - - ($ddd =~ /^\-?(\d*)(\.\d+)?$/) || return(undef); - length($ddd) || ($ddd = 0); - - if ($ddd < 0.0) { - $ddd = 0 - $ddd; - $Neg = 1; - } - $Hour = int($ddd); - $ddd = ($ddd - $Hour) * 60.0; - $Min = int($ddd); - $Sec = ($ddd - $Min) * 60.0; - - if ($Sec > 59.5) { - $Sec = 0.0; - $Min += 1.0; - } - if ($Min > 59.5) { - $Min = 0.0; - $Hour += 1.0; - } - $Retval = sprintf("%s%.0f\xB0%02.0f'%04.1f\"", - $Neg - ? "-" - : "", - $Hour, $Min, $Sec); - return $Retval; - # }}} -} - -1; diff --git a/branches/gpst.postgis/GPSTxml.pm b/branches/gpst.postgis/GPSTxml.pm deleted file mode 100644 index 1b789b4..0000000 --- a/branches/gpst.postgis/GPSTxml.pm +++ /dev/null @@ -1,50 +0,0 @@ -package GPSTxml; - -#======================================================================= -# $Id$ -# -# Character set: UTF-8 -# ©opyleft 2002– Øyvind A. Holm -# License: GNU General Public License, see end of file for legal stuff. -#======================================================================= - -use strict; -use warnings; - -BEGIN { - use Exporter (); - our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); - - my $rcs_id = '$Id$'; - push(@main::version_array, $rcs_id); - $VERSION = ($rcs_id =~ / (\d+) /, $1); - - @ISA = qw(Exporter); - @EXPORT = qw(&txt_to_xml &xml_to_txt); - %EXPORT_TAGS = (); -} -our @EXPORT_OK; - -sub txt_to_xml { - # Convert plain text to XML {{{ - my $Txt = shift; - $Txt =~ s/&/&/gs; - $Txt =~ s//>/gs; - return($Txt); - # }}} -} - -sub xml_to_txt { - # Convert XML data to plain text {{{ - my $Txt = shift; - $Txt =~ s/<//gs; - $Txt =~ s/&/&/gs; - $Txt =~ s/"/"/gs; - $Txt =~ s/'/'/gs; - return($Txt); - # }}} -} - -1; diff --git a/branches/gpst.postgis/Patch/events+func.patch b/branches/gpst.postgis/Patch/events+func.patch deleted file mode 100644 index e8718f8..0000000 --- a/branches/gpst.postgis/Patch/events+func.patch +++ /dev/null @@ -1,39 +0,0 @@ -Index: postgres/create_funcs.sql -=================================================================== ---- postgres/create_funcs.sql (revisjon 2218) -+++ postgres/create_funcs.sql (arbeidskopi) -@@ -124,7 +124,8 @@ - currlon = currpos[1]; - currsted = clname(currpos); - currdist = cldist(currpos); -- RETURN(currtime || ' - ' || currlat::text || ' ' || currlon::text || ' - ' || currsted || ' - ' || currdist); -+ RAISE NOTICE 'time = %, lat = %, lon = %, sted = %, dist = %', currtime::text, currlat::text, currlon::text, currsted::text, currdist::text; -+ RETURN(currtime::text || ' - ' || currlat::text || ' ' || currlon::text || ' - ' || currsted::text || ' - ' || currdist::text); - END; - $$ LANGUAGE plpgsql; - -Index: postgres/update_things.sql -=================================================================== ---- postgres/update_things.sql (revisjon 2218) -+++ postgres/update_things.sql (arbeidskopi) -@@ -71,6 +71,20 @@ - FROM wayp; - - \echo -+\echo ================ Oppdater koordinater for events ================ -+ -+UPDATE events SET coor = findpos(date) -+ WHERE coor IS NULL; -+ -+\echo -+\echo ================ Rund av events til fem desimaler ================ -+ -+UPDATE events SET coor = point( -+ round(coor[0]::numeric, 5), -+ round(coor[1]::numeric, 5) -+); -+ -+\echo - \echo ================ Fjern duplikater i events ================ - - SELECT count(*) diff --git a/branches/gpst.postgis/Patch/files.patch b/branches/gpst.postgis/Patch/files.patch deleted file mode 100644 index a2dcbf1..0000000 --- a/branches/gpst.postgis/Patch/files.patch +++ /dev/null @@ -1,60 +0,0 @@ -Index: postgres/create_table.sql -=================================================================== ---- postgres/create_table.sql (revisjon 2455) -+++ postgres/create_table.sql (arbeidskopi) -@@ -46,6 +46,17 @@ - author text - ); - -+CREATE TABLE files ( -+ mtime timestamptz, -+ coor point, -+ filename text, -+ descr text, -+ size bigint, -+ sha1 varchar(40), -+ md5 varchar(40), -+ path text -+); -+ - CREATE TABLE stat ( - lastupdate timestamptz, - laststed timestamptz -Index: postgres/create_views.sql -=================================================================== ---- postgres/create_views.sql (revisjon 2455) -+++ postgres/create_views.sql (arbeidskopi) -@@ -133,6 +133,22 @@ - ) AS u - ORDER BY date; - -+CREATE OR REPLACE VIEW evfiles AS -+ SELECT * FROM ( -+ SELECT 'gps' AS flag, date, coor, sted || ' (' || dist || ')' AS sted, ele::numeric(8,1), NULL AS descr, avst -+ FROM logg -+ UNION ALL -+ SELECT 'event' AS flag, date, coor, NULL, NULL, descr AS descr, NULL -+ FROM events -+ UNION ALL -+ SELECT 'pic' AS flag, date, coor, filename, NULL, NULL, NULL -+ FROM pictures -+ UNION ALL -+ SELECT 'file' AS flag, mtime, coor, filename, NULL, path, NULL -+ FROM files -+ ) AS u -+ ORDER BY date; -+ - CREATE OR REPLACE VIEW wp AS - SELECT - coor AS coor, -Index: BRANCHINFO -=================================================================== ---- BRANCHINFO (revisjon 0) -+++ BRANCHINFO (revisjon 0) -@@ -0,0 +1,6 @@ -+$Id$ -+ -+Legger inn informasjon om filer i Postgres. Fildato, navn, plassering og -+så videre skal kunne mikses inn med alt det andre. -+ -+vim: set tw=72 et fo=tcqw : diff --git a/branches/gpst.postgis/Patch/gpst-xmlsimple b/branches/gpst.postgis/Patch/gpst-xmlsimple deleted file mode 100755 index 1014755..0000000 --- a/branches/gpst.postgis/Patch/gpst-xmlsimple +++ /dev/null @@ -1,1432 +0,0 @@ -#!/usr/bin/perl -w - -#======================================================================= -# $Id$ -# Converts between various GPS formats -# -# Character set: UTF-8 -# ©opyleft 2002– Øyvind A. Holm -# License: GNU General Public License, see end of file for legal stuff. -#======================================================================= - -use strict; -use Getopt::Long; -use Time::Local qw { timegm_nocheck }; -use XML::Simple; -use Data::Dumper; - -$| = 1; - -our $Debug = 0; - -our %Opt = ( - # Initial values for command line arguments {{{ - 'chronology' => 0, - 'comment-out-dups' => 0, - 'create-breaks' => 0, - 'debug' => 0, - 'double-y-scale' => 0, - 'epoch' => 0, - 'fix' => 0, - 'help' => 0, - 'inside' => 0, - 'near' => "", - 'output-format' => "gpsml", - 'outside' => 0, - 'pos1' => "", - 'pos2' => "", - 'print-comments' => 0, - 'require' => "", - 'save-to-file' => "\n", # \n = undefined, it’s banned in filenames anyway. - 'short-date' => 0, - 'skip-dups' => 0, - 'strip-whitespace' => 0, - 'undefined' => "", - 'use-comma' => 0, - 'version' => 0, - # }}} -); - -our $progname = $0; -$progname =~ s#^.*/(.*?)$#$1#; - -my $rcs_id = '$Id$'; -my $id_date = $rcs_id; -$id_date =~ s/^.*?\d+ (\d\d\d\d-.*?\d\d:\d\d:\d\d\S+).*/$1/; - -Getopt::Long::Configure("bundling"); -GetOptions( - # Command line options {{{ - "chronology" => \$Opt{'chronology'}, - "comment-out-dups|u" => \$Opt{'comment-out-dups'}, - "create-breaks|t" => \$Opt{'create-breaks'}, - "debug" => \$Opt{'debug'}, - "double-y-scale|y" => \$Opt{'double-y-scale'}, - "epoch|e" => \$Opt{'epoch'}, - "fix" => \$Opt{'fix'}, - "help|h" => \$Opt{'help'}, - "inside" => \$Opt{'inside'}, - "near" => \$Opt{'near'}, - "output-format|o=s" => \$Opt{'output-format'}, - "outside" => \$Opt{'outside'}, - "pos1=s" => \$Opt{'pos1'}, - "pos2=s" => \$Opt{'pos2'}, - "print-comments|C" => \$Opt{'print-comments'}, - "require|r=s" => \$Opt{'require'}, - "save-to-file|S=s" => \$Opt{'save-to-file'}, - "short-date|s" => \$Opt{'short-date'}, - "skip-dups|d" => \$Opt{'skip-dups'}, - "strip-whitespace|w" => \$Opt{'strip-whitespace'}, - "undefined|n=s" => \$Opt{'undefined'}, - "use-comma|c" => \$Opt{'use-comma'}, - "verbose|v" => \$Opt{'verbose'}, - "version" => \$Opt{'version'}, - # }}} -) || die("$progname: Option error. Use -h for help.\n"); - -my %Dat; - -my $PAUSE_LIMIT = 2 * 60; # Antall sekunder mellom to punkter det må til før en move legges inn. -my $Des = $Opt{'use-comma'} ? "," : "."; -my $Udef = "?"; -my $DIGIT = '[0-9\.\-\+]'; # Used in regexps -my $Spc = $Opt{'strip-whitespace'} ? "" : " "; -my $in_dupskip = 0; # Er 1 hvis vi holder på med ignorering av duplikater -my $found_move = 0; # Settes til 1 hvis en /^# move$/ blir funnet. -my $first_time = 0; -my $last_time = 0; -my ($last_lon, $last_lat, $last_ele, $last_line) = - ( 1000, 1000, 100000, ""); # Vi kan jo teoretisk sett være i Greenwich eller på ekvator -my ($lat1, $lon1, $lat2, $lon2) = - (-1000, -1000, 1000, 1000); - -my %Poscount = (); - -my %Req = ( - 'altitude' => ($Opt{'require'} =~ /a/) ? 1 : 0, - 'time' => ($Opt{'require'} =~ /t/) ? 1 : 0 -); -$Opt{'require'} =~ /[^at]/ && die("$0: Unknown flag in --require (-r) value\n"); - -$Opt{'debug'} && ($Debug = 1); -$Opt{'help'} && usage(0); -$Opt{'version'} && print_version(); - -if ($Opt{'pos1'} =~ /^($DIGIT+),($DIGIT+)$/) { - $lat1 = $1; - $lon1 = $2; -} -if ($Opt{'pos2'} =~ /^($DIGIT+),($DIGIT+)$/) { - $lat2 = $1; - $lon2 = $2; -} -if ($lat1 > $lat2) { - my $Tmp = $lat1; - $lat1 = $lat2; - $lat2 = $Tmp; -} -if ($lon1 > $lon2) { - my $Tmp = $lon1; - $lon1 = $lon2; - $lon2 = $Tmp; -} - -if ($Opt{'inside'} && $Opt{'outside'}) { - die("$progname: Cannot mix the --inside and --outside options\n"); -} - -my $waypoint_file = "/home/sunny/gps/waypoints.gpx"; - -# To avoid printing out extra "/> at the start of svg output: -my $svg_start_thing = ""; - -length($Opt{'undefined'}) && ($Udef = $Opt{'undefined'}); -# Kunne vært et eget script på grunn av at det gjør sine helt egne -# greier, men like greit å samle det på en plass. -# FIXME: Fjerner ikke første duplikatentryen. -# FIXME: Se om det går å få flytta den inn i print_entry() så man -# slipper å ha to gptrans_conv’er i pipen. -# FIXME: Legg inn alle formatene. -if ($Opt{'comment-out-dups'}) { - # Comment out areas without reception {{{ - my ($start_date, $end_date, $found_dup) = ("", "", 0); - my @Dup = (); - while (<>) { - if (m#^1 (\S+) (\S+) (\S+) (\S+) (\d\d)/(\d\d)/(\d\d\d\d) (\d\d):(\d\d):(\d\d)#) { - # {{{ - my ($lat_val, $lon_val, $Speed, $Unkn, $Month, $Day, $Year, $Hour, $Min, $Sec) = - ( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10); - if (($lat_val eq $last_lat) && ($lon_val eq $last_lon)) { - unless ($found_dup) { - $start_date = "$Year$Month${Day}T$Hour$Min$Sec"; - @Dup = (); - $found_dup = 1; - } - push(@Dup, "# $_"); - $end_date = "$Year$Month${Day}T$Hour$Min$Sec"; - } else { - if ($found_dup) { - print("# $start_date-$end_date: CO: No signal \x7B\x7B\x7B\n"); - for (@Dup) { - print($_); - } - print("# $start_date-$end_date: CO: No signal \x7D\x7D\x7D\n# move\n$_"); - $found_dup = 0; - } else { - print($_); - } - } - $last_lat = $lat_val; - $last_lon = $lon_val; - # }}} - } else { - if ($found_dup) { - push(@Dup, $_); - } else { - print($_); - } - } - } - if ($found_dup) { - print("# $start_date-$end_date: CO: No signal \x7B\x7B\x7B\n"); - for (@Dup) { - print($_); - } - print("# $start_date-$end_date: CO: No signal \x7D\x7D\x7D\n# move\n"); - $found_dup = 0; - } - exit(0); - # }}} -} - -$Opt{'save-to-file'} eq "\n" && print_header(*STDOUT); - -my @first_lines; -my $xml_data; -my $data_line = ""; -my $curr_file = ""; - -my $from_stdin = scalar(@ARGV) ? 0 : 1; - -$from_stdin && push(@ARGV, "-"); - -for $curr_file (@ARGV) { - # Scan through stdin or specified files and send every GPS entry to - # print_entry() - # {{{ - D("Opening \"$curr_file\" for read"); - if (open(CurrFP, "<$curr_file")) { - # {{{ - while () { - $data_line = $_; - %Dat = ( - 'year' => '', 'month' => '', 'day' => '', - 'hour' => '', 'min' => '', 'sec' => '', - 'lat' => '', 'lon' => '', - 'ele' => '', - 'desc' => '', - 'error' => 0, - 'type' => 'tp', - ); - - if ($Opt{'save-to-file'} ne "\n") { - push(@first_lines, $_); - $_ =~ s/^# ?//; # Also read commented-out lines. - } - $xml_data = ""; - if (m#^<(e?tp)\b.*?>(.*?)$#) { - # gpsml — The main storage format {{{ - my ($Elem, $Data) = - ( $1, $2); - $Elem eq "etp" && ($Dat{'error'} = 1); - my $Time = ""; - $Data =~ m## && ($Time = $1); - $Time =~ s{ - (\d\d\d\d)-?(\d\d)-?(\d\d)T(\d\d):?(\d\d):?([\d\.]+?)Z - } { - ($Dat{'year'}, $Dat{'month'}, $Dat{'day'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}) = - ( $1, $2, $3, - $4, $5, $6); - ""; - }ex; - $Data =~ m#($DIGIT*?)# && ($Dat{'lat'} = $1); - $Data =~ m#($DIGIT*?)# && ($Dat{'lon'} = $1); - $Data =~ m#($DIGIT*?)# && ($Dat{'ele'} = $1); - $Data =~ m#(.*?)# && ($Dat{'desc'} = xml_to_txt($1)); - print_entry(%Dat); - # }}} - } elsif (m#^#) { - $found_move = 1; - } elsif (m#^<(desc|title|pause)\b.*?>(.*?)#) { - $Dat{'type'} = $1; - $Dat{$1} = xml_to_txt($2); - print_entry(%Dat); - } elsif (/^); - if (!length($Opt{'output-format'})) { - $Opt{'output-format'} = "gpx"; - print_header(*STDOUT); - } - read_xmlfile($xml_data); - last; - } elsif (/^# Pause: /) { - $Opt{'print-comments'} && print; - } elsif (/^# move$/) { - $found_move = 1; - } elsif (/^#/) { - $Opt{'print-comments'} && print; - } elsif (m#^(\d+)\t($DIGIT+)\t($DIGIT+)\t($DIGIT)#) { - # CSV format, epoch style {{{ - my ($ep_time, $lon_val, $lat_val, $Alt) = - ( $1, $2, $3, $4); - ($Dat{'sec'}, $Dat{'min'}, $Dat{'hour'}, - $Dat{'day'}, $Dat{'month'}, $Dat{'year'}, - $Dat{'wday'}, $Dat{'yday'}) = gmtime($ep_time); - $Dat{'month'}++; # Urgh Ⅰ - $Dat{'year'} += 1900; # Urgh Ⅱ - print_entry(%Dat); - # }}} - } elsif (m#^(\d\d\d\d)-?(\d\d)-?(\d\d)[T ](\d\d):?(\d\d):?(\d\d)Z?\t($DIGIT+)\t($DIGIT+)\t($DIGIT)#) { - # CSV format, human-readable date format {{{ - ($Dat{'year'}, $Dat{'month'}, $Dat{'day'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}, - $Dat{'lon'}, $Dat{'lat'}, $Dat{'ele'}) = - ($1, $2, $3, - $4, $5, $6, - $7, $8, $9); - print_entry(%Dat); - # }}} - } elsif (/^Trackpoint\t/) { - # Trackpoint\tN60.41630 E5.31675\t09.02.2006 20:24:37 (UTC)\t13.6 m\t\t93.9 m\t00:00:06\t56 kph\t123° true {{{ - # - # Trackpoint\t - # N60.41630 E5.31675\t - # 09.02.2006 20:24:37 (UTC)\t - # 13.6 m\t - # \t - # 93.9 m\t - # 00:00:06\t - # 56 kph\t - # 123° true - my $Orig = $_; - $Orig =~ s/[\r\n]+$//; - my ($Marker_f, $Position_f, $Time_f, $Alt_f, $Depth_f, - $Leglength_f, $Legtime_f, $Legspeed_f, $Legcourse_f) = - split(/\t/, $Orig . - # Nødløsning for å unngå at variabler blir - # udefinert. - "\t\t\t\t\t\t\t\t\t\t" - ); - D(join("", - "Position_f=\"$Position_f\" \x7B\x7B\x7B\n", - "Time_f=\"$Time_f\"\n", - "Alt_f=\"$Alt_f\"\n", - "Depth_f=\"$Depth_f\"\n", - "Leglength_f=\"$Leglength_f\"\n", - "Legtime_f=\"$Legtime_f\"\n", - "Legspeed_f=\"$Legspeed_f\"\n", - "Legcourse_f=\"$Legcourse_f\" \x7D\x7D\x7D\n", - )); - my ($NS, $WE, - $Alt_unit, - $Leglength, - $Legtime_hour, $Legtime_min, $Legtime_sec, - $Legspeed, $Legspeed_unit, - $Legcourse - ) = ("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", ""); - ($Position_f =~ /^(N|S)([\d\.]+) (W|E)([\d\.]+)/) && - ($NS = $1, $Dat{'lat'} = $2, $WE = $3, $Dat{'lon'} = $4); - ($Time_f =~ /^(\d+)\.(\d+)\.(\d+) (\d+):(\d+):(\d+) \((.+?)\)/) && - ($Dat{'day'} = $1, $Dat{'month'} = $2, $Dat{'year'} = $3, - $Dat{'hour'} = $4, $Dat{'min'} = $5, $Dat{'sec'} = $6); - ($Alt_f =~ /^([\d+\.]+) (.*?)/) && - ($Dat{'ele'} = $1, $Alt_unit = $2); - D("ele = \"$Dat{'ele'}\""); - ($NS eq "S") && ($Dat{'lat'} = 0-$Dat{'lat'}); - ($WE eq "W") && ($Dat{'lon'} = 0-$Dat{'lon'}); - # MapSource in win xp writes YYYY, but YY in win98se. - (defined($Dat{'year'}) && $Dat{'year'} =~ /\d/ && $Dat{'year'} < 1900) && ($Dat{'year'} += 2000); - print_entry(%Dat); - # }}} - } elsif (m#^T\t(\d\d)/(\d\d)/(\d\d\d\d) (\d\d):(\d\d):(\d\d)\t(.+)\xB0(.+)'(.+)"\t(.+)\xB0(.+)'(.+)"#) { - # T 09/01/2002 11:51:26 60°23'36.3" 5°19'35.9" {{{ - my ($lat_d, $lat_m, $lat_s, $lon_d, $lon_m, $lon_s); - ($Dat{'month'}, $Dat{'day'}, $Dat{'year'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}, $lat_d, - $lat_m, $lat_s, $lon_d, - $lon_m, $lon_s) = - ( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12); - $Dat{'lat'} = sprintf("%.5f", 1*($lat_d+($lat_m/60)+($lat_s/3600))); - $Dat{'lon'} = sprintf("%.5f", $lon_d+($lon_m/60)+($lon_s/3600)); - print_entry(%Dat); - # }}} - } elsif (m#^1 (\S+) (\S+) (\S+) (\S+) (\d\d)/(\d\d)/(\d\d\d\d) (\d\d):(\d\d):(\d\d)#) { - # 1 60.3938222 5.3238754 17.3 0 09/01/2002 14:18:23 {{{ - ($Dat{'lat'}, $Dat{'lon'}, $Dat{'speed'}, - $Dat{'unkn'}, - $Dat{'month'}, $Dat{'day'}, $Dat{'year'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}) = - ( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10); - print_entry(%Dat); - # }}} - } elsif (/^ - # @020721221336N6048353E00701826S015-00001E4859N1673U0000 {{{ - # Regexp {{{ - (@) # @ - (\d\d) # Year - (\d\d) # Month - (\d\d) # Day - (\d\d) # Hours - (\d\d) # Minutes - (\d\d) # Seconds - ([NS]) # N|S - (\d\d) # Latitude degree - (\d\d) # Latitude minute - (\d\d\d) # Latitude minute decimals - ([EW]) # E|W - (\d\d\d) # Longitude degree - (\d\d) # Longitude minute - (\d\d\d) # Longitude minute degree - (....) # Accurancy - (......) # Altitude - (...............) - $ - # }}} - /x) { - my ($NS, $EW, $lat_deg, $lat_degmin, $lat_mindec, $lon_deg, - $lon_degmin, $lon_mindec); - ($Dat{'year'}, $Dat{'month'}, $Dat{'day'}, $Dat{'hour'}, - $Dat{'min'}, $Dat{'sec'}, $NS, $lat_deg, - $lat_degmin, $lat_mindec, $EW, - $lon_deg, $lon_degmin, $lon_mindec, - $Dat{'accur'}, $Dat{'ele'}, $Dat{'unknown'}) = - ($2+2000, $3, $4, $5, $6, $7, $8, $9, $10, $11, - $12, $13, $14, $15, $16, $17, $18); - my $ep_time = timegm_nocheck($Dat{'sec'}, $Dat{'min'}, $Dat{'hour'}, $Dat{'day'}, $Dat{'month'}-1, $Dat{'year'}); - $last_time = $ep_time; - my $tmp_lon = sprintf("%.5f", $lon_deg + $lon_degmin/60 + $lon_mindec/60000); - my $tmp_lat = sprintf("%.5f", $lat_deg + $lat_degmin/60 + $lat_mindec/60000); - $tmp_lon =~ s/\./$Des/; - $tmp_lat =~ s/\./$Des/; - ($NS eq "S") && ($tmp_lat = 0-$tmp_lat); - ($EW eq "W") && ($tmp_lon = 0-$tmp_lon); - $Dat{'lat'} = $tmp_lat; - $Dat{'lon'} = $tmp_lon; - print_entry(%Dat); - # }}} - } elsif (/^(@)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(__________________________________________)/) { - # @020721221336__________________________________________ {{{ - my ($Alfa, $Year, $Month, $Day, $Hour, $Min, $Sec, $Rest) = - ( $1, $2+2000, $3, $4, $5, $6, $7, $8); - $Opt{'output-format'} eq "csv" && print("\n"); - $found_move = 1; - # }}} - } elsif (/^xmaplog /) { - ($Opt{'output-format'} eq "csv") && ($Opt{'save-to-file'} eq "\n") && print("\n"); - } elsif (/^$/) { - ($Opt{'output-format'} eq "csv") && ($Opt{'save-to-file'} eq "\n") && print("\n"); - } else { - if ($Opt{'print-comments'}) { - print("# $_"); - chomp; - } - $Opt{'verbose'} && warn("Line $.: Unknown: \"$_\"\n"); - } - } - # }}} - } else { - warn("$progname: $curr_file: Cannot open file for read: $!\n"); - } - # }}} -} - -print_footer(*STDOUT); - -exit(0); - -sub read_xmlfile { - # {{{ - D("Inn i read_xmlfile()"); - my $Txt = XMLin(@_); - D("Etter XMLin()"); - # print(Dumper($Txt->{trk}->{trkseg}->{trkpt}->[0]->{time})); - D(Dumper($Txt)); - D("Etter Dumper"); - my $Loop = 1; - for (my $a = 0; $Loop; $a++) { - D("a = $a"); - my $Date = $Txt->{trk}->{trkseg}->{trkpt}->[$a]->{time}; - $Dat{'lat'} = $Txt->{trk}->{trkseg}->{trkpt}->[$a]->{lat}; - $Dat{'lon'} = $Txt->{trk}->{trkseg}->{trkpt}->[$a]->{lon}; - $Dat{'ele'} = $Txt->{trk}->{trkseg}->{trkpt}->[$a]->{ele}; - if ($Date =~ m#(\d\d\d\d)-?(\d\d)-?(\d\d)T(\d\d):?(\d\d):?(\d\d)\.?(\d*?)Z#) { - ($Dat{'year'}, $Dat{'mon'}, $Dat{'day'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}, $Dat{'secfrac'}) = - ( $1, $2, $3, - $4, $5, $6, $7); - } - print_entry(%Dat); - # print($Txt->{trk}->{trkseg}->{trkpt}->{time}->[$a]); - } - # FIXME: The sequential stuff here is probably bad, but easy. - # $Txt =~ s#(.*?)#print_gpx($1)#gse; - # $Txt =~ s#(.*?)#print_xml_gps($1)#gse; - # }}} -} - -sub print_gpx { - # {{{ - my $Orig = shift; - my $Str = $Orig; - D("print_xml_gps(\"$Orig\")\n"); - $Str =~ - s{ - (.*?) - } - { - my $el_trk = $2; - $el_trk =~ - s{ - (.*?) - } - { - my $el_trkseg = $2; - $el_trkseg =~ - s{ - (.*?) - } - { - my ($attr_trkpt, $el_trkpt) = - ( $1, $2); - ($attr_trkpt =~ /\blon="(.*?)"/) && ($Dat{'lon'} = $1); - ($attr_trkpt =~ /\blat="(.*?)"/) && ($Dat{'lat'} = $1); - ($el_trkpt =~ m#(.*?)#) && ($Dat{'ele'} = $1); - if ($el_trkpt =~ m##) { - ($Dat{'year'}, $Dat{'month'}, $Dat{'day'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}, $Dat{'secfrac'}) = - ($1, $2, $3, $4, $5, $6, $7); - } - print_entry(%Dat); - ""; - }gsex; - $found_move = 1; - }gsex; - $found_move = 1; - }gsex; - # }}} -} - -sub print_xml_gps { - # {{{ - my $Orig = shift; - my $Str = $Orig; - D("print_xml_gps(\"$Orig\")\n"); - if ($Str =~ m#(\d\d\d\d)-?(\d\d)-?(\d\d)T(\d\d):?(\d\d):?(\d\d)\.?(\d*?)Z#) { - ($Dat{'year'}, $Dat{'mon'}, $Dat{'day'}, $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}, $Dat{'secfrac'}) = - ( $1, $2, $3, $4, $5, $6, $7); - } - if ($Str =~ m#(.*?)#s) { - my $Txt = $1; - ($Txt =~ m#(.*?)#) && ($Dat{'lon'} = $1); - ($Txt =~ m#(.*?)#) && ($Dat{'lat'} = $1); - ($Txt =~ m#(.*?)#) && ($Dat{'ele'} = $1); - } - defined($Dat{'lon'}) || ($Dat{'lon'} = ""); - defined($Dat{'lat'}) || ($Dat{'lat'} = ""); - defined($Dat{'ele'}) || ($Dat{'ele'} = ""); - print_entry(%Dat); - # }}} -} - -sub print_header { - # {{{ - local *OutFP = shift; - if ($Opt{'output-format'} eq "gpsml") { - print(OutFP join("", - "\n", - "\n", - "\n", - )); - } elsif ($Opt{'output-format'} eq "gpstrans") { - print(OutFP "Format: DMS UTC Offset: 0.00 hrs Datum[100]: WGS 84\n"); - } elsif ($Opt{'output-format'} eq "gpx") { - print(OutFP join("", - "\n", - "\n", - "$Spc$Spc\n", - "$Spc$Spc$Spc$Spc\n", - )); - } elsif ($Opt{'output-format'} eq "ps") { - print(OutFP ps_header(532, 6034, 533, 6040)); - print(OutFP "*u\n"); - } elsif ($Opt{'output-format'} eq "xml") { - print(OutFP join("", - "\n", - "\n", - )); - } elsif ($Opt{'output-format'} eq "svg") { - print(OutFP join("", - "\n", - "\n", - "\n", - "$Spc$Spc\n", - "$Spc$Spc\n", - )); - } - # }}} -} - -sub print_footer { - # Print footer {{{ - local *OutFP = shift; - if ($Opt{'output-format'} eq "gpsml") { - print(OutFP join("", - "\n", - "\n", - )); - } elsif ($Opt{'output-format'} eq "gpx") { - print(OutFP join("", - "$Spc$Spc$Spc$Spc\n", - "$Spc$Spc\n", - "\n", - )); - } elsif ($Opt{'output-format'} eq "poscount") { - while (my ($l_name, $l_val) = each %Poscount) { - $l_name =~ /^(.+?),(.+?)$/ && print(OutFP "$1\t$2\t$l_val\n"); - } - } elsif ($Opt{'output-format'} eq "ps") { - print(OutFP join("", - "*U\n", - "%%Trailer\n", - "%%EOF\n", - )); - } elsif ($Opt{'output-format'} eq "svg") { - print(OutFP "\"/>\n\n"); - } elsif ($Opt{'output-format'} eq "xml") { - print(OutFP "\n"); - } - # }}} -} - -sub print_entry { - # Print a GPS entry with time, latitude, longitude and altitude in - # various formats - # {{{ - my %Dat = @_; - my $print_time = length($Dat{'year'}) ? 1 : 0; - my $print_ele = length($Dat{'ele'}) ? 1 : 0; - my $print_desc = length($Dat{'desc'}) ? 1 : 0; - my $Line = ""; - D("print_entry(\"" . join("\", \"", @_) . "\");"); - my $ep_time; - - if ($Opt{'near'}) { - $Line .= sprintf("%s ", list_nearest_waypoints($Dat{'lat'}, $Dat{'lon'})); - } - - if ($Opt{'output-format'} eq "poscount") { - my ($Lat_str, $Lon_str) = - ( "", ""); - $Dat{'lon'} =~ /^(\d+\.\d\d)/ && ($Lon_str = $1); - $Dat{'lat'} =~ /^(\d+\.\d\d)/ && ($Lat_str = $1); - my $Name = "${Lon_str},${Lat_str}"; - defined($Poscount{$Name}) || ($Poscount{$Name} = 0); - $Poscount{$Name}++; - return; - } - - if ($print_time) { - $ep_time = timegm_nocheck($Dat{'sec'}, $Dat{'min'}, $Dat{'hour'}, $Dat{'day'}, $Dat{'month'} - 1, $Dat{'year'}); - $Dat{'year'} = sprintf("%04u", $Dat{'year'}); - $Dat{'month'} = sprintf("%02u", $Dat{'month'}); - $Dat{'day'} = sprintf("%02u", $Dat{'day'}); - $Dat{'hour'} = sprintf("%02u", $Dat{'hour'}); - $Dat{'min'} = sprintf("%02u", $Dat{'min'}); - $Dat{'sec'} = sprintf("%02u", $Dat{'sec'}); - if ($Opt{'chronology'}) { - if ($last_time > $ep_time) { - warn(sprintf( - "%s: \"%sZ\": Next date is %s in the past (%sZ)\n", - $progname, sec_to_string($last_time, "T"), - sec_to_readable($last_time-$ep_time), - sec_to_string($ep_time, "T") - )); - # FIXME: Make --fix work with gpx and xml. - if ($Opt{'fix'} && ($Opt{'output-format'} !~ /^(gpx|xml)$/)) { - ($Line .= "# error "); - } - } - } - } else { - $Req{'time'} && return; - $ep_time = 0; - $Dat{'year'} = 0; - $Dat{'month'} = 0; - $Dat{'day'} = 0; - $Dat{'hour'} = 0; - $Dat{'min'} = 0; - $Dat{'sec'} = 0; - } - - if ($Opt{'save-to-file'} ne "\n") { - # {{{ - my $base_name = "$Dat{'year'}$Dat{'month'}$Dat{'day'}T$Dat{'hour'}$Dat{'min'}$Dat{'sec'}Z$Opt{'save-to-file'}"; - my $file_name = $base_name; - if (-e $file_name) { - for (my $a = 1; (-e $file_name) && ($a < 1000); $a++) { - $file_name = "$base_name.dup_$a"; - } - if (-e $file_name) { - die("$progname: $base_name: File already exists, and ran " . - "out of attempts to create unique file name\n"); - } - if ($Opt{'verbose'}) { - warn("$progname: $base_name: File already exists, using " . - "unique name \"$file_name\" instead\n"); - } - } - if (open(ToFP, ">", $file_name)) { - print_header(*ToFP); - print(ToFP ($from_stdin ? @first_lines : ()), (length($xml_data) ? $xml_data : <>)) || - die("$progname: $file_name: Cannot write to file: $!\n"); - print_footer(*ToFP); - close(ToFP); - if ($Opt{'output-format'} eq "gpsml") { - printf("%s\n", - txt_to_xml($file_name)); - } elsif ($Opt{'output-format'} eq "gpx") { - printf("\n", - txt_to_xml($file_name)); - } else { - print("$progname: Saved unconverted data to \"$file_name\"\n"); - } - exit 0; - } else { - die("$progname: $file_name: Cannot create file: $!\n"); - } - # }}} - } - - my $pause_len = 0; - my $do_print = 1; - ($Req{'altitude'} && !$print_ele) && return; - - if ($Opt{'inside'} || $Opt{'outside'}) { - if ( - ($Dat{'lat'} < $lat1) || - ($Dat{'lat'} > $lat2) || - ($Dat{'lon'} < $lon1) || - ($Dat{'lon'} > $lon2) - ) { - $Opt{'inside'} && return; - } else { - $Opt{'outside'} && return; - } - } - - if ($Opt{'output-format'} eq "ps") { - $Dat{'lon'} *= 100; - $Dat{'lat'} *= 100; - } - if ($Opt{'skip-dups'} && ($Dat{'lon'} eq $last_lon) && ($Dat{'lat'} eq $last_lat) && ($Dat{'ele'} eq $last_ele)) { - if ($in_dupskip) { - $do_print = 0; - } else { - $do_print = 1; - } - $in_dupskip = 1; - } else { - $do_print = 1; - $in_dupskip && ($Line .= $last_line); - $in_dupskip = 0; - } - - if ($Opt{'create-breaks'} && $ep_time-$last_time > $PAUSE_LIMIT && $last_time) { - $pause_len = $ep_time-$last_time; - D("pause_len set to '$pause_len'"); - } - - if ($pause_len) { - if ($Opt{'output-format'} eq "gpsml") { - $Line .= sprintf("%s\n", - sec_to_readable($ep_time-$last_time)); - } elsif ($Opt{'output-format'} eq "csv") { - $Line .= sprintf("# Pause: %s\n# move\n", - sec_to_readable($ep_time-$last_time)); - } - } - - if ($do_print) { - # Valid data was found, send to stdout {{{ - unless ($first_time) { - $first_time = $ep_time; - } - if ($Opt{'double-y-scale'}) { - $Dat{'lat'} *= 2; - } - if ($Opt{'output-format'} eq "gpsml") { - if ($Dat{'type'} eq "tp") { - my $Elem = $Dat{'error'} ? "etp" : "tp"; - $Line .= join("", - "<$Elem> ", - $print_time - ? " " - : "", - (length($Dat{'lat'})) - ? "" . $Dat{'lat'}*1.0 . " " - : "", - (length($Dat{'lon'})) - ? "" . $Dat{'lon'}*1.0 . " " - : "", - ($print_ele) - ? "" . $Dat{'ele'}*1.0 . " " - : "", - ($print_desc) - ? sprintf("%s ", - txt_to_xml($Dat{'desc'})) - : "", - "\n" - ); - } elsif ($Dat{'type'} =~ /^(pause|desc|title)$/) { - $Line .= sprintf("<%s>%s\n", - $1, - txt_to_xml($Dat{$1}), - $1); - } - } elsif ($Opt{'output-format'} eq "xgraph") { - $pause_len && ($Line .= "move "); - ($Line .= "$Dat{'lon'} $Dat{'lat'}\n"); - } elsif($Opt{'output-format'} eq "gpstrans") { - my ($gpt_lat, $gpt_lon) = (ddd_to_dms($Dat{'lat'}), ddd_to_dms($Dat{'lon'})); - if ($print_time) { - $Line .= "T\t$Dat{'month'}/$Dat{'day'}/$Dat{'year'} $Dat{'hour'}:$Dat{'min'}:$Dat{'sec'}\t$gpt_lat\t$gpt_lon\n"; - } else { - $Line .= "T\t00/00/00 00:00:00\t$gpt_lat\t$gpt_lon\n"; - } - } elsif($Opt{'output-format'} eq "gpx") { - $Line .= join("", - "$Spc$Spc$Spc$Spc$Spc$Spc$Spc", - $print_time - ? "$Spc" - : "", - $print_ele - ? "$Dat{'ele'}$Spc" - : "", - "\n" - ); - } elsif ($Opt{'output-format'} eq "clean") { - $pause_len && ($Line .= "\n"); - ($Line .= "$Dat{'lon'}\t$Dat{'lat'}" . ($print_ele ? "\t$Dat{'ele'}" : "") . "\n"); - } elsif ($Opt{'output-format'} eq "ps") { - $Line .= ($pause_len ? "f\n$Dat{'lon'} $Dat{'lat'} m\n" : "$Dat{'lon'} $Dat{'lat'} l\n"); - } elsif ($Opt{'output-format'} eq "svg") { - $Line .= ( - ($last_lon == 1000) || $pause_len - ? join("", - "$svg_start_thing$Spc", - $print_time - ? "$Dat{'year'}-$Dat{'month'}-$Dat{'day'}T$Dat{'hour'}:$Dat{'min'}:$Dat{'sec'}Z$Spc" - : "", - "$Spc", - (length($Dat{'lon'})) ? "$Dat{'lon'}$Spc" : "", - (length($Dat{'lat'})) ? "$Dat{'lat'}$Spc" : "", - ($print_ele) ? "$Dat{'ele'}$Spc" : "", - "$Spc", - "\n" - ); - } elsif ($Opt{'output-format'} eq "ygraph") { - my $Time = $print_time ? ($ep_time - $first_time) * 1 : 0; - $Line .= "\"Time = $Time.0\n$Dat{'lon'} $Dat{'lat'}\n\n"; - } elsif ($Opt{'output-format'} eq "csv") { - # {{{ - $Dat{'lon'} =~ s/\./$Des/; - $Dat{'lat'} =~ s/\./$Des/; - # $do_print || print("skipping "); - $Line .= join("\t", - $print_time - ? $Opt{'epoch'} - ? $ep_time - : $Opt{'short-date'} - ? "$Dat{'year'}$Dat{'month'}$Dat{'day'}T$Dat{'hour'}$Dat{'min'}$Dat{'sec'}Z" - : "$Dat{'year'}-$Dat{'month'}-$Dat{'day'} $Dat{'hour'}:$Dat{'min'}:$Dat{'sec'}" - : "", - $Dat{'lon'}, - $Dat{'lat'}, - $print_ele ? $Dat{'ele'} : "", # Elevation - "\n" - ); - # }}} - } else { - die("$progname: \"$Opt{'output-format'}\": Unknown output format\n"); - } - # }}} - } - - if (!$last_time && $Opt{'output-format'} eq "ps") { - $Line .= "$Dat{'lon'} $Dat{'lat'} m\n"; - } - - if ($do_print) { - if ($found_move) { - if ($Opt{'output-format'} eq "gpsml") { - $Line = "\n$Line"; - } - (!$pause_len && ($Opt{'output-format'} eq "xgraph")) && ($Line .= "move $Line"); - ($Opt{'output-format'} eq "clean") && ($Line .= "\n"); - if ($Opt{'output-format'} eq "gpx") { - $Line .= "$Spc$Spc$Spc$Spc\n$Spc$Spc$Spc$Spc\n"; - } - $found_move = 0; - } - print($Line); - } - $last_time = $ep_time; - $last_lon = $Dat{'lon'}; - $last_lat = $Dat{'lat'}; - $last_ele = $Dat{'ele'}; - $last_line = $data_line; - $svg_start_thing = "\"/>\n"; - # }}} -} - -sub list_nearest_waypoints { - # {{{ - my ($Lat, $Lon, $Count) = @_; - # FIXME: Incredible unfinished and kludgy. - if (open(WaypFP, "gpsbabel -i gpx -f $waypoint_file -x radius,lat=$Lat,lon=$Lon,distance=1000 -o gpx -F - |")) { - my $Str = join("", ); - $Str =~ s{ - ^.*?.*?(.+?).*?.*? - .*?.*?(.+?).*?.*? - .*?.*?(.+?).*?.*$ - }{ - "($1, $2, $3)"; - }sex; - return($Str); - } else { - die("$progname: Cannot open gpsbabel pipe: $!\n"); - } - # }}} -} - -sub sec_to_string { - # Convert seconds since 1970 to "yyyy-mm-dd hh:mm:ss" with optional - # separator - # {{{ - my ($Seconds, $Sep) = @_; - defined($Sep) || ($Sep = " "); - my @TA = gmtime($Seconds); - my($DateString) = sprintf("%04u-%02u-%02u%s%02u:%02u:%02u", $TA[5]+1900, $TA[4]+1, $TA[3], $Sep, $TA[2], $TA[1], $TA[0]); - return($DateString); - # }}} -} - -sub sec_to_readable { - # Convert seconds since 1970 to human-readable format (d:hh:mm:ss) - # {{{ - my $secs = shift; - D("sec_to_readable(\"$secs\")\n"); - my ($Day, $Hour, $Min, $Sec) = - ( 0, 0, 0, 0); - - $Day = int($secs/86400); - $secs -= $Day * 86400; - - $Hour = int($secs/3600); - $secs -= $Hour * 3600; - - $Min = int($secs/60); - $secs -= $Min * 60; - - $Sec = $secs; - - return(sprintf("%u:%02u:%02u:%02u", $Day, $Hour, $Min, $Sec)); - # }}} -} - -sub ps_header { - # Send a Postscript header to stdout {{{ - my ($bl_lon, $bl_lat, $br_lon, $br_lat) = @_; - my $Date = sec_to_string(time); - return(join("", - "%!PS-Adobe-3.0 EPSF-3.0\n", - "%%Creator: $rcs_id\n", - "%%Title:\n", - "%%CreationDate: $Date\n", - "%%BoundingBox: $bl_lon $bl_lat $br_lon $br_lat\n", - "%%DocumentData: Clean7Bit\n", - "%%EndComments\n", - "%%BeginProlog\n", - "/bd { bind def } bind def\n", - "/incompound false def\n", - "/m { moveto } bd\n", - "/l { lineto } bd\n", - "/c { curveto } bd\n", - "/F { incompound not {fill} if } bd\n", - "/f { closepath F } bd\n", - "/S { stroke } bd\n", - "/*u { /incompound true def } bd\n", - "/*U { /incompound false def f} bd\n", - "/k { setcmykcolor } bd\n", - "/K { k } bd\n", - "%%EndProlog\n", - "%%BeginSetup\n", - "%%EndSetup\n", - )); - # }}} -} - -sub ddd_to_dms { - # Convert floating-point degrees into D°M'S.S" (ISO-8859-1). - # Necessary for import into GPSman. Based on toDMS() from - # gpstrans-0.39 to ensure compatibility. - # {{{ - my $ddd = shift; - my $Neg = 0; - my ($Hour, $Min, $Sec) = - ( 0, 0, 0); - my $Retval = ""; - - if ($ddd < 0.0) { - $ddd = 0 - $ddd; - $Neg = 1; - } - $Hour = int($ddd); - $ddd = ($ddd - $Hour) * 60.0; - $Min = int($ddd); - $Sec = ($ddd - $Min) * 60.0; - - if ($Sec > 59.5) { - $Sec = 0.0; - $Min += 1.0; - } - if ($Min > 59.5) { - $Min = 0.0; - $Hour += 1.0; - } - if ($Neg) { - $Hour = 0 - $Hour; - } - D("Neg = $Neg , D = $Hour , M = $Min , S = $Sec\n"); - $Retval = sprintf("%s%.0f\xB0%02.0f'%04.1f\"", $Neg ? "-" : "", $Hour, $Min, $Sec); - return $Retval; - # }}} -} - -sub txt_to_xml { - # Convert plain text to XML {{{ - my $Txt = shift; - $Txt =~ s/&/&/gs; - $Txt =~ s//>/gs; - return($Txt); - # }}} -} - -sub xml_to_txt { - # Convert XML data to plain text {{{ - my $Txt = shift; - $Txt =~ s/<//gs; - $Txt =~ s/&/&/gs; - return($Txt); - # }}} -} - -sub print_version { - # Print program version {{{ - print("$rcs_id\n"); - exit(0); - # }}} -} # print_version() - -sub usage { - # Send the help message to stdout {{{ - my $Retval = shift; - - print(< [options] [file [files [...]]] - -B -S [options] [file [files [...]]] - -B -u [options] [file [files [...]]] - -=head1 DESCRIPTION - -Converts between various GPS formats. - -=head1 OPTIONS - -=over 4 - -=item B<-c>, B<--comment-out-dups> - -Use comma instead of period as decimal point (For Gnumeric etc). - -=item B<-C>, B<--print-comments> - -Print existing comment lines (starting with "#") and prefix unknown -lines with "# ". - -=item B<--chronology> - -Check for broken chronology, warn about entries with an old timestamp. - -=item B<-d>, B<--skip-dups> - -Skip duplicated coordinates, only print first and last. - -=item B<-e>, B<--epoch> - -Use seconds since 1970-01-01 00:00:00 GMT as date format. - -item B<--fix> - -Comment out entries which is obviously wrong. Use together with ---chronology to fix those kind of errors. Does not work with GPX or XML -output yet. - -=item B<-h>, B<--help> - -Show this help. - -=item B<--inside> - -Print only trackpoints inside a rectangle specified by --pos1 and ---pos2. - -=item B<--near> - -Add names of the three closest waypoints to the trackpoint. Unfinished -and experimental, needs gpsbabel. - -=item B<-n x>, B<--undefined x> - -Use x as undefined value. - -=item B<-o x>, B<--output-format x> - -Use output format x: - -=over 4 - -=over 4 - -=item clean - -=item csv - -=item gpsml (Default) - -This is the format which is meant to be used when storing the track -logs. -It is line-based XML which makes it easy to edit and grep. Probably not -finished yet. - -=item gpstrans - -=item gpx (Not complete) - -=item poscount (Experimental) - -Creates a 3D plot where areas with many trackpoints are higher than -areas with less track points. - -=item ps (Unfinished) - -=item svg (Unfinished) - -=item xgraph - -=item xml - -=item ygraph - -=back - -=back - -Z<> - -=item B<--outside> - -Print only trackpoints outside a rectangle specified by --pos1 and ---pos2. - -=item B<--pos1 x>, B<--pos2 x> - -Specifies corners of an area rectangle used by the --inside and ---outside options. The x value is in "lat,lon" format (decimal degrees, -negative for west or south) . - -=item B<-r x>, B<--require x> - -Specify requirements for trackpoints to be written. x is a string with -the following flags: - -=over 4 - -=over 4 - -=item a - -=over 4 - -=item Print only waypoints which have an altitude. - -=back - -=back - -=over 4 - -=item t - -=over 4 - -=item Print only waypoints which have a timestamp. - -=back - -=back - -=back - -Z<> - -=item B<-s>, B<--short-date> - -Use short date format. - -=item B<-S x>, B<--save-to-file x> - -Save the unconverted data to a file with a filename starting with the -timestamp of the first trackpoint. The parameter string x is added at -the end of the filename. For the time being this option will ignore all -other options. - -Note: If several files are specified on the command line, all data will -be saved into only one file. This behaviour may change in the future. - -=item B<-t>, B<--create-breaks> - -Create breaks in track between points with a difference more than the -number of seconds specified by the C<$PAUSE_LIMIT> variable. - -=item B<-u>, B<--comment-out-dups> - -Comment out following data with identical position values, only print -first entry. - -=item B<-v>, B<--verbose> - -Verbose, warn about unknown lines. - -=item B<-w>, B<--strip-whitespace> - -Strip all unnecessary whitespace. - -=item B<-x>, B<--xml> - -Create XML output. - -=item B<-y>, B<--double-y-scale> - -Double Y scale (latitude) to get it right in gnuplot. - -=item B<-h>, B<--help> - -Print a brief help summary. - -=item B<--version> - -Print version information. - -=item B<--debug> - -Print debugging messages. - -=back - -=head1 BUGS - -Pretty incomplete in some areas. Some of the source formats are -undocumented and thus incomplete. Some functionality is not working -properly, for example the Postscript output. - -=head1 AUTHOR - -Made by Øyvind A. Holm Ssunny@sunbase.orgE>. - -=head1 COPYRIGHT - -Copyleft © Øyvind A. Holm <sunny@sunbase.org> -This is free software; see the file F for legalese stuff. - -=head1 LICENCE - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -=head1 SEE ALSO - -gpsbabel(1) - -=cut - -# }}} - -# vim: set fenc=UTF-8 ft=perl fdm=marker ts=4 sw=4 sts=4 et fo+=w : -# End of file $Id$ diff --git a/branches/gpst.postgis/Patch/hvor.patch b/branches/gpst.postgis/Patch/hvor.patch deleted file mode 100644 index 0f6df87..0000000 --- a/branches/gpst.postgis/Patch/hvor.patch +++ /dev/null @@ -1,30 +0,0 @@ -Index: postgres/create_funcs.sql -=================================================================== ---- postgres/create_funcs.sql (revisjon 2238) -+++ postgres/create_funcs.sql (arbeidskopi) -@@ -120,6 +120,25 @@ - END; - $$ LANGUAGE plpgsql; - -+DROP FUNCTION hvor(timestamptz); -+CREATE OR REPLACE FUNCTION hvor(currtime timestamptz) RETURNS SETOF timestamptz AS $$ -+DECLARE -+ currpos point; -+ currsted text; -+ currdist numeric; -+ currlat numeric(9, 6); -+ currlon numeric(9, 6); -+BEGIN -+ currpos = findpos(currtime); -+ currlat = currpos[0]; -+ currlon = currpos[1]; -+ currsted = clname(currpos); -+ currdist = cldist(currpos); -+ SELECT currtime, currlat::text, currlon::text, currsted, currdist; -+ RETURN; -+END; -+$$ LANGUAGE plpgsql; -+ - DROP FUNCTION wherepos(timestamptz); - CREATE OR REPLACE FUNCTION wherepos(currtime timestamptz) RETURNS text AS $$ - DECLARE diff --git a/branches/gpst.postgis/Patch/mayko-comments.patch b/branches/gpst.postgis/Patch/mayko-comments.patch deleted file mode 100644 index 0db9110..0000000 --- a/branches/gpst.postgis/Patch/mayko-comments.patch +++ /dev/null @@ -1,40 +0,0 @@ -Index: tests/run-tests.pl -=================================================================== ---- tests/run-tests.pl (revision 2020) -+++ tests/run-tests.pl (working copy) -@@ -488,9 +488,11 @@ - - - -+ - - - -+ - - - -@@ -512,9 +514,11 @@ - - - -+ - - - -+ - - - -Index: gpst -=================================================================== ---- gpst (revision 2020) -+++ gpst (working copy) -@@ -273,6 +273,7 @@ - push(@first_lines, $_); - } - s/^# error // && ($Dat{'error'} = "error"); -+ s/^# (.+)// && ($Dat{'error'} = $1); - s/^# ?// && ($Dat{'error'} = "desc"); - $xml_data = ""; - if (m#^<(e?tp)\b(.*?)>(.*?)\s*$#) { diff --git a/branches/gpst.postgis/Patch/xgraph-fix_plus_more.patch b/branches/gpst.postgis/Patch/xgraph-fix_plus_more.patch deleted file mode 100644 index 71db8fa..0000000 --- a/branches/gpst.postgis/Patch/xgraph-fix_plus_more.patch +++ /dev/null @@ -1,101 +0,0 @@ -Index: tests/run-tests.pl -=================================================================== ---- tests/run-tests.pl (revision 1817) -+++ tests/run-tests.pl (working copy) -@@ -56,6 +56,29 @@ - $Opt{'help'} && usage(0); - $Opt{'version'} && print_version(); - -+testcmd("../gpst -o xgraph multitrack.gpx", # {{{ -+ <%s\n", - sec_to_readable($ep_time-$last_time)); - } elsif ($Opt{'output-format'} eq "csv") { -- $Line .= sprintf("# Pause: %s\n# move\n", -+ $Line .= sprintf("# Pause: %s\n", - sec_to_readable($ep_time-$last_time)); - } - } -@@ -896,8 +890,10 @@ - $1); - } - } elsif ($Opt{'output-format'} eq "xgraph") { -- $pause_len && ($Line .= "move "); -- ($Line .= "$Dat{'lon'} $Dat{'lat'}\n"); -+ if ($print_pos) { -+ $pause_len && ($Line .= "move "); -+ ($Line .= "$Dat{'lon'} $Dat{'lat'}\n"); -+ } - } elsif($Opt{'output-format'} eq "gpstrans") { - my ($gpt_lat, $gpt_lon) = - (ddd_to_dms($Dat{'lat'}), ddd_to_dms($Dat{'lon'})); -@@ -976,8 +972,8 @@ - if ($Opt{'output-format'} eq "gpsml") { - $Line = "\n$Line"; - } -- (!$pause_len && ($Opt{'output-format'} eq "xgraph")) -- && ($Line .= "move $Line"); -+ # (!$pause_len && ($Opt{'output-format'} eq "xgraph")) -+ # && ($Line .= "move $Line"); - ($Opt{'output-format'} eq "clean") && ($Line .= "\n"); - if ($Opt{'output-format'} eq "gpx") { - $Line .= "$Spc$Spc$Spc$Spc\n" . diff --git a/branches/gpst.postgis/Patch/ygraph-midnight.patch b/branches/gpst.postgis/Patch/ygraph-midnight.patch deleted file mode 100644 index 1936b6e..0000000 --- a/branches/gpst.postgis/Patch/ygraph-midnight.patch +++ /dev/null @@ -1,38 +0,0 @@ -Index: tests/run-tests.pl -=================================================================== ---- tests/run-tests.pl (revision 2148) -+++ tests/run-tests.pl (working copy) -@@ -1655,16 +1655,16 @@ - # }}} - testcmd("../gpst -o ygraph date_error.mayko", # {{{ - <) istedenfor å måtte kjøre \allupdate.sql etterfulgt av - \update_things.sql . Planen er: - - En ny tabell lages, "wayp_new". Nye veipunkter lagres der før de blir - forfremmet til wayp-tabellen. For at kun de nye punktene blir - behandlet, må det tråles gjennom lista og alle punktene som er nærmere - enn 0.05 blir oppdatert. - - Last nye punkter inn i wayp_new; - Trål gjennom alle koordinater i wayp_new { - Hvis navn og posisjon finnes i wayp fra før { - Slett punktet fra wayp_new; - } else { - BEGIN { - Oppdater alle trackpoints i databasen som er nærmere enn 0.05; - Slett alle veipunkter fra wayp som har de samme koordinatene; - Kopier veipunktet til wayp; - Slett punktet fra wayp_new; - } - } - - En annen måte: - - logg.coor er UNIQUE - Last nye punkter inn i wayp_new; - Trål gjennom alle koordinater i wayp_new { - Hvis navn og posisjon finnes i wayp fra før { - Flytt veipunktet fra new_wayp til wayp_rej; - } else { - BEGIN { - Oppdater alle trackpoints i databasen som er nærmere enn 0.05; - Flytt veipunktet fra wayp_new til wayp; - } - } - - Eller kanskje en bedre metode er: - - logg.coor er UNIQUE - Last nye punkter inn i wayp_new; - Trål gjennom alle koordinater i wayp_new { - BEGIN { - Flytt veipunktet fra wayp_new til wayp; - Hvis det gikk fint { - Oppdater alle trackpoints i databasen som er nærmere enn 0.05; - } else { - Flytt veipunktet fra new_wayp til wayp_rej; - } - } - } - -vim: set tw=72 ts=2 sw=2 sts=2 fo=tcqw2 et fenc=utf8 : diff --git a/branches/gpst.postgis/addpoints b/branches/gpst.postgis/addpoints deleted file mode 100755 index e3fc4fc..0000000 --- a/branches/gpst.postgis/addpoints +++ /dev/null @@ -1,309 +0,0 @@ -#!/usr/bin/perl -w - -#======================================================================= -# $Id$ -# Add new waypoints or trackpoints to the database. -# -# Character set: UTF-8 -# ©opyleft 2008– Øyvind A. Holm -# License: GNU General Public License version 2 or later, see end of -# file for legal stuff. -#======================================================================= - -BEGIN { - our @version_array; -} - -use strict; -use Getopt::Long; - -$| = 1; - -our $Debug = 0; - -our %Std = ( - - 'database' => "gps", - 'timezone' => "", - 'type' => "track", - -); - -our %Opt = ( - - 'database' => $Std{'database'}, - 'debug' => 0, - 'help' => 0, - 'timezone' => $Std{'timezone'}, - 'type' => $Std{'type'}, - 'verbose' => 0, - 'version' => 0, - 'waypoint' => 0, - -); - -our $progname = $0; -$progname =~ s/^.*\/(.*?)$/$1/; - -my $rcs_id = '$Id$'; -my $id_date = $rcs_id; -$id_date =~ s/^.*?\d+ (\d\d\d\d-.*?\d\d:\d\d:\d\d\S+).*/$1/; - -push(@main::version_array, $rcs_id); - -Getopt::Long::Configure("bundling"); -GetOptions( - - "database|D=s" => \$Opt{'database'}, - "debug" => \$Opt{'debug'}, - "help|h" => \$Opt{'help'}, - "timezone|T=s" => \$Opt{'timezone'}, - "type|t=s" => \$Opt{'type'}, - "verbose|v+" => \$Opt{'verbose'}, - "version" => \$Opt{'version'}, - "waypoint|w" => \$Opt{'waypoint'}, - -) || die("$progname: Option error. Use -h for help.\n"); - -$Opt{'debug'} && ($Debug = 1); -$Opt{'help'} && usage(0); -if ($Opt{'version'}) { - print_version(); - exit(0); -} - -my $tz_str = ""; -if (length($Opt{'timezone'})) { - if ($Opt{'timezone'} =~ /^[\+\-][0-2][0-9]{3}$/) { - $tz_str = $Opt{'timezone'}; - } elsif ($Opt{'timezone'} =~ /^z$/i) { - $tz_str = $Opt{'timezone'}; - } elsif ($Opt{'timezone'} =~ /^[a-z]+$/i) { - $tz_str = " $Opt{'timezone'}"; - } else { - die("$progname: $Opt{'timezone'}: Invalid time zone\n"); - } -} - -for my $Currarg (@ARGV) { - for my $Currfile (glob($Currarg)) { - D("Currfile = '$Currfile'"); - if ($Opt{'type'} =~ /picture/) { - if ($Currfile =~ /\.jpg$/i) { - my $tz_str = length($Opt{'timezone'}) - ? "-T $Opt{'timezone'} " - : ""; - my $exec_str = - "gpst-pic $tz_str$Currfile | psql -c \"COPY pictures (" . - join(", ", - "version", - "date", - "coor", - "descr", - "filename", - "author" - ) . - ") FROM stdin\" $Opt{'database'}"; - msg(1, "Executing '$exec_str'..."); - system($exec_str); - } - } - if ($Opt{'type'} =~ /track/) { - my $exec_str = - "gpst -o pgtab -d -rpt $Currfile | " . - "psql -a -c \"COPY logg (" . - join(", ", - "date", - "coor", - "ele", - "sted", - "dist", - "description", - "avst" - ) . - ") FROM stdin\" $Opt{'database'}"; - msg(1, "Executing '$exec_str'..."); - system($exec_str); - } - if ($Opt{'type'} =~ /waypoint/) { - my $exec_str = - "gpst -o pgwtab $Currfile | " . - "psql -a -c \"COPY wayp_new (" . - join(", ", - "coor", - "name", - "ele", - "type", - "time", - "cmt", - "descr", - "src", - "sym" - ) . - ") FROM stdin\" $Opt{'database'}"; - msg(1, "Executing '$exec_str'..."); - system($exec_str); - } - } -} - -sub print_version { - # Print program version {{{ - for (@main::version_array) { - print("$_\n"); - } - # }}} -} # print_version() - -sub usage { - # Send the help message to stdout {{{ - my $Retval = shift; - - if ($Opt{'verbose'}) { - print("\n"); - print_version(); - } - print(<= $verbose_level) { - print(STDERR "$progname: $Txt\n"); - } - # }}} -} # msg() - -sub D { - # Print a debugging message {{{ - $Debug || return; - my @call_info = caller; - chomp(my $Txt = shift); - my $File = $call_info[1]; - $File =~ s#\\#/#g; - $File =~ s#^.*/(.*?)$#$1#; - print(STDERR "$File:$call_info[2] $$ $Txt\n"); - return(""); - # }}} -} # D() - -__END__ - -# Plain Old Documentation (POD) {{{ - -=pod - -=head1 NAME - - - -=head1 REVISION - -$Id$ - -=head1 SYNOPSIS - - [options] [file [files [...]]] - -=head1 DESCRIPTION - - - -=head1 OPTIONS - -=over 4 - -=item B<-h>, B<--help> - -Print a brief help summary. - -=item B<-v>, B<--verbose> - -Increase level of verbosity. Can be repeated. - -=item B<--version> - -Print version information. - -=item B<--debug> - -Print debugging messages. - -=back - -=head1 BUGS - - - -=head1 AUTHOR - -Made by Øyvind A. Holm Ssunny@sunbase.orgE>. - -=head1 COPYRIGHT - -Copyleft © Øyvind A. Holm Esunny@sunbase.orgE -This is free software; see the file F for legalese stuff. - -=head1 LICENCE - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -=head1 SEE ALSO - -=cut - -# }}} - -# vim: set fenc=UTF-8 ft=perl fdm=marker ts=4 sw=4 sts=4 et fo+=w : -# End of file $Id$ diff --git a/branches/gpst.postgis/doc/Makefile b/branches/gpst.postgis/doc/Makefile deleted file mode 100644 index 99e2eab..0000000 --- a/branches/gpst.postgis/doc/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/make - -#======================================================================= -# $Id$ -#======================================================================= - -dbfile=gpst.xml -htmlfile=gpst.html -manpage=gpst.1 - -all: - $(MAKE) $(manpage) - $(MAKE) $(htmlfile) - -$(manpage): $(dbfile) - xsltproc --output $(manpage) ~/xsl/manpages/docbook.xsl $(dbfile) - -$(htmlfile): $(dbfile) - xsltproc --output $(htmlfile) ~/xsl/xhtml/docbook.xsl $(dbfile) - -valid: - xmllint --valid --noout $(dbfile) diff --git a/branches/gpst.postgis/doc/currpos.ods b/branches/gpst.postgis/doc/currpos.ods deleted file mode 100644 index 958f35a8a3aa0598b33e6e63a293b35514ace638..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 8913 zcwUux2Uru!`!!8KI)YL}I?@xWbd)Mx2u(U61Pq3n&;&#Tq=N`ZZ%UUUy+~E*ML}9< zp$bUv0s?=~>-~wJ_dfUA&E(mgIp@qfJG(RU&a0`4jYElXc5u{Xi2B3Df&r)3X9@o_ z*}`n0NOuP)*uen~gMg7Rdpn?uoh85?jDR5k_6|@xOM8g3Ez}MPKsY!-!Ip@7P$*LK zoF>LE2kmK+v$wN?Svxy@S3?K@5lAr78DRl-0{-CPpPs+-*#E!-Lm*H%^z_!=2?%j^ zaym1@%@&T0p{a^@W;+JfU*vx_hx!k)R&aYT68h7aKe7JQ2nTxyXNS}0;QTKA^+-& z6(b}2(HoQx(M5cI=1POTHNzXW#UWsY5DZ(h8e$LbdqK~tzu-O#PWHZO%4*;Q4{?G6 z?Y5>HXT|0vVj}`53&!e96u|SCJ3u(jZl5}|5GetMizL6U)yPr&^4~G>f zfR3g3%|unoU0=~8L*a|^-5Oz`@1t-)YV7=>WXXK4&oVdwW!H5VgWiK!qNSdUd;wME zb$<+Ar4cay{^ahUP_1zWZCfOyIv)-5hie;w_=%lBME z4N-0E5?f~{i}i^UZa+O_fmuyvOV@uTm zm>+%9V9K76_%(7(`~yf%wYuc2ll|?DkTgpu<~#yXm1Twu$(Pl&*^(0G z9(_n;Ur!Ht6fpL*XO(ilb1M7*5G*P@k?uW(Hkc<2b>~Q0^uO!(t~GZ

tfiNI{X9 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 -.\" Date: $Id$ -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] -.\" Language: English -.\" -.TH "GPST" "1" "$Id$" "[FIXME: source]" "[FIXME: manual]" -.\" ----------------------------------------------------------------- -.\" * (re)Define some macros -.\" ----------------------------------------------------------------- -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" toupper - uppercase a string (locale-aware) -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.de toupper -.tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ -\\$* -.tr aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz -.. -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" SH-xref - format a cross-reference to an SH section -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.de SH-xref -.ie n \{\ -.\} -.toupper \\$* -.el \{\ -\\$* -.\} -.. -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" SH - level-one heading that works better for non-TTY output -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.de1 SH -.\" put an extra blank line of space above the head in non-TTY output -.if t \{\ -.sp 1 -.\} -.sp \\n[PD]u -.nr an-level 1 -.set-an-margin -.nr an-prevailing-indent \\n[IN] -.fi -.in \\n[an-margin]u -.ti 0 -.HTML-TAG ".NH \\n[an-level]" -.it 1 an-trap -.nr an-no-space-flag 1 -.nr an-break-flag 1 -\." make the size of the head bigger -.ps +3 -.ft B -.ne (2v + 1u) -.ie n \{\ -.\" if n (TTY output), use uppercase -.toupper \\$* -.\} -.el \{\ -.nr an-break-flag 0 -.\" if not n (not TTY), use normal case (not uppercase) -\\$1 -.in \\n[an-margin]u -.ti 0 -.\" if not n (not TTY), put a border/line under subheading -.sp -.6 -\l'\n(.lu' -.\} -.. -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" SS - level-two heading that works better for non-TTY output -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.de1 SS -.sp \\n[PD]u -.nr an-level 1 -.set-an-margin -.nr an-prevailing-indent \\n[IN] -.fi -.in \\n[IN]u -.ti \\n[SN]u -.it 1 an-trap -.nr an-no-space-flag 1 -.nr an-break-flag 1 -.ps \\n[PS-SS]u -\." make the size of the head bigger -.ps +2 -.ft B -.ne (2v + 1u) -.if \\n[.$] \&\\$* -.. -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" BB/BE - put background/screen (filled box) around block of text -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.de BB -.if t \{\ -.sp -.5 -.br -.in +2n -.ll -2n -.gcolor red -.di BX -.\} -.. -.de EB -.if t \{\ -.if "\\$2"adjust-for-leading-newline" \{\ -.sp -1 -.\} -.br -.di -.in -.ll -.gcolor -.nr BW \\n(.lu-\\n(.i -.nr BH \\n(dn+.5v -.ne \\n(BHu+.5v -.ie "\\$2"adjust-for-leading-newline" \{\ -\M[\\$1]\h'1n'\v'+.5v'\D'P \\n(BWu 0 0 \\n(BHu -\\n(BWu 0 0 -\\n(BHu'\M[] -.\} -.el \{\ -\M[\\$1]\h'1n'\v'-.5v'\D'P \\n(BWu 0 0 \\n(BHu -\\n(BWu 0 0 -\\n(BHu'\M[] -.\} -.in 0 -.sp -.5v -.nf -.BX -.in -.sp .5v -.fi -.\} -.. -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.\" BM/EM - put colored marker in margin next to block of text -.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.de BM -.if t \{\ -.br -.ll -2n -.gcolor red -.di BX -.\} -.. -.de EM -.if t \{\ -.br -.di -.ll -.gcolor -.nr BH \\n(dn -.ne \\n(BHu -\M[\\$1]\D'P -.75n 0 0 \\n(BHu -(\\n[.i]u - \\n(INu - .75n) 0 0 -\\n(BHu'\M[] -.in 0 -.nf -.BX -.in -.fi -.\} -.. -.\" ----------------------------------------------------------------- -.\" * set default formatting -.\" ----------------------------------------------------------------- -.\" disable hyphenation -.nh -.\" disable justification (adjust text to left margin only) -.ad l -.\" ----------------------------------------------------------------- -.\" * MAIN CONTENT STARTS HERE * -.\" ----------------------------------------------------------------- -.SH "Name" -gpst \- Converts between various GPS formats\&. -.SH "Synopsis" -.fam C -.HP \w'\fBgpst\fR\ 'u -\fBgpst\fR [\fIoptions\fR] [\fIfile\fR...] -.fam -.fam C -.HP \w'\fBgpst\fR\ 'u -\fBgpst\fR {\-S} [\fIoptions\fR] [\fIfile\fR...] -.fam -.SH "Description" -.PP -\fB\-\-chronology\fR -.RS 4 -Check for broken chronology, warn about entries with an old timestamp\&. -.RE -.PP -\fB\-d\fR, \fB\-\-skip\-dups\fR -.RS 4 -If succeeding identical coordinates are found, print only the first one and ignore the rest\&. -.RE -.PP -\fB\-e\fR, \fB\-\-epoch\fR -.RS 4 -Use seconds since 1970\-01\-01 00:00:00 GMT as date format\&. -.RE -.PP -\fB\-\-fix\fR -.RS 4 -Comment out entries which is obviously wrong\&. Use together with -\fB\-\-chronology\fR -to fix those kind of errors\&. Does not work with GPX output yet\&. -.RE -.PP -\fB\-\-from\-date \fR\fB\fIx\fR\fR -.RS 4 -Used by the -\FCpgwupd\F[] -format\&. Specifies from which date waypoints should be updated\&. No checks for valid date format here, let -PostgreSQL -take care of that\&. All variants it understands can be used here\&. -.RE -.PP -\fB\-h\fR, \fB\-\-help\fR -.RS 4 -Send a brief help summary to stdout\&. -.RE -.PP -\fB\-\-inside\fR -.RS 4 -Print only trackpoints inside a rectangle specified by -\fB\-\-pos1\fR -and -\fB\-\-pos2\fR\&. -.RE -.PP -\fB\-n\fR, \fB\-\-undefined \fR\fB\fIx\fR\fR -.RS 4 -Use -\fIx\fR -as undefined value\&. -.RE -.PP -\fB\-\-near\fR -.RS 4 -Add names of the three closest waypoints to the trackpoint\&. Unfinished and experimental, needs -\fBgpsbabel\fR(1), which is called from the program as -\fB/usr/local/bin/gpsbabel\fR\&. -.RE -.PP -\fB\-o\fR, \fB\-\-output\-format \fR\fB\fIx\fR\fR -.RS 4 -Use output format -\fIx\fR: -.PP -\fBclean\fR -.RS 4 -TAB\-separated format with longitude, latitude and altitude\&. -.RE -.PP -\fBcsv\fR -.RS 4 -TAB\-separated format: -.PP -date -.RS 4 -Date of trackpoint\&. Format: -\FC\fIyyyy\fR\-\fImm\fR\-\fIdd\fRT\fIhh\fR:\fImm\fR:\fIss\fRZ\F[] -unless the -\fB\-\-epoch\fR -option is specified\&. If so, it\(cqs represented as number of seconds since 1970\-01\-01 00:00:00 UTC\&. -.RE -.PP -longitude -.RS 4 -Longitude, decimal degrees\&. -.RE -.PP -latitude -.RS 4 -Latitude, decimal degrees\&. -.RE -.PP -altitude -.RS 4 -Altitude in metres above sea level\&. Optional\&. If not present, the corresponding TAB is also printed, to keep the number of columns intact\&. -.RE -.RE -.PP -\fBgpsml\fR (Default) -.RS 4 -Line\-based XML which makes it easy to edit and grep\&. In the past, there was this big plan about making this the default storage format, so it was declared as The Honourable Default Output Format\&. But using GPX is the way to go, so this will probably change in the future\&. It\(cqs way too -de facto -and widely used, so storing GPS data in anything else is sheer waste of work\&. Probably not finished yet\&. -.RE -.PP -\fBgpstrans\fR -.RS 4 -The format generated by -\fBgpstrans\fR(1)\&. -.RE -.PP -\fBgpx\fR -.RS 4 -Not complete yet, but good enough in most cases\&. -.RE -.PP -\fBpgtab\fR -.RS 4 -TAB\-separated format for import into -PostgreSQL\&. Undefined values are written as -\FC\eN\F[] -if the -\fB\-\-undefined\fR -option is not specified\&. -.PP -date -.RS 4 -Format: -\FC\fIyyyy\fR\-\fImm\fR\-\fIdd\fRT\fIhh\fR:\fImm\fR:\fIss\fRZ\F[] -.RE -.PP -coor -.RS 4 -Format: -\FC(\fIlat\fR,\fIlon\fR)\F[] -.RE -.PP -ele -.RS 4 -Altitude in metres above sea level\&. -.RE -.PP -sted -.RS 4 -Short name of closest waypoint\&. Calculated in -PostgreSQL, so this value is always -\FC\eN\F[]\&. -.RE -.PP -dist -.RS 4 -Distance in decimal degrees to closest waypoint\&. Calculated in -PostgreSQL, so this value is always -\FC\eN\F[]\&. -.RE -.PP -description -.RS 4 -Description of waypoint\&. Calculated in -PostgreSQL, so this value is always -\FC\eN\F[]\&. -.RE -.PP -avst -.RS 4 -Distance to trackpoint in decimal degrees from a defined -\(lqhome\(rq -position\&. This is calculated in -PostgreSQL, so the field value is always -\FC\eN\F[]\&. -.RE -.RE -.PP -\fBpgwtab\fR -.RS 4 -Output waypoints on a TAB\-separated format: -.PP -coor -.RS 4 -Format: -\FC(\fIlat\fR,\fIlon\fR)\F[] -.RE -.PP -name -.RS 4 -Title of waypoint\&. -.RE -.PP -ele -.RS 4 -Elevation in metres above sea level\&. -.RE -.PP -type -.RS 4 -Type of waypoint, same as the GPX - -element\&. -.RE -.PP -time -.RS 4 -Timestamp of waypoint\&. -.RE -.PP -cmt -.RS 4 -Short waypoint description, used by the GPS as a comment\&. Same as the GPX - -element\&. -.RE -.PP -descr -.RS 4 -Long description, not used by the GPS\&. Same as the GPX - -element\&. -.RE -.PP -src -.RS 4 -Source of data, same as the - -GPX element\&. -.RE -.PP -sym -.RS 4 -GPS symbol name\&. Same as the - -GPX element\&. -.RE -.RE -.PP -\fBpgwupd\fR -.RS 4 -Output waypoints as SQL transactions which updates the -sted -and -dist -columns\&. -.RE -.PP -\fBposcount\fR -.RS 4 -Creates a 3D plot where areas with many trackpoints are higher than areas with less track points\&. -.RE -.PP -\fBps\fR -.RS 4 -Postscript\&. Unfinished\&. -.RE -.PP -\fBsvg\fR -.RS 4 -Unfinished\&. -.RE -.PP -\fBxgraph\fR -.RS 4 -Input format for -\fBxgraph\fR(1)\&. -.RE -.PP -\fBygraph\fR -.RS 4 -Input format for -\fBygraph\fR(1)\&. -.RE -.RE -.PP -\fB\-\-outside\fR -.RS 4 -Print only trackpoints outside a rectangle specified by -\fB\-\-pos1\fR -and -\fB\-\-pos2\fR\&. -.RE -.PP -\fB\-\-pos1 \fR\fB\fIx1\fR\fR\fB,\fR\fB\fIy1\fR\fR, \fB\-\-pos2 \fR\fB\fIx2\fR\fR\fB,\fR\fB\fIy2\fR\fR -.RS 4 -Specifies corners of an area rectangle used by the -\fB\-\-inside\fR -and -\fB\-\-outside\fR -options\&. The -\fIx\fR -and -\fIy\fR -values are specified as decimal degrees, negative for west or south\&. -.RE -.PP -\fB\-r\fR, \fB\-\-require \fR\fB\fIx\fR\fR -.RS 4 -Specify requirements for trackpoints to be written\&. -\fIx\fR -is a string with the following flags: -.PP -\fBe\fR -.RS 4 -Print only waypoints which have an elevation\&. -.RE -.PP -\fBp\fR -.RS 4 -Print only waypoints which have a position\&. -.RE -.PP -\fBt\fR -.RS 4 -Print only waypoints which have a timestamp\&. -.RE -.RE -.PP -\fB\-R\fR, \fB\-\-round \fR\fB\fIx\fR\fR\fB=\fR\fB\fIy\fR\fR\fB[,\fIx2\fR=\fIy2\fR[\&.\&.\&.]]\fR -.RS 4 -Round trackpoint element -\fIx\fR -to -\fIy\fR -decimals\&. -.sp -Example: -\fB\-\-round lat=4,lon=5,ele=1\fR -.RE -.PP -\fB\-s\fR, \fB\-\-short\-date\fR -.RS 4 -Use short date format\&. -.RE -.PP -\fB\-S\fR, \fB\-\-save\-to\-file \fR\fB\fIx\fR\fR -.RS 4 -Save the unconverted data to a file with a filename starting with the timestamp of the first trackpoint\&. The parameter string -\fIx\fR -is added at the end of the filename\&. For the time being this option will ignore all other options\&. -.if n \{\ -.sp -.\} -.RS 4 -.BM yellow -.it 1 an-trap -.nr an-no-space-flag 1 -.nr an-break-flag 1 -.br -.ps +1 -\fBNote\fR -.ps -1 -.br -If several files are specified on the command line, all data will be saved into only one file\&. This behaviour may change in the future\&. -.sp .5v -.EM yellow -.RE -.RE -.PP -\fB\-t\fR, \fB\-\-create\-breaks\fR -.RS 4 -Create breaks in track between points with a difference more than the number of seconds specified by the -\fBPAUSE_LIMIT\fR -variable\&. -.RE -.PP -\fB\-T \fR\fB\fIx\fR\fR, \fB\-\-time\-shift \fR\fB\fIx\fR\fR -.RS 4 -Move timestamps -\fIx\fR -seconds forwards or backwards in output\&. -\fIx\fR -can be a positive or negative integer\&. -.RE -.PP -\fB\-v\fR, \fB\-\-verbose\fR -.RS 4 -Verbose output, can be repeated\&. -.RE -.PP -\fB\-\-version\fR -.RS 4 -Print program version information\&. -.RE -.PP -\fB\-w\fR, \fB\-\-strip\-whitespace\fR -.RS 4 -Strip all unnecessary whitespace\&. -.RE -.PP -\fB\-y\fR, \fB\-\-double\-y\-scale\fR -.RS 4 -Double Y scale (latitude)\&. -.RE -.PP -\fB\-\-debug\fR -.RS 4 -Print debugging messages\&. -.RE -.SH "Bugs and things that need to be done" -.sp -.RS 4 -.ie n \{\ -\h'-04'\(bu\h'+03'\c -.\} -.el \{\ -.sp -1 -.IP \(bu 2.3 -.\} -Pretty incomplete in some areas\&. Some of the source formats are undocumented and thus incomplete\&. Some functionality is not working properly, for example the Postscript output\&. -.RE -.sp -.RS 4 -.ie n \{\ -\h'-04'\(bu\h'+03'\c -.\} -.el \{\ -.sp -1 -.IP \(bu 2.3 -.\} -Remove hardcodings, for example the -\(lqhome\(rq -position used to calculate the -avst -database column\&. -.RE -.sp -.RS 4 -.ie n \{\ -\h'-04'\(bu\h'+03'\c -.\} -.el \{\ -.sp -1 -.IP \(bu 2.3 -.\} -Translate database column names to English\&. -.RE -.sp -.RS 4 -.ie n \{\ -\h'-04'\(bu\h'+03'\c -.\} -.el \{\ -.sp -1 -.IP \(bu 2.3 -.\} -Add more tests to cover all command\-line options\&. -.RE -.SH "Author" -.PP -Made by -Øyvind A\&. Holm -\FCsunny@sunbase\&.org\F[]\&. -.SH "Copyright" -.PP -Copyleft \(co -Øyvind A\&. Holm -\FCsunny@sunbase\&.org\F[]\&. This is free software; see the file -\FCCOPYING\F[] -for legalese stuff\&. -.SH "License" -.PP -This program is free software; you can redistribute it and/or modify it under the terms of the -GNU General Public License -as published by the -Free Software Foundation; either version 2 of the License, or (at your option) any later version\&. -.PP -This program is distributed in the hope that it will be useful, but -\fIWITHOUT ANY WARRANTY\fR; without even the implied warranty of -\fIMERCHANTABILITY\fR -or -\fIFITNESS FOR A PARTICULAR PURPOSE\fR\&. See the GNU General Public License for more details\&. -.PP -You should have received a copy of the GNU General Public License along with this program; if not, write to -.sp -.if n \{\ -.RS 4 -.\} -.fam C -.ps -1 -.nf -The Free Software Foundation, Inc\&. -59 Temple Place, Suite 330 -Boston, MA 02111\-1307 -USA -.fi -.fam -.ps +1 -.if n \{\ -.RE -.\} -.SH "See also" -.PP -\fBgpsbabel\fR(1) diff --git a/branches/gpst.postgis/doc/gpst.html b/branches/gpst.postgis/doc/gpst.html deleted file mode 100644 index 6a6d1f4..0000000 --- a/branches/gpst.postgis/doc/gpst.html +++ /dev/null @@ -1,136 +0,0 @@ - - -gpst

Name

gpst — Converts between various GPS formats.

Synopsis

gpst [ - options - ] [ - file - ...]

gpst {-S} [ - options - ] [ - file - ...]

Description

--chronology

Check for broken chronology, warn about entries with an - old timestamp.

-d, --skip-dups

If succeeding identical coordinates are found, print - only the first one and ignore the rest.

-e, --epoch

Use seconds since 1970-01-01 00:00:00 GMT as date - format.

--fix

Comment out entries which is obviously wrong. - Use together with --chronology to fix those - kind of errors. - Does not work with GPX output yet.

--from-date - x

Used by the pgwupd format. - Specifies from which date waypoints should be updated. - No checks for valid date format here, let - PostgreSQL take care of that. - All variants it understands can be used here.

-h, --help

Send a brief help summary to stdout.

--inside

Print only trackpoints inside a rectangle specified by - --pos1 and --pos2.

-n, --undefined - x

Use x as undefined - value.

--near

Add names of the three closest waypoints to the - trackpoint. - Unfinished and experimental, needs gpsbabel(1), which is called from - the program as - /usr/local/bin/gpsbabel.

-o, --output-format - x

Use output format x:

clean

TAB-separated format with longitude, latitude and - altitude.

csv

TAB-separated format: -

date

Date of trackpoint. - Format: - yyyy-mm-ddThh:mm:ssZ - unless the --epoch option is - specified. - If so, it’s represented as number of seconds since - 1970-01-01 00:00:00 UTC.

longitude

Longitude, decimal degrees.

latitude

Latitude, decimal degrees.

altitude

Altitude in metres above sea level. - Optional. - If not present, the corresponding TAB is also - printed, to keep the number of columns - intact.

gpsml (Default)

Line-based XML which makes it easy to edit and - grep. - In the past, there was this big plan about making this - the default storage format, so it was declared as The - Honourable Default Output Format. - But using GPX is the way to go, so this will probably - change in the future. - It’s way too de facto and - widely used, so storing GPS data in anything else is - sheer waste of work. - Probably not finished yet.

gpstrans

The format generated by gpstrans(1).

gpx

Not complete yet, but good enough in most - cases.

pgtab

TAB-separated format for import into - PostgreSQL. - Undefined values are written as \N if - the --undefined option is not - specified.

date

Format: - yyyy-mm-ddThh:mm:ssZ

coor

Format: - (lat,lon)

ele

Altitude in metres above sea level.

sted

Short name of closest waypoint. - Calculated in - PostgreSQL, so this - value is always \N.

dist

Distance in decimal degrees to closest - waypoint. - Calculated in - PostgreSQL, so this - value is always \N.

description

Description of waypoint. - Calculated in - PostgreSQL, so this - value is always \N.

avst

Distance to trackpoint in decimal degrees - from a defined “home” position. - This is calculated in - PostgreSQL, so the - field value is always - \N.

pgwtab

Output waypoints on a TAB-separated format:

coor

Format: - (lat,lon)

name

Title of waypoint.

ele

Elevation in metres above sea level.

type

Type of waypoint, same as the GPX <type> element.

time

Timestamp of waypoint.

cmt

Short waypoint description, used by the GPS - as a comment. - Same as the GPX <cmt> element.

descr

Long description, not used by the GPS. - Same as the GPX <desc> element.

src

Source of data, same as the <src> GPX element.

sym

GPS symbol name. - Same as the <sym> GPX element.

pgwupd

Output waypoints as SQL transactions which updates - the sted and - dist columns.

poscount

Creates a 3D plot where areas with many - trackpoints are higher than areas with less track - points.

ps

Postscript. Unfinished.

svg

Unfinished.

xgraph

Input format for xgraph(1).

ygraph

Input format for ygraph(1).

--outside

Print only trackpoints outside a rectangle specified by - --pos1 and --pos2.

--pos1 - x1,y1, --pos2 - x2,y2

Specifies corners of an area rectangle used by the - --inside and --outside - options. - The x and - y values are specified as decimal - degrees, negative for west or south.

-r, --require - x

Specify requirements for trackpoints to be written. - x is a string with the following - flags:

e

Print only waypoints which have an - elevation.

p

Print only waypoints which have a position.

t

Print only waypoints which have a - timestamp.

-R, --round - x=y[,x2=y2[...]]

Round trackpoint element x to - y decimals.

Example:

--round lat=4,lon=5,ele=1

-s, --short-date

Use short date format.

-S, --save-to-file - x

Save the unconverted data to a file with a filename - starting with the timestamp of the first trackpoint. - The parameter string x is added at - the end of the filename. - For the time being this option will ignore all other - options.

Note

If several files are specified on the command line, - all data will be saved into only one file. - This behaviour may change in the future.

-t, - --create-breaks

Create breaks in track between points with a difference - more than the number of seconds specified by the - PAUSE_LIMIT variable.

-T x, - --time-shift - x

Move timestamps x seconds - forwards or backwards in output. - x can be a positive or negative - integer.

-v, --verbose

Verbose output, can be repeated.

--version

Print program version information.

-w, - --strip-whitespace

Strip all unnecessary whitespace.

-y, - --double-y-scale

Double Y scale (latitude).

--debug

Print debugging messages.

Bugs and things that need to be done

  • Pretty incomplete in some areas. - Some of the source formats are undocumented and thus incomplete. - Some functionality is not working properly, for example the - Postscript output.

  • Remove hardcodings, for example the “home” - position used to calculate the avst database column.

  • Translate database column names to English.

  • Add more tests to cover all command-line options.

Author

Made by Øyvind A. Holm - .

Copyright

Copyleft © Øyvind A. Holm - . - This is free software; see the file COPYING for - legalese stuff.

License

This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details.

You should have received a copy of the GNU General Public - License along with this program; if not, write to -

The Free Software Foundation, Inc.
-59 Temple PlaceSuite 330
-BostonMA 02111-1307
-USA

See also

gpsbabel(1)

diff --git a/branches/gpst.postgis/doc/gpst.xml b/branches/gpst.postgis/doc/gpst.xml deleted file mode 100644 index 666462c..0000000 --- a/branches/gpst.postgis/doc/gpst.xml +++ /dev/null @@ -1,682 +0,0 @@ - - - - - - - - gpst - 1 - - - gpst - Converts between various GPS formats. - - - - - gpst - - options - - - file - - - - - gpst - -S - - options - - - file - - - - - - Description - - - - - - - Check for broken chronology, warn about entries with an - old timestamp. - - - - - , - - If succeeding identical coordinates are found, print - only the first one and ignore the rest. - - - - - , - - Use seconds since 1970-01-01 00:00:00 GMT as date - format. - - - - - - - Comment out entries which is obviously wrong. - Use together with to fix those - kind of errors. - Does not work with GPX output yet. - - - - - - - Used by the pgwupd format. - Specifies from which date waypoints should be updated. - No checks for valid date format here, let - PostgreSQL take care of that. - All variants it understands can be used here. - - - - - , - - Send a brief help summary to stdout. - - - - - - - Print only trackpoints inside a rectangle specified by - and . - - - - - , - - Use x as undefined - value. - - - - - - - Add names of the three closest waypoints to the - trackpoint. - Unfinished and experimental, needs - gpsbabel - 1 , which is called from - the program as - /usr/local/bin/gpsbabel. - - - - - , - - Use output format x: - - - - - - TAB-separated format with longitude, latitude and - altitude. - - - - - - - TAB-separated format: - - - - date - - Date of trackpoint. - Format: - yyyy-mm-ddThh:mm:ssZ - unless the option is - specified. - If so, it’s represented as number of seconds since - 1970-01-01 00:00:00 UTC. - - - - - longitude - - Longitude, decimal degrees. - - - - - latitude - - Latitude, decimal degrees. - - - - - altitude - - Altitude in metres above sea level. - Optional. - If not present, the corresponding TAB is also - printed, to keep the number of columns - intact. - - - - - - - - - (Default) - - Line-based XML which makes it easy to edit and - grep. - In the past, there was this big plan about making this - the default storage format, so it was declared as The - Honourable Default Output Format. - But using GPX is the way to go, so this will probably - change in the future. - It’s way too de facto and - widely used, so storing GPS data in anything else is - sheer waste of work. - Probably not finished yet. - - - - - - - The format generated by - gpstrans - 1 . - - - - - - - Not complete yet, but good enough in most - cases. - - - - - - - TAB-separated format for import into - PostgreSQL. - Undefined values are written as \N if - the option is not - specified. - - - - date - - Format: - yyyy-mm-ddThh:mm:ssZ - - - - - coor - - Format: - (lat,lon) - - - - - ele - - Altitude in metres above sea level. - - - - - sted - - Short name of closest waypoint. - Calculated in - PostgreSQL, so this - value is always \N. - - - - - dist - - Distance in decimal degrees to closest - waypoint. - Calculated in - PostgreSQL, so this - value is always \N. - - - - - description - - Description of waypoint. - Calculated in - PostgreSQL, so this - value is always \N. - - - - - avst - - Distance to trackpoint in decimal degrees - from a defined home position. - This is calculated in - PostgreSQL, so the - field value is always - \N. - - - - - - - - - - - Output waypoints on a TAB-separated format: - - - - coor - - Format: - (lat,lon) - - - - - name - - Title of waypoint. - - - - - ele - - Elevation in metres above sea level. - - - - - type - - Type of waypoint, same as the GPX type element. - - - - - time - - Timestamp of waypoint. - - - - - cmt - - Short waypoint description, used by the GPS - as a comment. - Same as the GPX cmt element. - - - - - descr - - Long description, not used by the GPS. - Same as the GPX desc element. - - - - - src - - Source of data, same as the src GPX element. - - - - - sym - - GPS symbol name. - Same as the sym GPX element. - - - - - - - - - - - Output waypoints as SQL transactions which updates - the sted and - dist columns. - - - - - - - Creates a 3D plot where areas with many - trackpoints are higher than areas with less track - points. - - - - - - - Postscript. Unfinished. - - - - - - - Unfinished. - - - - - - - Input format for - xgraph - 1 . - - - - - - - Input format for - ygraph - 1 . - - - - - - - - - - - Print only trackpoints outside a rectangle specified by - and . - - - - - - - - Specifies corners of an area rectangle used by the - and - options. - The x and - y values are specified as decimal - degrees, negative for west or south. - - - - - , - - Specify requirements for trackpoints to be written. - x is a string with the following - flags: - - - - - - Print only waypoints which have an - elevation. - - - - - - - Print only waypoints which have a position. - - - - - - - Print only waypoints which have a - timestamp. - - - - - - - - - , - - Round trackpoint element x to - y decimals. - Example: -
- -
-
-
- - - , - - Use short date format. - - - - - , - - Save the unconverted data to a file with a filename - starting with the timestamp of the first trackpoint. - The parameter string x is added at - the end of the filename. - For the time being this option will ignore all other - options. - - If several files are specified on the command line, - all data will be saved into only one file. - This behaviour may change in the future. - - - - - - , - - - Create breaks in track between points with a difference - more than the number of seconds specified by the - PAUSE_LIMIT variable. - - - - - , - - - Move timestamps x seconds - forwards or backwards in output. - x can be a positive or negative - integer. - - - - - , - - Verbose output, can be repeated. - - - - - - - Print program version information. - - - - - , - - - Strip all unnecessary whitespace. - - - - - , - - - Double Y scale (latitude). - - - - - - - Print debugging messages. - - - -
- -
- - Bugs and things that need to be done - - - - - Pretty incomplete in some areas. - Some of the source formats are undocumented and thus incomplete. - Some functionality is not working properly, for example the - Postscript output. - - - - Remove hardcodings, for example the home - position used to calculate the avst database column. - - - - Translate database column names to English. - - - - Add more tests to cover all command-line options. - - - - - - - Author - - Made by Øyvind - A. Holm - sunny@sunbase.org. - - - - Copyright - - Copyleft © Øyvind - A. Holm - sunny@sunbase.org. - This is free software; see the file COPYING for - legalese stuff. - - - - License - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2 of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public - License along with this program; if not, write to -
The Free Software Foundation, Inc. -59 Temple Place, Suite 330 -Boston, MA 02111-1307 -USA
- -
- - See also - - - gpsbabel - 1 - - - - -
diff --git a/branches/gpst.postgis/doc/mayko.txt b/branches/gpst.postgis/doc/mayko.txt deleted file mode 100644 index 36bc443..0000000 --- a/branches/gpst.postgis/doc/mayko.txt +++ /dev/null @@ -1,37 +0,0 @@ -$Id$ - -Description of the “Mayko Xmap” format written by gpstrans(1). From the -C source. - -======== CUT ======== -xmaplog 1.0 Fri Nov 1 17:49:13 2002 -1 60.3907135 5.3303821 8.4 0 10/30/2002 15:13:21 -1 60.3906397 5.3304033 8.1 0 10/30/2002 15:13:23 -1 60.3902955 5.3304494 8.3 0 10/30/2002 15:13:32 -======== CUT ======== - - - -
xmaplog 1.0
- - Fri Nov 1 17:49:13 2002 -
- - - -
1
- 60.3907135 5.3303821 - - 8.4 - - 0 - - - -
- -
diff --git a/branches/gpst.postgis/doc/til_postgres.txt b/branches/gpst.postgis/doc/til_postgres.txt deleted file mode 100644 index 6345f5c..0000000 --- a/branches/gpst.postgis/doc/til_postgres.txt +++ /dev/null @@ -1,56 +0,0 @@ -$Id$ - -Opprettelse av "gps"-databasen: - - $ cd ~/bin/src/gpstools/postgres - $ createdb gps - $ psql gps - gps=# \i create_table.sql - gps=# \i create_funcs.sql - gps=# \i create_views.sql - -For å kopiere ting fra nye tracklogger inn i PostgreSQL: - - 1: cd til der de nye filene er. - 1: Kjør svn update og slett de filene som allerede er lagt inn. - 1: gpst -o pgtab -d -rpt *.gpx | psql -a -c "COPY logg FROM stdin" gps - - 2: cd ~/gps/div/postgres - 2: psql gps - 2: \i update_things.sql - - Så kommer turen til stedsnavnene: - - 1: cd ~/gps/poi/trans - 1: svn update osv - 1: gpst -o pgwupd *.gpx | psql -a gps - 1: cd ~/gps/unit - 1: svn update osv - 1: gpst -o pgwupd wpdata.gpx | psql -a gps - -For å legge til nye veipunkter: - -Kjør - - gpst -o pgwtab *.gpx | psql -a -c "COPY wayp FROM stdin" gps - -For å renske opp i veipunktene: - -cd ~/bin/src/gpstools/postgres -psql gps -\i cleanup.sql - -For å synkronisere waypoints og POI: - -Her trengs Postgres. Må ha en database som heter "gps" og en tabell som -heter "tmpwayp". Ordnes med ../postgres/create_table.sql . Deretter er -det bare å kjøre ../poisync og redigere .gpx-filene. - -En grei makro som kan brukes i vimdiff når wpdata.gpx er i venstre vindu -og den som veipunktet skal legges inn i er i høyre, er: - -:map yGP?Y/p - -(Marker veipunktet i venstre vindu med Shift-V og trykk F1.) - -vim: set ts=2 sts=2 sw=2 et : diff --git a/branches/gpst.postgis/gpslist b/branches/gpst.postgis/gpslist deleted file mode 100755 index 21e1719..0000000 --- a/branches/gpst.postgis/gpslist +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -#======================================================================= -# $Id$ -# Read GPS data from stdin or file names at the command line and send a -# PostgreSQL table to stdout. Needs a database called "tmpgps" with the -# usual tables. -#======================================================================= - -cat "$@" | gpst -o pgtab | psql -c "TRUNCATE logg; COPY logg FROM stdin;" tmpgps >/dev/null 2>&1 -cd ~/bin/src/gpstools/postgres -psql -f "$HOME/bin/src/gpstools/postgres/allupdate.sql" tmpgps >/dev/null 2>&1 -psql -f "$HOME/bin/src/gpstools/postgres/distupdate.sql" tmpgps >/dev/null 2>&1 -psql -c "SELECT date as date, coor, sted, dist, avst FROM logg ORDER BY date;" tmpgps diff --git a/branches/gpst.postgis/gpsman2gpx b/branches/gpst.postgis/gpsman2gpx deleted file mode 100755 index 7a3df7f..0000000 --- a/branches/gpst.postgis/gpsman2gpx +++ /dev/null @@ -1,266 +0,0 @@ -#!/usr/bin/perl -w - -#======================================================================= -# $Id$ -# Quick & dirty script for converting gpsman(1) sdata files to GPX. -# -# Character set: UTF-8 -# ©opyleft 2006– Øyvind A. Holm -# License: GNU General Public License version 2 or later, see end of -# file for legal stuff. -#======================================================================= - -BEGIN { - push(@INC, "$ENV{'HOME'}/bin/src/gpstools"); -} - -BEGIN { - our @version_array; -} - -use strict; -use Getopt::Long; - -use GPSTxml; - -$| = 1; - -our $Debug = 0; - -our %Opt = ( - - 'debug' => 0, - 'help' => 0, - 'verbose' => 0, - 'version' => 0, - -); - -our $progname = $0; -$progname =~ s/^.*\/(.*?)$/$1/; - -my $rcs_id = '$Id$'; -my $id_date = $rcs_id; -$id_date =~ s/^.*?\d+ (\d\d\d\d-.*?\d\d:\d\d:\d\d\S+).*/$1/; - -push(@main::version_array, $rcs_id); - -Getopt::Long::Configure("bundling"); -GetOptions( - - "debug" => \$Opt{'debug'}, - "help|h" => \$Opt{'help'}, - "verbose|v+" => \$Opt{'verbose'}, - "version" => \$Opt{'version'}, - -) || die("$progname: Option error. Use -h for help.\n"); - -$Opt{'debug'} && ($Debug = 1); -$Opt{'help'} && usage(0); -if ($Opt{'version'}) { - print_version(); - exit(0); -} - -print(< - - -END - -while (<>) { - my $Line = $_; - if ( - $Line =~ /^ - (.*?)\t # name - (.*?)\t # cmt - (.*?)\t # some kind of worthless date - ([NS].+?)\t # lat - ([WE].+?)\t # lon - (.*) # lots of uninteresting stuff but with altitude - $ - /x - ) { - my ($Name, $Cmt, $wl_date, $Lat, $Lon, $Rest) = - ( $1, $2, $3, $4, $5, $6); - my $Ele = ""; - - $Name = txt_to_xml($Name); - $Cmt = txt_to_xml($Cmt); - $Lat = conv_pos($Lat); - $Lon = conv_pos($Lon); - if ($Rest =~ /ele=([\d\.]+)\D/) { - $Ele = 1.0 * $1; - } - print(" \n"); - print(" $Ele\n") if length($Ele); - print(" $Name\n") if length($Name); - print(" $Cmt\n") if length($Cmt); - print(" \n"); - } -} - -print("\n"); - -sub conv_pos { - # {{{ - my $Retval = shift; - - if ($Retval =~ /^([NSWE])([0-9\.]+)$/) { - my ($Pref, $Deg) = ($1, $2); - $Retval = ($Pref =~ /[SW]/) - ? 0-$Deg - : $Deg; - } else { - warn("\"$Retval\": Invalid coordinate\n"); - } - return $Retval; - # }}} -} - -sub print_version { - # Print program version {{{ - for (@main::version_array) { - print("$_\n"); - } - # }}} -} # print_version() - -sub usage { - # Send the help message to stdout {{{ - my $Retval = shift; - - if ($Opt{'verbose'}) { - print("\n"); - print_version(); - } - print(<= $verbose_level) { - print(STDERR "$progname: $Txt\n"); - } - # }}} -} # msg() - -sub D { - # Print a debugging message {{{ - $Debug || return; - my @call_info = caller; - chomp(my $Txt = shift); - my $File = $call_info[1]; - $File =~ s#\\#/#g; - $File =~ s#^.*/(.*?)$#$1#; - print(STDERR "$File:$call_info[2] $$ $Txt\n"); - return(""); - # }}} -} # D() - -__END__ - -# Plain Old Documentation (POD) {{{ - -=pod - -=head1 NAME - - - -=head1 REVISION - -$Id$ - -=head1 SYNOPSIS - - [options] [file [files [...]]] - -=head1 DESCRIPTION - - - -=head1 OPTIONS - -=over 4 - -=item B<-h>, B<--help> - -Print a brief help summary. - -=item B<-v>, B<--verbose> - -Increase level of verbosity. Can be repeated. - -=item B<--version> - -Print version information. - -=item B<--debug> - -Print debugging messages. - -=back - -=head1 BUGS - - - -=head1 AUTHOR - -Made by Øyvind A. Holm Ssunny@sunbase.orgE>. - -=head1 COPYRIGHT - -Copyleft © Øyvind A. Holm Esunny@sunbase.orgE -This is free software; see the file F for legalese stuff. - -=head1 LICENCE - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -=head1 SEE ALSO - -=cut - -# }}} - -# vim: set fenc=UTF-8 ft=perl fdm=marker ts=4 sw=4 sts=4 et fo+=w : -# End of file $Id$ diff --git a/branches/gpst.postgis/gpst b/branches/gpst.postgis/gpst deleted file mode 100755 index 55634a1..0000000 --- a/branches/gpst.postgis/gpst +++ /dev/null @@ -1,1269 +0,0 @@ -#!/usr/bin/perl -w - -#======================================================================= -# $Id$ -# Converts between various GPS formats -# -# Character set: UTF-8 -# ©opyleft 2002– Øyvind A. Holm -# License: GNU General Public License version 2 or later, see end of -# file for legal stuff. -#======================================================================= - -BEGIN { - our @version_array; -} - -use strict; -use Getopt::Long; -use Time::Local qw { timegm_nocheck }; - -BEGIN { - push(@INC, "$ENV{'HOME'}/bin/src/gpstools"); - our @version_array; -} - -use GPST; -use GPSTdate; -use GPSTdebug; -use GPSTgeo; -use GPSTxml; - -$| = 1; - -our $Debug = 0; - -our %Opt = ( - # Initial values for command line arguments {{{ - - 'chronology' => 0, - 'create-breaks' => 0, - 'debug' => 0, - 'double-y-scale' => 0, - 'epoch' => 0, - 'fix' => 0, - 'from-date' => "", - 'help' => 0, - 'inside' => 0, - 'near' => "", - 'output-format' => "gpsml", - 'outside' => 0, - 'pos1' => "", - 'pos2' => "", - 'require' => "", - 'round' => "", - 'save-to-file' => "\n", # \n = undefined, it’s banned in filenames anyway. - 'short-date' => 0, - 'skip-dups' => 0, - 'strip-whitespace' => 0, - 'time-shift' => 0, - 'undefined' => "", - 'verbose' => 0, - 'version' => 0, - - # }}} -); - -our $progname = $0; -$progname =~ s/^.*\/(.*?)$/$1/; - -my $rcs_id = '$Id$'; -my $id_date = $rcs_id; -$id_date =~ s/^.*?\d+ (\d\d\d\d-.*?\d\d:\d\d:\d\d\S+).*/$1/; - -push(@main::version_array, $rcs_id); - -Getopt::Long::Configure("bundling"); -GetOptions( - # Command line options {{{ - - "chronology" => \$Opt{'chronology'}, - "create-breaks|t" => \$Opt{'create-breaks'}, - "debug" => \$Opt{'debug'}, - "double-y-scale|y" => \$Opt{'double-y-scale'}, - "epoch|e" => \$Opt{'epoch'}, - "fix" => \$Opt{'fix'}, - "from-date=s" => \$Opt{'from-date'}, - "help|h" => \$Opt{'help'}, - "inside" => \$Opt{'inside'}, - "near" => \$Opt{'near'}, - "output-format|o=s" => \$Opt{'output-format'}, - "outside" => \$Opt{'outside'}, - "pos1=s" => \$Opt{'pos1'}, - "pos2=s" => \$Opt{'pos2'}, - "require|r=s" => \$Opt{'require'}, - "round|R=s" => \$Opt{'round'}, - "save-to-file|S=s" => \$Opt{'save-to-file'}, - "short-date|s" => \$Opt{'short-date'}, - "skip-dups|d" => \$Opt{'skip-dups'}, - "strip-whitespace|w" => \$Opt{'strip-whitespace'}, - "time-shift|T=i" => \$Opt{'time-shift'}, - "undefined|n=s" => \$Opt{'undefined'}, - "verbose|v+" => \$Opt{'verbose'}, - "version" => \$Opt{'version'}, - - # }}} -) || die("$progname: Option error. Use -h for help.\n"); - -my %Dat; - -my $PAUSE_LIMIT = 2 * 60; # Antall sekunder mellom to punkter det må til før en move legges inn. -my $Udef = "?"; -my $DIGIT = '[0-9\.\-\+]'; # Used in regexps -$GPST::Spc = $Opt{'strip-whitespace'} ? "" : " "; -my $Spc = $GPST::Spc; # FIXME -my $found_move = 0; # Settes til 1 hvis en /^# move$/ blir funnet. -my $first_time = 0; -my $last_time = 0; -my ($last_lon, $last_lat, $last_line) = - ( 1000, 1000, ""); # Vi kan jo teoretisk sett være i Greenwich eller på ekvator -my ($lat1, $lon1, $lat2, $lon2) = - (-1000, -1000, 1000, 1000); - -our %Cmd = ( - 'gpsbabel' => '/usr/local/bin/gpsbabel', -); - -my %Poscount = (); - -if ($Opt{'output-format'} eq "pgtab") { - $Opt{'require'} .= "p"; -} -my %Req = ( - 'ele' => ($Opt{'require'} =~ /e/) ? 1 : 0, - 'position' => ($Opt{'require'} =~ /p/) ? 1 : 0, - 'time' => ($Opt{'require'} =~ /t/) ? 1 : 0, -); -$Opt{'require'} =~ /[^ept]/ - && die("$0: Unknown flag in --require (-r) value\n"); - -$Opt{'debug'} && ($Debug = 1); -$Opt{'help'} && usage(0); -if ($Opt{'version'}) { - print_version(); - exit(0); -} - -if ($Opt{'pos1'} =~ /^($DIGIT+),($DIGIT+)$/) { - $lat1 = $1; - $lon1 = $2; -} -if ($Opt{'pos2'} =~ /^($DIGIT+),($DIGIT+)$/) { - $lat2 = $1; - $lon2 = $2; -} -if ($lat1 > $lat2) { - my $Tmp = $lat1; - $lat1 = $lat2; - $lat2 = $Tmp; -} -if ($lon1 > $lon2) { - my $Tmp = $lon1; - $lon1 = $lon2; - $lon2 = $Tmp; -} - -if ($Opt{'epoch'} && $Opt{'short-date'}) { - die("$progname: Cannot mix the --epoch (-e) and --short-date (-s) options\n"); -} - -if ($Opt{'inside'} && $Opt{'outside'}) { - die("$progname: Cannot mix the --inside and --outside options\n"); -} - -# To avoid printing out extra "/> at the start of svg output: -my $svg_start_thing = ""; - -my %Round = (); - -if (defined($Opt{'round'})) { - my $R = $Opt{'round'}; - $R =~ s/([a-z]+)=(\d+)/($Round{$1}=$2, "")/eg; -} - -length($Opt{'undefined'}) && ($Udef = $Opt{'undefined'}); - -$Opt{'save-to-file'} eq "\n" && print_header(*STDOUT); - -my @first_lines; -my $xml_data; -my $data_line = ""; -our $curr_file = ""; - -my $from_stdin = scalar(@ARGV) ? 0 : 1; - -$from_stdin && push(@ARGV, "-"); - -for $curr_file (@ARGV) { - # Scan through stdin or specified files and send every GPS entry to - # print_entry() - # {{{ - print(STDERR "$progname: Opening \"$curr_file\" for read\n") if $Opt{'verbose'}; - if (open(CurrFP, "<$curr_file")) { - # {{{ - while () { - $data_line = $_; - %Dat = ( - 'year' => '', 'month' => '', 'day' => '', - 'hour' => '', 'min' => '', 'sec' => '', - 'epoch' => '', - 'date-format' => '', - 'lat' => '', 'lon' => '', - 'ele' => '', - 'desc' => '', - 'error' => "", - 'what' => 'tp', - ); - - $Opt{'epoch'} && ($Dat{'date-format'} = "epoch"); - $Opt{'short-date'} && ($Dat{'date-format'} = "short"); - - if ($Opt{'save-to-file'} ne "\n") { - push(@first_lines, $_); - } - s/^# error // && ($Dat{'error'} = "error"); - s/^# ?// && ($Dat{'error'} = "desc"); - $xml_data = ""; - if (m#^<(e?tp)\b(.*?)>(.*?)\s*$#) { - # gpsml — The main storage format {{{ - my ($Elem, $Props, $Data) = - ( $1, $2, $3); - my $err_str = ($Props =~ /\berr="(.*?)"/) ? $1 : "error"; - $Elem eq "etp" && ($Dat{'error'} = $err_str); - my $Time = ""; - $Data =~ m## && ($Time = $1); - $Time =~ s{ - (\d\d\d\d)-?(\d\d)-?(\d\d)[T ](\d\d):?(\d\d):?([\d\.]+?)Z - } { - ($Dat{'year'}, $Dat{'month'}, $Dat{'day'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}) = - ( $1, $2, $3, - $4, $5, $6); - ""; - }ex; - $Data =~ m#($DIGIT*?)# && ($Dat{'lat'} = $1); - $Data =~ m#($DIGIT*?)# && ($Dat{'lon'} = $1); - $Data =~ m#($DIGIT*?)# && ($Dat{'ele'} = $1); - $Data =~ m#(.*?)# && ($Dat{'desc'} = $1); - print_entry(%Dat); - # }}} - } elsif (m#^#) { - $found_move = 1; - } elsif (m#^<(title|pause)\b.*?>(.*?)#) { - $Dat{'what'} = $1; - $Dat{$1} = $2; - print_entry(%Dat); - } elsif (m#^(.*$)#s) { - $Dat{'what'} = "desc"; - my $Txt = $1; - until ($Txt =~ m##s) { - $Txt .= ; - } - $Txt =~ s#^(.*)(.*$)#$1#s; - $Dat{'desc'} = $Txt; - print_entry(%Dat); - } elsif (/); - if (!length($Opt{'output-format'})) { - $Opt{'output-format'} = "gpx"; - print_header(*STDOUT); - } - read_xmlfile($xml_data); - last; - } elsif (/^move$/) { - $found_move = 1; - } elsif (m#^(\d+)\t($DIGIT+)\t($DIGIT+)\t($DIGIT)#) { - # CSV format, epoch style {{{ - my ($ep_time, $lon_val, $lat_val, $Alt) = - ( $1, $2, $3, $4); - $Dat{'epoch'} = $ep_time; - ($Dat{'sec'}, $Dat{'min'}, $Dat{'hour'}, - $Dat{'day'}, $Dat{'month'}, $Dat{'year'}, - $Dat{'wday'}, $Dat{'yday'}) = gmtime($ep_time); - $Dat{'month'}++; # Urgh Ⅰ - $Dat{'year'} += 1900; # Urgh Ⅱ - print_entry(%Dat); - # }}} - } elsif ( - m{^ - (\d\d\d\d)-?(\d\d)-?(\d\d)[T\ ](\d\d):?(\d\d):?(\d\d)Z?\t - ($DIGIT+)\t($DIGIT+)\t($DIGIT) - }x - ) { - # CSV format, human-readable date format {{{ - ($Dat{'year'}, $Dat{'month'}, $Dat{'day'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}, - $Dat{'lon'}, $Dat{'lat'}, $Dat{'ele'}) = - ($1, $2, $3, - $4, $5, $6, - $7, $8, $9); - print_entry(%Dat); - # }}} - } elsif (/^Trackpoint\t/) { - # Trackpoint\tN60.41630 E5.31675\t09.02.2006 20:24:37 (UTC)\t13.6 m\t\t93.9 m\t00:00:06\t56 kph\t123° true {{{ - # - # Trackpoint\t - # N60.41630 E5.31675\t - # 09.02.2006 20:24:37 (UTC)\t - # 13.6 m\t - # \t - # 93.9 m\t - # 00:00:06\t - # 56 kph\t - # 123° true - my $Orig = $_; - $Orig =~ s/[\r\n]+$//; - my ($Marker_f, $Position_f, $Time_f, $Alt_f, $Depth_f, - $Leglength_f, $Legtime_f, $Legspeed_f, $Legcourse_f) = - split(/\t/, $Orig . - # Nødløsning for å unngå at variabler - # blir udefinert. - "\t\t\t\t\t\t\t\t\t\t" - ); - D(join("", - "Position_f=\"$Position_f\" \x7B\x7B\x7B\n", - "Time_f=\"$Time_f\"\n", - "Alt_f=\"$Alt_f\"\n", - "Depth_f=\"$Depth_f\"\n", - "Leglength_f=\"$Leglength_f\"\n", - "Legtime_f=\"$Legtime_f\"\n", - "Legspeed_f=\"$Legspeed_f\"\n", - "Legcourse_f=\"$Legcourse_f\" \x7D\x7D\x7D\n", - )); - my ($NS, $WE, - $Alt_unit, - $Leglength, - $Legtime_hour, $Legtime_min, $Legtime_sec, - $Legspeed, $Legspeed_unit, - $Legcourse - ) = ("", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", ""); - ($Position_f =~ /^(N|S)([\d\.]+) (W|E)([\d\.]+)/) && - ($NS = $1, $Dat{'lat'} = $2, $WE = $3, $Dat{'lon'} = $4); - ($Time_f =~ /^(\d+)\.(\d+)\.(\d+) (\d+):(\d+):(\d+) \((.+?)\)/) && - ($Dat{'day'} = $1, $Dat{'month'} = $2, $Dat{'year'} = $3, - $Dat{'hour'} = $4, $Dat{'min'} = $5, $Dat{'sec'} = $6); - ($Alt_f =~ /^($DIGIT+) (.*?)/) && - ($Dat{'ele'} = $1, $Alt_unit = $2); - D("ele = \"$Dat{'ele'}\""); - ($NS eq "S") && ($Dat{'lat'} = 0-$Dat{'lat'}); - ($WE eq "W") && ($Dat{'lon'} = 0-$Dat{'lon'}); - # MapSource in win xp writes YYYY, but YY in win98se. - ( - defined($Dat{'year'}) - && $Dat{'year'} =~ /\d/ - && $Dat{'year'} < 1900 - ) && ($Dat{'year'} += 2000); - print_entry(%Dat); - # }}} - } elsif (/^Track\t(.*?)\t/) { - $Dat{'title'} = txt_to_xml($1); - $Dat{'what'} = "title"; - $found_move = 1; - print_entry(%Dat); - } elsif ( - m{^ - T\t - (\d\d)/(\d\d)/(\d\d\d\d)\ (\d\d):(\d\d):(\d\d)\t - (.+)\xB0(.+)'(.+)"\t - (.+)\xB0(.+)'(.+)" - }x - ) { - # T 09/01/2002 11:51:26 60°23'36.3" 5°19'35.9" {{{ - my ($lat_d, $lat_m, $lat_s, $lon_d, $lon_m, $lon_s); - ($Dat{'month'}, $Dat{'day'}, $Dat{'year'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}, - $lat_d, $lat_m, $lat_s, - $lon_d, $lon_m, $lon_s) = - ($1, $2, $3, - $4, $5, $6, - $7, $8, $9, - $10, $11, $12); - my $Flat = defined($Round{'lat'}) ? ".$Round{'lat'}" : ""; - my $Flon = defined($Round{'lon'}) ? ".$Round{'lon'}" : ""; - $Dat{'lat'} = sprintf("%${Flat}f", - 1.0*($lat_d+($lat_m/60)+($lat_s/3600))); - $Dat{'lon'} = sprintf("%${Flon}f", - 1.0*$lon_d+($lon_m/60)+($lon_s/3600)); - print_entry(%Dat); - # }}} - } elsif ( - m{^ - 1\ (\S+)\ (\S+)\ (\S+)\ (\S+)\x20 - (\d\d)/(\d\d)/(\d\d\d\d)\ (\d\d):(\d\d):(\d\d) - }x - ) { - # 1 60.3938222 5.3238754 17.3 0 09/01/2002 14:18:23 {{{ - ($Dat{'lat'}, $Dat{'lon'}, $Dat{'speed'}, - $Dat{'unkn'}, - $Dat{'month'}, $Dat{'day'}, $Dat{'year'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}) = - ($1, $2, $3, - $4, - $5, $6, $7, - $8, $9, $10); - print_entry(%Dat); - # }}} - } elsif (/^ - # @020721221336N6048353E00701826S015-00001E4859N1673U0000 {{{ - # Regexp {{{ - (@) # @ - (\d\d) # Year - (\d\d) # Month - (\d\d) # Day - (\d\d) # Hours - (\d\d) # Minutes - (\d\d) # Seconds - ([NS]) # N|S - (\d\d) # Latitude degree - (\d\d) # Latitude minute - (\d\d\d) # Latitude minute decimals - ([EW]) # E|W - (\d\d\d) # Longitude degree - (\d\d) # Longitude minute - (\d\d\d) # Longitude minute degree - (....) # Accurancy - (......) # Elevation - (...............) - # }}} - /x) { - my ($NS, $EW, $lat_deg, $lat_degmin, $lat_mindec, $lon_deg, - $lon_degmin, $lon_mindec); - ($Dat{'year'}, $Dat{'month'}, $Dat{'day'}, $Dat{'hour'}, - $Dat{'min'}, $Dat{'sec'}, $NS, $lat_deg, - $lat_degmin, $lat_mindec, $EW, - $lon_deg, $lon_degmin, $lon_mindec, - $Dat{'accur'}, $Dat{'ele'}, $Dat{'unknown'}) = - ($2+2000, $3, $4, $5, - $6, $7, $8, $9, - $10, $11, $12, - $13, $14, $15, - $16, $17, $18); - my $ep_time = timegm_nocheck( - $Dat{'sec'}, $Dat{'min'}, $Dat{'hour'}, - $Dat{'day'}, $Dat{'month'}-1, $Dat{'year'} - ); - $last_time = $ep_time; - my $Flat = defined($Round{'lat'}) ? ".$Round{'lat'}" : ""; - my $Flon = defined($Round{'lon'}) ? ".$Round{'lon'}" : ""; - my $tmp_lon = sprintf( - "%${Flon}f", - $lon_deg + - $lon_degmin/60 + - $lon_mindec/60000); - my $tmp_lat = sprintf("%${Flat}f", - $lat_deg + - $lat_degmin/60 + - $lat_mindec/60000); - ($NS eq "S") && ($tmp_lat = 0-$tmp_lat); - ($EW eq "W") && ($tmp_lon = 0-$tmp_lon); - $Dat{'lat'} = $tmp_lat; - $Dat{'lon'} = $tmp_lon; - print_entry(%Dat); - # }}} - } elsif (/^(@)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(_{42})/) { - # @020721221336__________________________________________ {{{ - ($Dat{'year'}, $Dat{'month'}, $Dat{'day'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}, $Dat{'rest'}) = - ($2+2000, $3, $4, - $5, $6, $7, $8); - $Dat{'error'} = "nosignal"; - print_entry(%Dat); - # }}} - } elsif (/^xmaplog /) { - # NOP - } elsif (/^$/) { - ($Opt{'output-format'} eq "csv") - && ($Opt{'save-to-file'} eq "\n") - && print("\n"); - } elsif (/^Pause: /) { - # NOP, is here to cope with old files I’ve lying around. - } elsif ($Dat{'error'} eq "desc") { - my $Comment = $_; - if (defined($Comment)) { - $Comment =~ s/^\s*(.*?)\s*$/$1/; - if ($Opt{'output-format'} eq "gpsml") { - $Dat{'desc'} = txt_to_xml($Comment); - $Dat{'what'} = "desc"; - print_entry(%Dat); - } - } - } else { - $Opt{'verbose'} && warn("Line $.: Unknown: \"$_\"\n"); - } - } - # }}} - } else { - warn("$progname: $curr_file: Cannot open file for read: $!\n"); - } - # }}} -} - -print_footer(*STDOUT); - -exit(0); - -sub read_xmlfile { - # {{{ - my $Txt = join("", @_); - $Txt =~ s///gs; - $Txt =~ s#(.*?)#print_gpx($1)#gse; - # }}} -} - -sub print_gpx { - # {{{ - my $Orig = shift; - my $Str = $Orig; - # D("print_xml_gps(\"$Orig\")\n"); - $Str =~ s///gs; - my $fromdate_str = ""; - if ($Opt{'from-date'}) { - $fromdate_str = "date >= '$Opt{'from-date'}' AND "; - } - if ($Opt{'output-format'} =~ /^(pgwtab|pgwupd)$/) { - # {{{ - $Str =~ - s{ - (.*?) - } - { - my $attr_wpt = $1; - my $el_wpt = $2; - my ($Lat, $Lon, $Name, $Ele, $Type, $Time, $Cmt, $Desc, $Src, $Sym) = - ('\N', '\N', '\N', '\N', '\N', '\N', '\N', '\N', '\N', '\N'); - - $attr_wpt =~ /.*lat="($DIGIT+?)"/s && - ($Lat = postgresql_copy_safe($1)); - $attr_wpt =~ /.*lon="($DIGIT+?)"/s && - ($Lon = postgresql_copy_safe($1)); - $el_wpt =~ /.*(.*?)<\/name>/s && - ($Name = postgresql_copy_safe(xml_to_txt($2))); - $el_wpt =~ /.*(.*?)<\/ele>/s && - ($Ele = postgresql_copy_safe(xml_to_txt($2))); - $el_wpt =~ /.*(.*?)<\/type>/s && - ($Type = postgresql_copy_safe(xml_to_txt($2))); - $el_wpt =~ /.*(.*?)<\/time>/s && - ($Time = postgresql_copy_safe(xml_to_txt($2))); - $el_wpt =~ /.*(.*?)<\/cmt>/s && - ($Cmt = postgresql_copy_safe(xml_to_txt($2))); - $el_wpt =~ /.*(.*?)<\/desc>/s && - ($Desc = postgresql_copy_safe(xml_to_txt($2))); - $el_wpt =~ /.*(.*?)<\/src>/s && - ($Src = postgresql_copy_safe(xml_to_txt($2))); - $el_wpt =~ /.*(.*?)<\/sym>/s && - ($Sym = postgresql_copy_safe(xml_to_txt($2))); - - if (length($Opt{'round'})) { - if (defined($Round{'lat'}) && length($Lat)) { - ($Lat = 1.0 * sprintf("%.$Round{'lat'}f", $Lat)); - } - if (defined($Round{'lon'}) && length($Lon)) { - ($Lon = 1.0 * sprintf("%.$Round{'lon'}f", $Lon)); - } - if (defined($Round{'ele'}) && $Ele ne '\N') { - ($Ele = 1.0 * sprintf("%.$Round{'ele'}f", $Ele)); - } - } - - if ($Opt{'output-format'} eq "pgwtab") { - print( - join("\t", - "($Lat,$Lon)", - $Name, - $Ele, - $Type, - $Time, - $Cmt, - $Desc, - $Src, - $Sym - ) . "\n" - ); - } elsif ($Opt{'output-format'} eq "pgwupd") { - $Name =~ s/'/''/gs; - print(join("\n", - "BEGIN;", - "$Spc${Spc}UPDATE logg SET sted = clname(coor) " . - "WHERE $fromdate_str(point($Lat,$Lon) <-> coor) < 0.05;", - "$Spc${Spc}UPDATE logg SET dist = cldist(coor) " . - "WHERE $fromdate_str(point($Lat,$Lon) <-> coor) < 0.05;", - "COMMIT;" - ) . "\n"); - } - ""; - }gsex; - # }}} - } else { - # {{{ - $Str =~ - s{ - (.*?) - } - { - my $el_trk = $2; - $el_trk =~ - s{ - (.*?)
- }{ - my %tmp_dat = (); - $tmp_dat{'title'} = $2; - $tmp_dat{'what'} = "title"; - $tmp_dat{'error'} = ""; - print_entry(%tmp_dat); - ""; - }sex; - $el_trk =~ - s{ - (.*?) - } - { - my $el_trkseg = $2; - $el_trkseg =~ - s{ - (.*?) - } - { - my ($attr_trkpt, $el_trkpt) = - ( $1, $2); - %Dat = ( - 'year' => '', 'month' => '', 'day' => '', - 'hour' => '', 'min' => '', 'sec' => '', - 'epoch' => '', - 'date-format' => '', - 'lat' => '', 'lon' => '', - 'ele' => '', - 'desc' => '', - 'error' => "", - 'what' => 'tp', - ); - ($attr_trkpt =~ /\blon="(.*?)"/) && ($Dat{'lon'} = $1); - ($attr_trkpt =~ /\blat="(.*?)"/) && ($Dat{'lat'} = $1); - ($el_trkpt =~ m#(.*?)#) && ($Dat{'ele'} = $1); - if ( - $el_trkpt =~ - m{ - - }x - ) { - ($Dat{'year'}, $Dat{'month'}, $Dat{'day'}, - $Dat{'hour'}, $Dat{'min'}, $Dat{'sec'}) = - ($1, $2, $3, $4, $5, $6); - } - print_entry(%Dat); - ""; - }gsex; - $found_move = 1; - }gsex; - $found_move = 1; - }gsex; - # }}} - } - # }}} -} - -sub print_header { - # {{{ - local *OutFP = shift; - if ($Opt{'output-format'} eq "gpsml") { - print(OutFP join("", - "\n", - "\n", - "\n", - )); - } elsif ($Opt{'output-format'} eq "gpstrans") { - print(OutFP "Format: DMS UTC Offset: 0.00 hrs " . - "Datum[100]: WGS 84\n"); - } elsif ($Opt{'output-format'} eq "gpx") { - print(OutFP join("", - qq{\n}, - qq{\n}, - qq{$Spc$Spc\n}, - qq{$Spc$Spc$Spc$Spc\n}, - )); - } elsif ($Opt{'output-format'} eq "ps") { - print(OutFP ps_header(532, 6034, 533, 6040)); - print(OutFP "*u\n"); - } elsif ($Opt{'output-format'} eq "svg") { - print(OutFP join("", - "\n", - "\n", - "\n", - "$Spc$Spc\n", - "$Spc$Spc\n", - )); - } - # }}} -} - -sub print_footer { - # Print footer {{{ - local *OutFP = shift; - if ($Opt{'output-format'} eq "gpsml") { - print(OutFP join("", - "\n", - "\n", - )); - } elsif ($Opt{'output-format'} eq "gpx") { - print(OutFP join("", - "$Spc$Spc$Spc$Spc\n", - "$Spc$Spc\n", - "\n", - )); - } elsif ($Opt{'output-format'} eq "poscount") { - while (my ($l_name, $l_val) = each %Poscount) { - $l_name =~ /^(.+?),(.+?)$/ - && print(OutFP "$1\t$2\t$l_val\n"); - } - } elsif ($Opt{'output-format'} eq "ps") { - print(OutFP join("", - "*U\n", - "%%Trailer\n", - "%%EOF\n", - )); - } elsif ($Opt{'output-format'} eq "svg") { - print(OutFP "\"/>\n\n"); - } - # }}} -} - -sub print_entry { - # Print a GPS entry with time, latitude, longitude and elevation in - # various formats - # {{{ - my %Dat = @_; - defined($Dat{'desc'}) || ($Dat{'desc'} = ""); - defined($Dat{'ele'}) || ($Dat{'ele'} = ""); - defined($Dat{'lat'}) || ($Dat{'lat'} = ""); - defined($Dat{'lon'}) || ($Dat{'lon'} = ""); - defined($Dat{'year'}) || ($Dat{'year'} = ""); - my $print_time = length($Dat{'year'}) ? 1 : 0; - my $print_pos; - if (!$Req{'position'} && $Opt{'output-format'} eq "gpsml") { - $print_pos = (length($Dat{'lat'}) || length($Dat{'lon'})) ? 1 : 0; - } else { - $print_pos = (length($Dat{'lat'}) && length($Dat{'lon'})) ? 1 : 0; - } - if (!$print_pos) { - $Dat{'lat'} = $Dat{'lon'} = ""; - } - my $print_ele = length($Dat{'ele'}) ? 1 : 0; - my $print_desc = length($Dat{'desc'}) ? 1 : 0; - my $Line = ""; - D("print_entry(\"" . join("\", \"", @_) . "\");"); - my $ep_time; - - if ($Opt{'near'} && $print_pos) { - $Line .= sprintf("%s ", - list_nearest_waypoints($Dat{'lat'}, $Dat{'lon'})); - } - - if (length($Opt{'round'})) { - for my $Tmp (qw{ lat lon ele }) { - if (defined($Round{$Tmp}) && length($Dat{$Tmp})) { - D("Tmp = '$Tmp'"); - ($Dat{$Tmp} = 1.0 * sprintf("%.$Round{$Tmp}f", $Dat{$Tmp})); - } - } - } - - if ($Opt{'output-format'} eq "poscount") { - if (!length($Dat{'error'})) { - my $Name = "$Dat{'lon'},$Dat{'lat'}"; - defined($Poscount{$Name}) || ($Poscount{$Name} = 0); - $Poscount{$Name}++; - } - return; - } - - if ($print_time) { - $ep_time = timegm_nocheck( - $Dat{'sec'}, $Dat{'min'}, $Dat{'hour'}, - $Dat{'day'}, $Dat{'month'} - 1, $Dat{'year'} - ); - if ($Opt{'time-shift'}) { - D("ep_time før: '$ep_time'"); - $ep_time += $Opt{'time-shift'}; - D("ep_time etter: '$ep_time'"); - ($Dat{'sec'}, $Dat{'min'},$Dat{'hour'}, $Dat{'day'}, - $Dat{'month'}, $Dat{'year'}) = gmtime($ep_time); - $Dat{'year'} += 1900; - $Dat{'month'}++; - } - $Dat{'epoch'} = $ep_time; - $Dat{'year'} = sprintf("%04u", $Dat{'year'}); - $Dat{'month'} = sprintf("%02u", $Dat{'month'}); - $Dat{'day'} = sprintf("%02u", $Dat{'day'}); - $Dat{'hour'} = sprintf("%02u", $Dat{'hour'}); - $Dat{'min'} = sprintf("%02u", $Dat{'min'}); - $Dat{'sec'} = sprintf("%02u", $Dat{'sec'}); - if ($Opt{'chronology'}) { - if ($last_time > $ep_time && !length($Dat{'error'})) { - warn(sprintf( - "%s: $curr_file: \"%sZ\": Next date is %s in the past (%sZ)\n", - $progname, sec_to_string($last_time, "T"), - sec_to_readable($last_time-$ep_time), - sec_to_string($ep_time, "T") - )); - # FIXME: Make --fix work with gpx. - if ($Opt{'fix'} && ($Opt{'output-format'} !~ /^gpx$/)) { - $Dat{'error'} = "chrono"; - } - } elsif ($last_time == $ep_time && !length($Dat{'error'})) { - warn(sprintf( - "%s: $curr_file: \"%sZ\": Duplicated time\n", - $progname, sec_to_string($last_time, "T") - )); - # FIXME: Make --fix work with gpx. - if ($Opt{'fix'} && ($Opt{'output-format'} !~ /^gpx$/)) { - $Dat{'error'} = "duptime"; - } - } - } - } else { - $ep_time = 0; - $Dat{'year'} = 0; - $Dat{'month'} = 0; - $Dat{'day'} = 0; - $Dat{'hour'} = 0; - $Dat{'min'} = 0; - $Dat{'sec'} = 0; - } - - if ($Opt{'save-to-file'} ne "\n") { - # {{{ - $print_time || return; - my $base_name = "$Dat{'year'}$Dat{'month'}$Dat{'day'}T" . - "$Dat{'hour'}$Dat{'min'}$Dat{'sec'}Z" . - "$Opt{'save-to-file'}"; - my $file_name = $base_name; - if (-e $file_name) { - for (my $a = 1; (-e $file_name) && ($a < 1000); $a++) { - $file_name = "$base_name.dup_$a"; - } - if (-e $file_name) { - die("$progname: $base_name: File already exists, and ran " . - "out of attempts to create unique file name\n"); - } - if ($Opt{'verbose'}) { - warn("$progname: $base_name: File already exists, using " . - "unique name \"$file_name\" instead\n"); - } - } - if (open(ToFP, ">", $file_name)) { - print_header(*ToFP); - print(ToFP ( - $from_stdin - ? @first_lines - : ()), - (length($xml_data) - ? $xml_data - : <>) - ) || die("$progname: $file_name: Cannot write to file: $!\n"); - print_footer(*ToFP); - close(ToFP); - if ($Opt{'output-format'} eq "gpsml") { - printf("%s\n", - txt_to_xml($file_name)); - } elsif ($Opt{'output-format'} eq "gpx") { - printf("\n", - txt_to_xml($file_name)); - } else { - print("$progname: Saved unconverted data to \"$file_name\"\n"); - } - exit 0; - } else { - die("$progname: $file_name: Cannot create file: $!\n"); - } - # }}} - } - - my $pause_len = 0; - my $do_print = 1; - - if ($Dat{'what'} eq "tp") { - # {{{ - if ($Opt{'require'}) { - $Req{'time'} && !$print_time && return; - $Req{'position'} && !$print_pos && return; - $Req{'ele'} && !$print_ele && return; - } - - if ($Opt{'inside'} || $Opt{'outside'}) { - if ( - ($Dat{'lat'} < $lat1) || - ($Dat{'lat'} > $lat2) || - ($Dat{'lon'} < $lon1) || - ($Dat{'lon'} > $lon2) - ) { - $Opt{'inside'} && return; - } else { - $Opt{'outside'} && return; - } - } - - if ($Opt{'output-format'} eq "ps") { - $Dat{'lon'} *= 100; - $Dat{'lat'} *= 100; - } - - if ( - $Opt{'skip-dups'} - && ($Dat{'lon'} eq $last_lon) - && ($Dat{'lat'} eq $last_lat) - ) { - if ($Opt{'output-format'} eq 'gpsml') { - $Dat{'error'} = "dup"; - } else { - $do_print = 0; - } - } else { - $do_print = 1; - } - - if ( - $Opt{'create-breaks'} - && $ep_time-$last_time > $PAUSE_LIMIT - && $last_time - ) { - $pause_len = $ep_time-$last_time; - D("pause_len set to '$pause_len'"); - } - - if ($pause_len) { - if ($Opt{'output-format'} eq "gpsml") { - $Line .= sprintf("%s\n", - sec_to_readable($ep_time-$last_time)); - } elsif ($Opt{'output-format'} eq "clean") { - $pause_len && ($Line .= "\n"); - } elsif ($Opt{'output-format'} eq "csv") { - $Line .= sprintf("# Pause: %s\n# move\n", - sec_to_readable($ep_time-$last_time)); - } elsif ($Opt{'output-format'} eq "xgraph") { - $pause_len && ($Line .= "move "); - } - } - # }}} - } - - if ($do_print) { - # Valid data was found, send to stdout {{{ - unless ($first_time) { - $first_time = $ep_time; - } - if ($Opt{'double-y-scale'} && length($Dat{'lat'})) { - $Dat{'lat'} *= 2; - } - if ($Opt{'output-format'} eq "gpsml") { - if ($Dat{'what'} eq "tp") { - $Dat{'format'} = "gpsml"; - $Line .= trackpoint(%Dat); - } elsif ($Dat{'what'} =~ /^(pause|desc|title)$/) { - $Line .= sprintf("<%s>%s\n", - $1, - $Dat{$1}, - $1); - } - } elsif ($Opt{'output-format'} eq "pgtab") { - if ($Dat{'what'} eq "tp" && !length($Dat{'error'})) { - $Dat{'format'} = "pgtab"; - $Line .= trackpoint(%Dat); - } - } elsif ($Opt{'output-format'} eq "xgraph") { - if ($print_pos && !length($Dat{'error'})) { - $Dat{'format'} = "xgraph"; - $Line .= trackpoint(%Dat); - } - } elsif($Opt{'output-format'} eq "gpstrans") { - if ($print_pos && !length($Dat{'error'})) { - $Dat{'format'} = "gpstrans"; - $Line .= trackpoint(%Dat); - } - } elsif($Opt{'output-format'} eq "gpx") { - if ($Dat{'what'} eq "tp") { - $Dat{'format'} = "gpx"; - $Line .= trackpoint(%Dat); - } - } elsif ($Opt{'output-format'} eq "clean") { - if ($Dat{'what'} eq "tp" && !length($Dat{'error'})) { - $Dat{'format'} = "clean"; - $Line .= trackpoint(%Dat); - } - } elsif ($Opt{'output-format'} eq "ps") { - $Line .= ( - $pause_len - ? "f\n$Dat{'lon'} $Dat{'lat'} m\n" - : "$Dat{'lon'} $Dat{'lat'} l\n" - ); - } elsif ($Opt{'output-format'} eq "svg") { - $Line .= ( - ($last_lon == 1000) || $pause_len - ? join("", - "$svg_start_thing\n"; - } - $found_move = 0; - } - print($Line); - } - $print_time && ($last_time = $ep_time); - if ($print_pos) { - $last_lon = $Dat{'lon'}; - $last_lat = $Dat{'lat'}; - } - $last_line = $data_line; - $svg_start_thing = "\"/>\n"; - # }}} -} - -sub ps_header { - # Send a Postscript header to stdout {{{ - my ($bl_lon, $bl_lat, $br_lon, $br_lat) = @_; - my $Date = sec_to_string(time); - return(join("", - "%!PS-Adobe-3.0 EPSF-3.0\n", - "%%Creator: $rcs_id\n", - "%%Title:\n", - "%%CreationDate: $Date\n", - "%%BoundingBox: $bl_lon $bl_lat $br_lon $br_lat\n", - "%%DocumentData: Clean7Bit\n", - "%%EndComments\n", - "%%BeginProlog\n", - "/bd { bind def } bind def\n", - "/incompound false def\n", - "/m { moveto } bd\n", - "/l { lineto } bd\n", - "/c { curveto } bd\n", - "/F { incompound not {fill} if } bd\n", - "/f { closepath F } bd\n", - "/S { stroke } bd\n", - "/*u { /incompound true def } bd\n", - "/*U { /incompound false def f} bd\n", - "/k { setcmykcolor } bd\n", - "/K { k } bd\n", - "%%EndProlog\n", - "%%BeginSetup\n", - "%%EndSetup\n", - )); - # }}} -} - -sub print_version { - # Print program version {{{ - for (@main::version_array) { - print("$_\n"); - } - # }}} -} # print_version() - -sub usage { - # Send the help message to stdout {{{ - my $Retval = shift; - - if ($Opt{'verbose'}) { - print("\n"); - print_version(); - } - print(<= $verbose_level) { - print(STDERR "$progname: $Txt\n"); - } - # }}} -} # msg() - -__END__ - -# Law talk {{{ -# Copyleft © Øyvind A. Holm -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -# USA -# }}} - -# vim: set fenc=UTF-8 ft=perl fdm=marker ts=4 sw=4 sts=4 et fo+=w : -# End of file $Id$ diff --git a/branches/gpst.postgis/gpst-pic b/branches/gpst.postgis/gpst-pic deleted file mode 100755 index 10f873f..0000000 --- a/branches/gpst.postgis/gpst-pic +++ /dev/null @@ -1,399 +0,0 @@ -#!/usr/bin/perl -w - -#======================================================================= -# $Id$ -# Extract EXIF data from pictures for use with COPY in Postgres -# -# Character set: UTF-8 -# ©opyleft 2008– Øyvind A. Holm -# License: GNU General Public License version 2 or later, see end of -# file for legal stuff. -#======================================================================= - -BEGIN { - our @version_array; -} - -use strict; -use Getopt::Long; - -BEGIN { - push(@INC, "$ENV{'HOME'}/bin/src/gpstools"); - our @version_array; -} - -use GPST; -use GPSTxml; - -$| = 1; - -our $Debug = 0; -our $NA = '\N'; -our %Std = ( - - 'output-format' => 'pgtab', - 'timezone' => '', - -); -our %Opt = ( - - 'author' => '', - 'debug' => 0, - 'description' => '', - 'help' => 0, - 'output-format' => $Std{'output-format'}, - 'strip-whitespace' => 0, - 'timezone' => $Std{'timezone'}, - 'verbose' => 0, - 'version' => 0, - -); - -our $progname = $0; -$progname =~ s/^.*\/(.*?)$/$1/; - -my $rcs_id = '$Id$'; -my $id_date = $rcs_id; -$id_date =~ s/^.*?\d+ (\d\d\d\d-.*?\d\d:\d\d:\d\d\S+).*/$1/; - -push(@main::version_array, $rcs_id); - -Getopt::Long::Configure("bundling"); -GetOptions( - - "author|a=s" => \$Opt{'author'}, - "debug" => \$Opt{'debug'}, - "description|d=s" => \$Opt{'description'}, - "help|h" => \$Opt{'help'}, - "output-format|o=s" => \$Opt{'output-format'}, - "strip-whitespace|w" => \$Opt{'strip-whitespace'}, - "timezone|T=s" => \$Opt{'timezone'}, - "verbose|v+" => \$Opt{'verbose'}, - "version" => \$Opt{'version'}, - -) || die("$progname: Option error. Use -h for help.\n"); - -$Opt{'debug'} && ($Debug = 1); -$Opt{'help'} && usage(0); -if ($Opt{'version'}) { - print_version(); - exit(0); -} - -$GPST::Spc = $Opt{'strip-whitespace'} ? "" : " "; -my $Spc = $GPST::Spc; # FIXME -my $tz_str = ""; -if (length($Opt{'timezone'})) { - if ($Opt{'timezone'} =~ /^[\+\-][0-2][0-9]{3}$/) { - $tz_str = $Opt{'timezone'}; - } elsif ($Opt{'timezone'} =~ /^z$/i) { - $tz_str = $Opt{'timezone'}; - } elsif ($Opt{'timezone'} =~ /^[a-z]+$/i) { - $tz_str = " $Opt{'timezone'}"; - } else { - die("$progname: $Opt{'timezone'}: Invalid time zone\n"); - } -} - -if ($Opt{'output-format'} eq "xml") { - print("\n\n"); -} - -if ($#ARGV < 0) { - while (<>) { - chomp(); - print_entry($_); - } -} else { - for my $fname (@ARGV) { - print_entry($fname); - } -} - -if ($Opt{'output-format'} eq "xml") { - print("\n"); -} - -sub print_entry { - # {{{ - my $filename = shift; - my $Retval = 0; - my ($date, $coor) = - ( '', ''); - my @Dates = (); - local *PicFP; - D("filename = '$filename'"); - if (open(PicFP, "exifprobe -L \"$filename\" |")) { # FIXME: Quick & Dirty™ - while () { - if (/DateTime/) { - s/^.*'(.*?)'.*$/$1/; - chomp($date = $_); - $date =~ s/^(\d\d\d\d)(.)(\d\d)(.)(\d\d)(.)(\d\d:\d\d:\d\d)(.*)/$1-$3-${5}T$7$8/; - D("date = '$date'"); - push(@Dates, $date); - } - } - close(PicFP); - @Dates = reverse sort @Dates; - $date = $Dates[0]; - defined($date) || ($date = ''); - D("final date = '$date'"); - if ($date =~ /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d$/) { - $filename =~ s/^.*\/(.*?)$/$1/; - my $Output = ""; - if ($Opt{'output-format'} eq "xml") { - if (length("$filename$date")) { - $Output = join("", - "$Spc$Spc\n", - length($filename) - ? sprintf("$Spc$Spc$Spc$Spc%s\n", - txt_to_xml($filename)) - : "", - length($date) - ? sprintf("$Spc$Spc$Spc$Spc%s\n", - txt_to_xml($date)) - : "", - "$Spc$Spc\n", - ); - } - } elsif ($Opt{'output-format'} eq "pgtab") { - # Version information {{{ - # Without version field (same as version 1): - # date \t - # "(lat,lon)"-coordinates \t - # description \t - # filename \t - # author \t - # Version 1: - # "1" \t - # date \t - # "(lat,lon)"-coordinates \t - # description \t - # filename \t - # author \n - # }}} - $Output = pgtab_entry( - 1, # Version number - $date, - $coor, - $Opt{'description'}, - $filename, - $Opt{'author'} - ); - } else { - die("$progname: $Opt{'output-format'}: Unknown output format\n"); - } - print($Output); - $Opt{'verbose'} && print(STDERR $Output); - } else { - if (length($date)) { - warn("$filename: $date: Invalid date format"); - $Retval = 2; - } - } - } else { - warn("$filename: Cannot open exifprobe(1) pipe: $!"); - $Retval = 1; - } - return($Retval); - # }}} -} # print_entry() - -sub pgtab_entry { - # {{{ - my ($Version, $Date, $Coor, $Descr, $Filename, $Author) = @_; - defined($Date) || ($Date = $NA); - defined($Coor) || ($Coor = $NA); - defined($Descr) || ($Descr = $NA); - defined($Filename) || ($Filename = $NA); - defined($Author) || ($Author = $NA); - my $Retval = ""; - if ($Version == 1) { - $Retval = join("\t", - 1, # Version number - postgresql_copy_safe($Date) . $tz_str, - length($Coor) - ? postgresql_copy_safe($Coor) - : $NA, - length($Opt{'description'}) - ? postgresql_copy_safe($Opt{'description'}) - : $NA, - length($Filename) - ? postgresql_copy_safe($Filename) - : $NA, - length($Opt{'author'}) - ? postgresql_copy_safe($Opt{'author'}) - : $NA - ) . "\n"; - } - return($Retval); - # }}} -} # pgtab_entry() - -sub print_version { - # Print program version {{{ - for (@main::version_array) { - print("$_\n"); - } - # }}} -} # print_version() - -sub usage { - # Send the help message to stdout {{{ - my $Retval = shift; - - if ($Opt{'verbose'}) { - print("\n"); - print_version(); - } - print(<= $verbose_level) { - print(STDERR "$progname: $Txt\n"); - } - # }}} -} # msg() - -sub D { - # Print a debugging message {{{ - $Debug || return; - my @call_info = caller; - chomp(my $Txt = shift); - my $File = $call_info[1]; - $File =~ s#\\#/#g; - $File =~ s#^.*/(.*?)$#$1#; - print(STDERR "$File:$call_info[2] $$ $Txt\n"); - return(""); - # }}} -} # D() - -__END__ - -# Plain Old Documentation (POD) {{{ - -=pod - -=head1 NAME - - - -=head1 REVISION - -$Id$ - -=head1 SYNOPSIS - - [options] [file [files [...]]] - -=head1 DESCRIPTION - - - -=head1 OPTIONS - -=over 4 - -=item B<-h>, B<--help> - -Print a brief help summary. - -=item B<-v>, B<--verbose> - -Increase level of verbosity. Can be repeated. - -=item B<--version> - -Print version information. - -=item B<--debug> - -Print debugging messages. - -=back - -=head1 BUGS - - - -=head1 AUTHOR - -Made by Øyvind A. Holm Ssunny@sunbase.orgE>. - -=head1 COPYRIGHT - -Copyleft © Øyvind A. Holm Esunny@sunbase.orgE -This is free software; see the file F for legalese stuff. - -=head1 LICENCE - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -=head1 SEE ALSO - -=cut - -# }}} - -# vim: set fenc=UTF-8 ft=perl fdm=marker ts=4 sw=4 sts=4 et fo+=w : -# End of file $Id$ diff --git a/branches/gpst.postgis/makemesh b/branches/gpst.postgis/makemesh deleted file mode 100755 index 4b6f34e..0000000 --- a/branches/gpst.postgis/makemesh +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/perl -w - -#======================================================================= -# $Id$ -# Create random 3D surface for use in plotting programs. -# -# Character set: UTF-8 -# ©opyleft 2007– Øyvind A. Holm -# License: GNU General Public License version 2 or later, see end of -# file for legal stuff. -#======================================================================= - -BEGIN { - our @version_array; -} - -use strict; -use Getopt::Long; - -$| = 1; - -our $Debug = 0; - -our %Opt = ( - - 'debug' => 0, - 'help' => 0, - 'max' => 1000, - 'min' => 0, - 'verbose' => 0, - 'version' => 0, - -); - -our $progname = $0; -$progname =~ s/^.*\/(.*?)$/$1/; - -my $rcs_id = '$Id$'; -my $id_date = $rcs_id; -$id_date =~ s/^.*?\d+ (\d\d\d\d-.*?\d\d:\d\d:\d\d\S+).*/$1/; - -push(@main::version_array, $rcs_id); - -Getopt::Long::Configure("bundling"); -GetOptions( - - "debug" => \$Opt{'debug'}, - "help|h" => \$Opt{'help'}, - "max=f" => \$Opt{'max'}, - "min=f" => \$Opt{'min'}, - "verbose|v+" => \$Opt{'verbose'}, - "version" => \$Opt{'version'}, - -) || die("$progname: Option error. Use -h for help.\n"); - -$Opt{'debug'} && ($Debug = 1); -$Opt{'help'} && usage(0); -if ($Opt{'version'}) { - print_version(); - exit(0); -} - -my ($Lat, $Lon) = - ( 0, 0); - -my @Ele = (); - -my $Size = 20; - -while (1) { - D("Lon = '$Lon'"); - for $Lon (0..$Size) { - my $Left = defined($Ele[$Lat][$Lon-1]) ? $Ele[$Lat][$Lon-1] : rand(1); - my $Right = defined($Ele[$Lat][$Lon+1]) ? $Ele[$Lat][$Lon+1] : rand(1); - my $Over = defined($Ele[$Lat+1][$Lon]) ? $Ele[$Lat+1][$Lon] : rand(1); - my $Under = defined($Ele[$Lat-1][$Lon]) ? $Ele[$Lat-1][$Lon] : rand(1); - my $Curr = ($Left+$Right+$Over+$Under)/4; - $Curr += rand(1) >= 0.5 ? rand(1) : 0-rand(1); - # until ($Curr >= $Opt{'min'}) { - # D("Curr >= Min"); - # $Curr += rand(1) * 1.0; - # } - # until ($Curr <= $Opt{'max'}) { - # D("Curr <= Max"); - # $Curr -= rand(1) * 1.0; - # } - if ($Lat > 0 && $Lat < $Size && $Lon > 0 && $Lon < $Size) { - # print("$Lat\t$Lon\t$Curr\n"); - # print($Lat . "\t" . $Lon-1 . "\t" . $Left . "\n"); - print($Lat . "\t" . $Lon . "\t" . $Curr . "\n"); - # print("\n"); - print($Lat+1 . "\t" . $Lon . "\t" . $Over . "\n"); - print($Lat . "\t" . $Lon . "\t" . $Curr . "\n"); - # print("\n"); - # print($Lat . "\t" . $Lon+1 . "\t" . $Right . "\n"); - print($Lat . "\t" . $Lon . "\t" . $Curr . "\n"); - # print("\n"); - print($Lat-1 . "\t" . $Lon . "\t" . $Under . "\n"); - print($Lat . "\t" . $Lon . "\t" . $Curr . "\n"); - # print("\n"); - } - $Ele[$Lat][$Lon] = $Curr; - print("\n"); - } - $Lat += 1; - last if ($Lat > $Size); -} - -sub print_version { - # Print program version {{{ - for (@main::version_array) { - print("$_\n"); - } - # }}} -} # print_version() - -sub usage { - # Send the help message to stdout {{{ - my $Retval = shift; - - if ($Opt{'verbose'}) { - print("\n"); - print_version(); - } - print(<= $verbose_level) { - print(STDERR "$progname: $Txt\n"); - } - # }}} -} # msg() - -sub D { - # Print a debugging message {{{ - $Debug || return; - my @call_info = caller; - chomp(my $Txt = shift); - my $File = $call_info[1]; - $File =~ s#\\#/#g; - $File =~ s#^.*/(.*?)$#$1#; - print(STDERR "$File:$call_info[2] $$ $Txt\n"); - return(""); - # }}} -} # D() - -__END__ - -# Plain Old Documentation (POD) {{{ - -=pod - -=head1 NAME - - - -=head1 REVISION - -$Id$ - -=head1 SYNOPSIS - - [options] [file [files [...]]] - -=head1 DESCRIPTION - - - -=head1 OPTIONS - -=over 4 - -=item B<-h>, B<--help> - -Print a brief help summary. - -=item B<-v>, B<--verbose> - -Increase level of verbosity. Can be repeated. - -=item B<--version> - -Print version information. - -=item B<--debug> - -Print debugging messages. - -=back - -=head1 BUGS - - - -=head1 AUTHOR - -Made by Øyvind A. Holm Ssunny@sunbase.orgE>. - -=head1 COPYRIGHT - -Copyleft © Øyvind A. Holm Esunny@sunbase.orgE -This is free software; see the file F for legalese stuff. - -=head1 LICENCE - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -=head1 SEE ALSO - -=cut - -# }}} - -# vim: set fenc=UTF-8 ft=perl fdm=marker ts=4 sw=4 sts=4 et fo+=w : -# End of file $Id$ diff --git a/branches/gpst.postgis/poisync b/branches/gpst.postgis/poisync deleted file mode 100755 index 7f9b0cc..0000000 --- a/branches/gpst.postgis/poisync +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -#======================================================================= -# $Id$ -# For synkronisering av POI og waypoints fra uniten. -#======================================================================= - -gpst -o pgwtab ~/gps/unit/wpdata.gpx ~/gps/poi/trans/*.gpx | psql gps -a -c "TRUNCATE tmpwayp; COPY tmpwayp FROM STDIN;" -psql gps -a -c "UPDATE tmpwayp SET coor = point(round(coor[0]::numeric, 6), round(coor[1]::numeric, 6));" -psql gps -a -c "COPY (SELECT coor, name FROM tmpwayp WHERE type IS NULL ORDER BY coor[0] desc, coor[1]) TO '/tmp/un';" -psql gps -a -c "COPY (SELECT coor, name FROM tmpwayp WHERE type IS NOT NULL ORDER BY coor[0] desc, coor[1]) TO '/tmp/p';" - -if [ "$1" = "-d" ]; then - diff -u /tmp/un /tmp/p -else - vimdiff /tmp/un /tmp/p -fi diff --git a/branches/gpst.postgis/postgres/Patch/floatingpoint-testing.patch b/branches/gpst.postgis/postgres/Patch/floatingpoint-testing.patch deleted file mode 100644 index cd78c0d..0000000 --- a/branches/gpst.postgis/postgres/Patch/floatingpoint-testing.patch +++ /dev/null @@ -1,48 +0,0 @@ -Index: create_views.sql -=================================================================== ---- create_views.sql (revisjon 2221) -+++ create_views.sql (arbeidskopi) -@@ -122,8 +122,20 @@ - -- Lister ut events sammen med loggen. - CREATE OR REPLACE VIEW ev AS - SELECT * FROM ( -+ SELECT 'gps' AS flag, date, (coor[0]::numeric || ',' || coor[1]::numeric)::point as coor, sted || ' (' || dist || ')' AS sted, ele::numeric(8,1), NULL AS descr, avst -+ FROM logg -+ -- UNION ALL -+ -- SELECT 'event' AS flag, date, coor[0] || ',' || coor[1], NULL, NULL, descr AS descr, NULL -+ -- FROM events -+ -- UNION ALL -+ -- SELECT 'pic' AS flag, date, coor[0] || ',' || coor[1], filename, NULL, NULL, NULL -+ -- FROM pictures -+ ) AS u -+ ORDER BY date; -+CREATE OR REPLACE VIEW flev AS -+ SELECT * FROM ( - SELECT 'gps' AS flag, date, coor, sted || ' (' || dist || ')' AS sted, ele::numeric(8,1), NULL AS descr, avst -- FROM logg -+ FROM rsflytting - UNION ALL - SELECT 'event' AS flag, date, coor, NULL, NULL, descr AS descr, NULL - FROM events -@@ -131,7 +143,21 @@ - SELECT 'pic' AS flag, date, coor, filename, NULL, NULL, NULL - FROM pictures - ) AS u -+ WHERE date between '2007-11-01' and '2007-12-01' - ORDER BY date; -+CREATE OR REPLACE VIEW evmer AS -+ SELECT * FROM ( -+ SELECT 'gps' AS flag, date, coor, sted || ' (' || dist || ')' AS sted, ele::numeric(8,1), NULL AS descr, avst -+ FROM rsmerete -+ UNION ALL -+ SELECT 'event' AS flag, date, coor, NULL, NULL, descr AS descr, NULL -+ FROM events -+ UNION ALL -+ SELECT 'pic' AS flag, date, coor, filename, NULL, NULL, NULL -+ FROM pictures -+ ) AS u -+ WHERE date between '2007-11-01' and '2007-12-01' -+ ORDER BY date; - - CREATE OR REPLACE VIEW wp AS - SELECT diff --git a/branches/gpst.postgis/postgres/Patch/wheretype.patch b/branches/gpst.postgis/postgres/Patch/wheretype.patch deleted file mode 100644 index e7f480f..0000000 --- a/branches/gpst.postgis/postgres/Patch/wheretype.patch +++ /dev/null @@ -1,49 +0,0 @@ -Index: create_funcs.sql -=================================================================== ---- create_funcs.sql (revisjon 2216) -+++ create_funcs.sql (arbeidskopi) -@@ -110,6 +110,44 @@ - END; - $$ LANGUAGE plpgsql; - -+DROP TYPE wheretype; -+CREATE TYPE wheretype AS ( -+ date timestamptz, -+ lat numeric(8, 5), -+ lon numeric(8, 5), -+ sted text, -+ dist numeric -+); -+ -+DROP FUNCTION wherepos(timestamptz); -+CREATE OR REPLACE FUNCTION wherepos(currtime timestamptz) RETURNS wheretype AS $$ -+DECLARE -+ currpos point; -+ currsted text; -+ currdist numeric; -+ currlat numeric(8, 5); -+ currlon numeric(8, 5); -+BEGIN -+ currpos = findpos(currtime); -+ currlat = currpos[1]; -+ currlon = currpos[0]; -+ currsted = clname(currpos); -+ currdist = cldist(currpos); -+ RETURN(currtime, currlat, currlon, currsted, currdist); -+ -- RETURN(currtime || currlat || currlon || currplace || currdist); -+END; -+$$ LANGUAGE plpgsql; -+ -+-- Backup -+-- begin-base64 644 - -+-- H4sIABd7IEgCA11Q0WrCMBR971fch8JacLA9CGLxIatZEUocsX0SH0qNLpCm -+-- WRvZGH78kupMm0DC5Zx77jm5KcWowLClQPFHjlIM7yVJi82WwPcn65hq+6i+ -+-- dJ3mDQP79LpqlP6NTX9RUrIDzX40oB2EYbDGaY4oDsAcKzJiUC2XOnGQqGo2 -+-- aBx25L0GeWlYx2uHiuoBRosZzOMR1UqfesPZhkyMV3Di8jjOH0+Hr/5b96+H -+-- 6WzHvBz86IYTsmpYdG+JvX9Y3hYef9uWW+X1Ck/wbK4p7oGWy2GVA+PwVo7x -+-- keIWx0ettbHEZJ0EYQg5IlmJMgxKqHP/JZLgD2CFKF3xAQAA -+-- ==== -+ - -- Returnerer antall sekunder sia midnatt for en dato. - DROP FUNCTION secmidnight(timestamptz); - CREATE OR REPLACE FUNCTION secmidnight(timestamptz) RETURNS double precision diff --git a/branches/gpst.postgis/postgres/allupdate.sql b/branches/gpst.postgis/postgres/allupdate.sql deleted file mode 100644 index f0d5d86..0000000 --- a/branches/gpst.postgis/postgres/allupdate.sql +++ /dev/null @@ -1,3 +0,0 @@ --- $Id$ - -INSERT INTO stat (lastupdate, laststed) VALUES (now(), '1900-01-01'); diff --git a/branches/gpst.postgis/postgres/create_funcs.sql b/branches/gpst.postgis/postgres/create_funcs.sql deleted file mode 100644 index fb6ecb6..0000000 --- a/branches/gpst.postgis/postgres/create_funcs.sql +++ /dev/null @@ -1,200 +0,0 @@ --- $Id$ - --- clname(): Returnerer navnet på det nærmeste veipunktet i wayp. -CREATE OR REPLACE FUNCTION clname(point) RETURNS text -- {{{ -AS $$ -SELECT name FROM ( - SELECT - name, - ($1 <-> coor) - AS avs - FROM wayp - WHERE ($1 <-> coor) < 0.05 - ORDER BY avs - LIMIT 1 - ) AS s; -$$ LANGUAGE SQL; --- }}} - --- cldist(): Returnerer avstanden (i grader) til det nærmeste veipunktet i wayp. -CREATE OR REPLACE FUNCTION cldist(point) RETURNS numeric -- {{{ -AS $$ -SELECT round(avs::numeric, 5) FROM ( - SELECT - ($1 <-> coor) - AS avs - FROM wayp - WHERE ($1 <-> coor) < 0.05 - ORDER BY avs - LIMIT 1 - ) AS s; -$$ LANGUAGE SQL; -- }}} - --- findpos(): Beregn koordinater for et tidspunkt som ligger mellom to trackpunkter. -CREATE OR REPLACE FUNCTION findpos(currtime timestamptz) RETURNS point AS $$ -- {{{ -DECLARE - firstdate timestamptz; - lastdate timestamptz; - firsttime timestamptz; - firstcoor point; - lasttime timestamptz; - lastcoor point; - currlat numeric; - currlon numeric; -BEGIN - -- RAISE NOTICE '-----------------------------------'; - SELECT INTO firstdate date - FROM logg - ORDER BY date - LIMIT 1; - SELECT INTO lastdate date - FROM logg - ORDER BY date DESC - LIMIT 1; - IF currtime < firstdate OR currtime > lastdate THEN - return(NULL); - END IF; - - SELECT INTO firsttime date - FROM logg - WHERE date <= currtime - ORDER BY date DESC - LIMIT 1; - SELECT INTO firstcoor coor - FROM logg - WHERE date <= currtime - ORDER BY date DESC - LIMIT 1; - SELECT INTO lasttime date - FROM logg - WHERE date >= currtime - ORDER BY date - LIMIT 1; - SELECT INTO lastcoor coor - FROM logg - WHERE date >= currtime - ORDER BY date - LIMIT 1; - -- RAISE NOTICE 'currtime = %', currtime; - -- RAISE NOTICE 'firsttime = %, firstcoor = %', firsttime, firstcoor; - -- RAISE NOTICE 'lasttime = %, lastcoor = %', lasttime, lastcoor; - - IF firsttime = lasttime THEN - RETURN(firstcoor); - END IF; - - currlat = firstcoor[0] + - ( - ( - lastcoor[0]-firstcoor[0] - ) * - ( - ( - EXTRACT(EPOCH FROM currtime)-EXTRACT(EPOCH FROM firsttime) - ) - / - ( - EXTRACT(EPOCH FROM lasttime)-EXTRACT(EPOCH FROM firsttime) - ) - ) - ); - currlon = firstcoor[1] + - ( - ( - lastcoor[1]-firstcoor[1] - ) * - ( - ( - EXTRACT(EPOCH FROM currtime)-EXTRACT(EPOCH FROM firsttime) - ) - / - ( - EXTRACT(EPOCH FROM lasttime)-EXTRACT(EPOCH FROM firsttime) - ) - ) - ); - -- RAISE NOTICE 'currcoor = (%,%)', currlat, currlon; - RETURN (currlat,currlon); -END; -$$ LANGUAGE plpgsql; -- }}} - --- wherepos(): Returnerer en streng med dato, posisjon, nærmeste navn og avstand til nærmeste punkt. -CREATE OR REPLACE FUNCTION wherepos(currtime timestamptz) RETURNS text AS $$ -- {{{ -DECLARE - currpos point; - currsted text; - currdist numeric; - currlat numeric(9, 6); - currlon numeric(9, 6); -BEGIN - currpos = findpos(currtime); - currlat = currpos[0]; - currlon = currpos[1]; - currsted = clname(currpos); - currdist = cldist(currpos); - RETURN(currtime || ' - ' || currlat::text || ' ' || currlon::text || ' - ' || currsted || ' - ' || currdist); -END; -$$ LANGUAGE plpgsql; -- }}} - --- loop_wayp_new(): Loop gjennom alle entryene i wayp_new og legg dem inn i systemet. -CREATE OR REPLACE FUNCTION loop_wayp_new() RETURNS void AS $$ -- {{{ -DECLARE - curr_id integer; - currpoint point; -BEGIN - -- FOR curr IN SELECT * FROM wayp_new LOOP - -- NULL; - -- END LOOP; - LOOP - curr_id = first_wayp_new(); - IF curr_id IS NOT NULL THEN - RAISE NOTICE 'curr_id er ikke null: %', curr_id; - currpoint = (SELECT coor FROM wayp_new WHERE id = curr_id); - IF (SELECT coor FROM wayp WHERE coor[0] = currpoint[0] AND coor[1] = currpoint[1]) IS NOT NULL THEN - RAISE NOTICE '% finnes allerede i wayp', currpoint; - INSERT INTO wayp_rej SELECT * FROM wayp_new WHERE id = curr_id; - ELSE - RAISE NOTICE '% er ikke i wayp', currpoint; - INSERT INTO wayp SELECT * FROM wayp_new WHERE id = curr_id; - PERFORM update_trackpoint(currpoint); - END IF; - DELETE FROM wayp_new WHERE id = curr_id; - -- COPY (SELECT name FROM wayp WHERE coor::varchar = currpoint::varchar) - -- TO STDOUT; - ELSE - RAISE NOTICE 'currpoint er null'; - EXIT; - END IF; - END LOOP; -END; -$$ LANGUAGE plpgsql; -- }}} - --- update_trackpoint(): Oppdater alle feltene i en viss omkrets av punktet som spesifiseres. -CREATE OR REPLACE FUNCTION update_trackpoint(currpoint point) RETURNS void AS $$ -- {{{ -BEGIN - RAISE NOTICE 'starter update_trackpoint(%), %', currpoint, clname(currpoint); - -- Avstanden hjemmefra. - UPDATE logg SET avst = '(60.42543,5.29959)'::point <-> $1 - WHERE ($1 <-> coor) < 0.05; - RAISE NOTICE 'avst ferdig'; - -- Sted og dist - UPDATE logg SET sted = clname(coor), dist = cldist(coor) - WHERE ($1 <-> coor) < 0.05; - RAISE NOTICE 'update_trackpoint(%) er ferdig', currpoint; -END; -$$ LANGUAGE plpgsql; --- }}} - --- first_wayp_new(): Returnerer id for den eldste i wayp_new. -CREATE OR REPLACE FUNCTION first_wayp_new() RETURNS integer AS $$ -- {{{ -BEGIN - RETURN (SELECT id FROM wayp_new ORDER BY id LIMIT 1); -END -$$ LANGUAGE plpgsql; --- }}} - --- secmidnight(): Returnerer antall sekunder sia midnatt for en dato. -CREATE OR REPLACE FUNCTION secmidnight(timestamptz) RETURNS double precision -- {{{ -AS $$ -SELECT extract(hour from $1) * 3600 + extract(minute from $1) * 60 + extract(second from $1); -$$ LANGUAGE SQL; -- }}} diff --git a/branches/gpst.postgis/postgres/create_index.sql b/branches/gpst.postgis/postgres/create_index.sql deleted file mode 100644 index 75f77dc..0000000 --- a/branches/gpst.postgis/postgres/create_index.sql +++ /dev/null @@ -1,32 +0,0 @@ --- $Id$ - -CREATE INDEX log_date_idx on logg(date); -CREATE INDEX log_coor0_idx on logg((coor[0])); -CREATE INDEX log_coor1_idx on logg((coor[1])); -CREATE INDEX log_ele_idx on logg(ele); -CREATE INDEX log_sted_idx on logg(sted); -CREATE INDEX log_dist_idx on logg(dist); -CREATE INDEX log_avst_idx on logg(avst); - --- DROP INDEX begin_idx; --- DROP INDEX end_idx; --- DROP INDEX cabegin_idx; --- DROP INDEX caend_idx; --- DROP INDEX lat_idx; --- DROP INDEX lon_idx; --- DROP INDEX descr_idx; --- DROP INDEX flags_idx; --- DROP INDEX persons_idx; --- DROP INDEX data_idx; - -CREATE INDEX ev_date_idx ON events (date); -CREATE INDEX ev_begindate_idx ON events (begindate); -CREATE INDEX ev_enddate_idx ON events (enddate); -CREATE INDEX ev_cabegin_idx ON events (cabegin); -CREATE INDEX ev_caend_idx ON events (caend); -CREATE INDEX ev_coor0_idx ON events ((coor[0])); -CREATE INDEX ev_coor1_idx ON events ((coor[1])); -CREATE INDEX ev_descr_idx ON events (descr); -CREATE INDEX ev_flags_idx ON events (flags); -CREATE INDEX ev_persons_idx ON events (persons); -CREATE INDEX ev_data_idx ON events (data); diff --git a/branches/gpst.postgis/postgres/create_table.sql b/branches/gpst.postgis/postgres/create_table.sql deleted file mode 100644 index 561841a..0000000 --- a/branches/gpst.postgis/postgres/create_table.sql +++ /dev/null @@ -1,80 +0,0 @@ --- $Id$ - -CREATE TABLE logg ( - date timestamptz, - coor point, - ele numeric, - sted text, - dist numeric(8, 5), - description text, - avst numeric(8, 5) -); - -CREATE TABLE wayp ( - coor point, - name text, - ele numeric(6, 1), - type text, - time timestamptz, - cmt text, -- GPS waypoint comment. Sent to the GPS as comment. - descr text, -- A text description. Additional info intended for the user, not the GPS. - src text, - sym text, - id integer -); - -CREATE TABLE wayp_new ( - coor point, - name text, - ele numeric(6, 1), - type text, - time timestamptz, - cmt text, -- GPS waypoint comment. Sent to the GPS as comment. - descr text, -- A text description. Additional info intended for the user, not the GPS. - src text, - sym text, - id serial -); - -CREATE TABLE wayp_rej ( - coor point, - name text, - ele numeric(6, 1), - type text, - time timestamptz, - cmt text, -- GPS waypoint comment. Sent to the GPS as comment. - descr text, -- A text description. Additional info intended for the user, not the GPS. - src text, - sym text, - id integer -); - -CREATE TABLE tmpwayp AS - SELECT * from wayp LIMIT 0; - -CREATE TABLE events ( - date timestamptz, - coor point, - descr text, - begindate timestamptz, -- Ganske eksakt tidspunt ved start - enddate timestamptz, -- Ganske eksakt tidspunkt ved slutt - cabegin interval, - caend interval, - flags text[], - persons text[], - data bytea -); - -CREATE TABLE pictures ( - version smallint, - date timestamptz, - coor point, - descr text, - filename text, - author text -); - -CREATE TABLE stat ( - lastupdate timestamptz, - laststed timestamptz -); diff --git a/branches/gpst.postgis/postgres/create_views.sql b/branches/gpst.postgis/postgres/create_views.sql deleted file mode 100644 index 34e5a56..0000000 --- a/branches/gpst.postgis/postgres/create_views.sql +++ /dev/null @@ -1,155 +0,0 @@ - -- $Id$ - --- siste_aar: List ut alle plasser siste år, DISTINCT ON sted og hver uke -CREATE OR REPLACE VIEW siste_aar -- {{{ - AS SELECT * FROM ( - SELECT DISTINCT ON ( - sted, date_trunc('week', date) - ) * - FROM logg - WHERE date > now() + interval '1 year ago' - ) AS s - ORDER BY date; -- }}} - --- siste_halvaar: List ut alle plasser siste halvår, DISTINCT ON sted og hver uke -CREATE OR REPLACE VIEW siste_halvaar -- {{{ - AS SELECT * FROM ( - SELECT DISTINCT ON ( - sted, date_trunc('week', date) - ) * - FROM logg - WHERE date > now() + interval '0.5 year ago' - ) AS s - ORDER BY date; -- }}} - --- siste_maaned: List ut alle plasser siste måned, DISTINCT ON sted og hver time -CREATE OR REPLACE VIEW siste_maaned -- {{{ - AS SELECT * FROM ( - SELECT DISTINCT ON ( - sted, date_trunc('hour', date) - ) * - FROM logg - WHERE date > now() + interval '1 month ago' - ) AS s - ORDER BY date; -- }}} - --- siste_uke: List ut alle plasser siste uka, DISTINCT ON sted og hver time -CREATE OR REPLACE VIEW siste_uke -- {{{ - AS SELECT * FROM ( - SELECT DISTINCT ON ( - sted, date_trunc('hour', date) - ) * - FROM logg - WHERE date > now()+interval '1 week ago' - ) AS s - ORDER BY date; -- }}} - --- siste_dogn: List ut alle plasser siste døgn, DISTINCT ON sted og hvert minutt -CREATE OR REPLACE VIEW siste_dogn -- {{{ - AS SELECT * FROM ( - SELECT DISTINCT ON ( - sted, date_trunc('minute', date) - ) * - FROM logg - WHERE date > now()+interval '1 day ago' - ) AS s - ORDER BY date; -- }}} - --- fjernest: List ut de 50.000 punktene som ligger lengst hjemmefra -CREATE OR REPLACE VIEW fjernest -- {{{ - AS SELECT * FROM logg - ORDER BY avst DESC LIMIT 50000; -- }}} - --- fjernest_siste_aar: List ut de 50.000 punktene lengst hjemmefra siste året -CREATE OR REPLACE VIEW fjernest_siste_aar -- {{{ - AS SELECT * FROM logg - WHERE date > now()+interval '1 year ago' - ORDER BY avst DESC LIMIT 50000; -- }}} - --- fjernest_siste_halvaar: List ut de 50.000 punktene lengst hjemmefra siste halvåret -CREATE OR REPLACE VIEW fjernest_siste_halvaar -- {{{ - AS SELECT * FROM logg - WHERE date > now()+interval '0.5 year ago' - ORDER BY avst DESC LIMIT 50000; -- }}} - --- fjernest_siste_maaned: List ut de 50.000 punktene lengst hjemmefra siste måneden -CREATE OR REPLACE VIEW fjernest_siste_maaned -- {{{ - AS SELECT * FROM logg - WHERE date > now() + interval '1 month ago' - ORDER BY avst DESC LIMIT 50000; -- }}} - --- fjernest_siste_uke: List ut de 50.000 punktene lengst hjemmefra siste uka -CREATE OR REPLACE VIEW fjernest_siste_uke -- {{{ - AS SELECT * FROM logg - WHERE date > now() + interval '1 week ago' - ORDER BY avst DESC LIMIT 50000; -- }}} - --- fjernest_siste_dogn: List ut de 50.000 punktene lengst hjemmefra siste døgn -CREATE OR REPLACE VIEW fjernest_siste_dogn -- {{{ - AS SELECT * FROM logg - WHERE date > now() + interval '1 day ago' - ORDER BY avst DESC LIMIT 50000; -- }}} - -/*** Intervaller ***/ - -CREATE OR REPLACE VIEW minutt -- {{{ - AS SELECT * FROM ( - SELECT DISTINCT ON ( - date_trunc('minute', date) - ) * - FROM logg - ) AS s - ORDER BY date DESC; -- }}} - -/*** Formater ***/ - -CREATE OR REPLACE VIEW closest AS -- {{{ - SELECT * FROM ( - SELECT DISTINCT ON (sted) * FROM ( - SELECT * FROM LOGG - ORDER BY dist - ) AS b - WHERE sted IS NOT NULL - ) AS a - ORDER BY date; -- }}} - -CREATE OR REPLACE VIEW gpx AS -- {{{ - SELECT ' ' || - '' || ele || ' ' || - ' ' || - '' - AS gpx, - date, coor, ele, sted, dist, description - FROM logg; -- }}} - -CREATE OR REPLACE VIEW gpst AS -- {{{ - SELECT date, coor, ele, sted, dist, avst, - ' ' || coor[0] || ' ' || coor[1] || ' ' - AS gpst - FROM logg; -- }}} - --- ev: Lister ut events sammen med loggen. -CREATE OR REPLACE VIEW ev AS -- {{{ - SELECT * FROM ( - SELECT 'gps' AS flag, date, coor, sted || ' (' || dist || ')' AS sted, ele::numeric(8,1), NULL AS descr, avst - FROM logg - UNION ALL - SELECT 'event' AS flag, date, coor, NULL, NULL, descr AS descr, NULL - FROM events - UNION ALL - SELECT 'pic' AS flag, date, coor, filename, NULL, NULL, NULL - FROM pictures - ) AS u - ORDER BY date; -- }}} - --- wp: Lister ut veipunktene, sortert nord → sør, vest → øst -CREATE OR REPLACE VIEW wp AS -- {{{ - SELECT - coor AS coor, - substr(name, 1, 20) AS name, - type AS type, - substr(cmt, 1, 20) AS cmt, - ele AS ele, - time AS time - FROM wayp - ORDER BY coor[0] desc, coor[1]; -- }}} diff --git a/branches/gpst.postgis/postgres/distupdate.sql b/branches/gpst.postgis/postgres/distupdate.sql deleted file mode 100644 index 7b8036b..0000000 --- a/branches/gpst.postgis/postgres/distupdate.sql +++ /dev/null @@ -1,30 +0,0 @@ --- $Id$ - -BEGIN ISOLATION LEVEL SERIALIZABLE; - \echo - \echo ================ Sett avstanden hjemmefra ================ - - UPDATE logg SET avst = '(60.42543,5.29959)'::point <-> coor - WHERE date > ( - SELECT laststed FROM stat - WHERE lastupdate IS NOT NULL - ORDER BY lastupdate DESC LIMIT 1 - ) - OR date IS NULL; - - \echo - \echo ================ Oppdater sted og dist ================ - - UPDATE logg SET sted = clname(coor), dist = cldist(coor) - WHERE date > ( - SELECT laststed FROM stat - WHERE lastupdate IS NOT NULL - ORDER BY lastupdate DESC LIMIT 1 - ) - OR date IS NULL; - - INSERT INTO stat (lastupdate, laststed) VALUES ( - now(), - (SELECT max(date) FROM logg) - ); -COMMIT; diff --git a/branches/gpst.postgis/postgres/div.txt b/branches/gpst.postgis/postgres/div.txt deleted file mode 100644 index dffcae8..0000000 --- a/branches/gpst.postgis/postgres/div.txt +++ /dev/null @@ -1,5 +0,0 @@ -$Id$ - -For å liste ut de nærmeste trackpunktene for en posisjon: - -SELECT date, coor, sted, dist, (point(60.30738,5.34574) <-> coor)::numeric AS avs FROM logg ORDER BY avs LIMIT 100; diff --git a/branches/gpst.postgis/postgres/init.sh b/branches/gpst.postgis/postgres/init.sh deleted file mode 100755 index 5d7c868..0000000 --- a/branches/gpst.postgis/postgres/init.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# $Id$ - -createdb gps -psql -d gps -c "CREATE LANGUAGE plpgsql;" -psql -d gps -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql -psql -d gps -f /usr/share/postgresql-8.3-postgis/spatial_ref_sys.sql -psql -d gps -f init.sql diff --git a/branches/gpst.postgis/postgres/init.sql b/branches/gpst.postgis/postgres/init.sql deleted file mode 100644 index 579d179..0000000 --- a/branches/gpst.postgis/postgres/init.sql +++ /dev/null @@ -1,6 +0,0 @@ --- $Id$ - -\i create_table.sql -\i create_funcs.sql -\i create_views.sql -\i allupdate.sql diff --git a/branches/gpst.postgis/postgres/path.sql b/branches/gpst.postgis/postgres/path.sql deleted file mode 100644 index c7e5179..0000000 --- a/branches/gpst.postgis/postgres/path.sql +++ /dev/null @@ -1,8 +0,0 @@ --- $Id$ - -SELECT * FROM logg - WHERE coor <@ polygon(path('( - (58.633, 3.149), - (52.395, 3.163), - (49.364, -6.437) - )')) ORDER BY date; diff --git a/branches/gpst.postgis/postgres/update_things.sql b/branches/gpst.postgis/postgres/update_things.sql deleted file mode 100644 index 9971cdf..0000000 --- a/branches/gpst.postgis/postgres/update_things.sql +++ /dev/null @@ -1,126 +0,0 @@ --- $Id$ - --- Rund av veipunkter til seks desimaler -- {{{ -\echo -\echo ================ Rund av veipunkter til seks desimaler ================ - -UPDATE wayp SET coor = point( - round(coor[0]::numeric, 6), - round(coor[1]::numeric, 6) -); --- }}} - --- Fjern duplikater i wayp -- {{{ -\echo -\echo ================ Fjern duplikater i wayp ================ - -SELECT count(*) - AS "Antall i wayp før rensking" - FROM wayp; - -BEGIN ISOLATION LEVEL SERIALIZABLE; - CREATE TEMPORARY TABLE dupfri - ON COMMIT DROP - AS ( - SELECT - DISTINCT ON ( - coor[0], coor[1], - name, - ele, - type, - time, - cmt, - descr, - src, - sym - ) * - FROM wayp - ); - TRUNCATE wayp; - INSERT INTO wayp ( - SELECT * - FROM dupfri - ORDER BY name - ); -COMMIT; - -SELECT count(*) - AS "Antall i wayp etter rensking" - FROM wayp; --- }}} - --- Fjern duplikater i events -- {{{ -\echo -\echo ================ Fjern duplikater i events ================ - -SELECT count(*) - AS "Antall i events før rensking" - FROM events; - -BEGIN ISOLATION LEVEL SERIALIZABLE; - CREATE TEMPORARY TABLE dupfri - ON COMMIT DROP - AS ( - SELECT - DISTINCT ON (date, coor[0], coor[1], descr) * - FROM events - ); - TRUNCATE events; - INSERT INTO events ( - SELECT * - FROM dupfri - ORDER BY date - ); -COMMIT; - -SELECT count(*) - AS "Antall i events etter rensking" - FROM events; --- }}} - --- Oppdater koordinater for bilder -- {{{ -\echo -\echo ================ Oppdater koordinater for bilder ================ - -UPDATE pictures SET coor = findpos(date) - WHERE coor IS NULL; --- }}} - --- Rund av bildekoordinater -- {{{ -\echo ================ Rund av bildekoordinater ================ -UPDATE pictures SET coor = point( - round(coor[0]::numeric, 6), - round(coor[1]::numeric, 6) -); --- }}} - --- Fjern duplikater i pictures -- {{{ -\echo -\echo ================ Fjern duplikater i pictures ================ - -SELECT count(*) - AS "Antall i pictures før rensking" - FROM pictures; - -BEGIN ISOLATION LEVEL SERIALIZABLE; - CREATE TEMPORARY TABLE dupfri - ON COMMIT DROP - AS ( - SELECT - DISTINCT ON (date, coor[0], coor[1], descr, filename, author) * - FROM pictures - ); - TRUNCATE pictures; - INSERT INTO pictures ( - SELECT * - FROM dupfri - ORDER BY date - ); -COMMIT; - -SELECT count(*) - AS "Antall i pictures etter rensking" - FROM pictures; --- }}} - -\i distupdate.sql diff --git a/branches/gpst.postgis/run b/branches/gpst.postgis/run deleted file mode 100755 index 769e868..0000000 --- a/branches/gpst.postgis/run +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/gnuplot - -# $Id$ - -!./makemesh >x -set pm3d -splot "x" w l, "x" w pm3d -pause -1 - -splot "x" w l -pause -1 -splot "x" w d -pause -1 diff --git a/branches/gpst.postgis/tests/Makefile b/branches/gpst.postgis/tests/Makefile deleted file mode 100644 index ace4896..0000000 --- a/branches/gpst.postgis/tests/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/make - -# $Id$ -# gpstools/tests/Makefile - -all: - ./run-tests.pl 2>&1 | remove_perltestnumbers >log/tests.log - ./run-tests.pl --todo 2>&1 | remove_perltestnumbers >log/todo-tests.log - cd gpst-pic && make - cd addpoints && make diff --git a/branches/gpst.postgis/tests/addpoints/Makefile b/branches/gpst.postgis/tests/addpoints/Makefile deleted file mode 100644 index d2fb1a9..0000000 --- a/branches/gpst.postgis/tests/addpoints/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/make - -# $Id$ - -all: - ./addpoints.t 2>&1 | remove_perltestnumbers >log/tests.log - ./addpoints.t --todo 2>&1 | remove_perltestnumbers >log/todo-tests.log diff --git a/branches/gpst.postgis/tests/addpoints/addpoints.t b/branches/gpst.postgis/tests/addpoints/addpoints.t deleted file mode 100755 index 10df184..0000000 --- a/branches/gpst.postgis/tests/addpoints/addpoints.t +++ /dev/null @@ -1,341 +0,0 @@ -#!/usr/bin/perl -w - -#======================================================================= -# $Id$ -# Test suite for addpoints(1). -# -# Character set: UTF-8 -# ©opyleft 2008– Øyvind A. Holm -# License: GNU General Public License version 2 or later, see end of -# file for legal stuff. -#======================================================================= - -BEGIN { - # push(@INC, "$ENV{'HOME'}/bin/STDlibdirDTS"); - our @version_array; - use Test::More qw{no_plan}; - # use_ok() goes here -} - -use strict; -use Getopt::Long; - -$| = 1; - -our $Debug = 0; -our $CMD = "../../addpoints"; - -our %Opt = ( - - 'all' => 0, - 'debug' => 0, - 'help' => 0, - 'todo' => 0, - 'verbose' => 0, - 'version' => 0, - -); - -our $progname = $0; -$progname =~ s/^.*\/(.*?)$/$1/; - -my $rcs_id = '$Id$'; -my $id_date = $rcs_id; -$id_date =~ s/^.*?\d+ (\d\d\d\d-.*?\d\d:\d\d:\d\d\S+).*/$1/; - -push(@main::version_array, $rcs_id); - -my @cmdline_array = @ARGV; - -Getopt::Long::Configure("bundling"); -GetOptions( - - "all|a" => \$Opt{'all'}, - "debug" => \$Opt{'debug'}, - "help|h" => \$Opt{'help'}, - "todo|t" => \$Opt{'todo'}, - "verbose|v+" => \$Opt{'verbose'}, - "version" => \$Opt{'version'}, - -) || die("$progname: Option error. Use -h for help.\n"); - -$Opt{'debug'} && ($Debug = 1); -$Opt{'help'} && usage(0); -if ($Opt{'version'}) { - print_version(); - exit(0); -} - -diag(sprintf("========== Executing \"%s%s%s\" ==========", - $progname, - scalar(@cmdline_array) ? " " : "", - join(" ", @cmdline_array))); - -if ($Opt{'todo'} && !$Opt{'all'}) { - goto todo_section; -} - -=pod - -testcmd("$CMD command", # {{{ - <); - close(FP); - return($Txt); - } else { - return undef; - } - # }}} -} - -sub print_version { - # Print program version {{{ - for (@main::version_array) { - print("$_\n"); - } - # }}} -} # print_version() - -sub usage { - # Send the help message to stdout {{{ - my $Retval = shift; - - if ($Opt{'verbose'}) { - print("\n"); - print_version(); - } - print(<= $verbose_level) { - print(STDERR "$progname: $Txt\n"); - } - # }}} -} # msg() - -__END__ - -# Plain Old Documentation (POD) {{{ - -=pod - -=head1 NAME - -run-tests.pl - -=head1 REVISION - -$Id$ - -=head1 SYNOPSIS - -addpoints.t [options] [file [files [...]]] - -=head1 DESCRIPTION - -Contains tests for the addpoints(1) program. - -=head1 OPTIONS - -=over 4 - -=item B<-a>, B<--all> - -Run all tests, also TODOs. - -=item B<-h>, B<--help> - -Print a brief help summary. - -=item B<-t>, B<--todo> - -Run only the TODO tests. - -=item B<-v>, B<--verbose> - -Increase level of verbosity. Can be repeated. - -=item B<--version> - -Print version information. - -=item B<--debug> - -Print debugging messages. - -=back - -=head1 AUTHOR - -Made by Øyvind A. Holm Ssunny@sunbase.orgE>. - -=head1 COPYRIGHT - -Copyleft © Øyvind A. Holm Esunny@sunbase.orgE -This is free software; see the file F for legalese stuff. - -=head1 LICENCE - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -=head1 SEE ALSO - -=cut - -# }}} - -# vim: set fenc=UTF-8 ft=perl fdm=marker ts=4 sw=4 sts=4 et fo+=w : -# End of file $Id$ diff --git a/branches/gpst.postgis/tests/addpoints/log/tests.log b/branches/gpst.postgis/tests/addpoints/log/tests.log deleted file mode 100644 index e68bcdf..0000000 --- a/branches/gpst.postgis/tests/addpoints/log/tests.log +++ /dev/null @@ -1,13 +0,0 @@ -# ========== Executing "addpoints.t" ========== -# Testing -h (--help) option... -ok - "../../addpoints -h" - Option -h prints help screen -ok - "../../addpoints -h" - Option -h prints help screen (stderr) -ok - "../../addpoints -h" - No Id with only -h -# Testing -v (--verbose) option... -ok - "../../addpoints -hv" - Option --version with -h returns Id string and help screen -ok - "../../addpoints -hv" - Option --version with -h returns Id string and help screen (stderr) -# Testing --version option... -ok - "../../addpoints --version" - Option --version returns Id string -ok - "../../addpoints --version" - Option --version returns Id string (stderr) -# Testing finished. -1..7 diff --git a/branches/gpst.postgis/tests/addpoints/log/todo-tests.log b/branches/gpst.postgis/tests/addpoints/log/todo-tests.log deleted file mode 100644 index ce45bd8..0000000 --- a/branches/gpst.postgis/tests/addpoints/log/todo-tests.log +++ /dev/null @@ -1,4 +0,0 @@ -# ========== Executing "addpoints.t --todo" ========== -# Running TODO tests... -# Testing finished. -# No tests run! diff --git a/branches/gpst.postgis/tests/chronology-error.gpsml b/branches/gpst.postgis/tests/chronology-error.gpsml deleted file mode 100644 index b8e59c4..0000000 --- a/branches/gpst.postgis/tests/chronology-error.gpsml +++ /dev/null @@ -1,19 +0,0 @@ - - - -Chronology errors - 60.45369 5.31559 95 - 60.45353 5.31548 94 - 60.45353 5.31561 94 - - 60.45369 5.31597 Out of chronology - -0:00:37:54 - 60.45418 5.31517 92 - 60.45407 5.31542 91 - 60.45401 5.31543 98 - 60.45401 5.31543 98 - 60.45395 5.31544 103 - 60.45391 5.31545 107 - - diff --git a/branches/gpst.postgis/tests/comments.mayko b/branches/gpst.postgis/tests/comments.mayko deleted file mode 100644 index 917fc7b..0000000 --- a/branches/gpst.postgis/tests/comments.mayko +++ /dev/null @@ -1,13 +0,0 @@ -xmaplog 1.0 Mon Dec 23 02:00:50 2002 -1 70.6800486 23.6746151 57.4 0 12/22/2002 21:42:24 -1 70.6799322 23.6740038 6.3 0 12/22/2002 21:42:32 -1 70.6796266 23.6723991 6.0 0 12/22/2002 21:42:54 -# 20021222T214351-20021222T214354: CO: No signal {{{ -# 1 70.6796266 23.6723991 0.0 0 12/22/2002 21:43:51 -# 1 70.6796266 23.6723991 0.0 0 12/22/2002 21:43:52 -# 1 70.6796266 23.6723991 0.0 0 12/22/2002 21:43:54 -# 20021222T214351-20021222T214354: CO: No signal }}} -# move -1 70.6800774 23.6757566 5.1 0 12/22/2002 21:44:45 -1 70.6801502 23.6753442 4.8 0 12/22/2002 21:44:52 -1 70.6801905 23.6757542 2.5 0 12/22/2002 21:45:04 diff --git a/branches/gpst.postgis/tests/compact.gpx b/branches/gpst.postgis/tests/compact.gpx deleted file mode 100644 index fca71c9..0000000 --- a/branches/gpst.postgis/tests/compact.gpx +++ /dev/null @@ -1 +0,0 @@ -All whitespace stripped diff --git a/branches/gpst.postgis/tests/date_error.mayko b/branches/gpst.postgis/tests/date_error.mayko deleted file mode 100644 index 5a498ee..0000000 --- a/branches/gpst.postgis/tests/date_error.mayko +++ /dev/null @@ -1,6 +0,0 @@ -xmaplog 1.0 Fri Jun 13 12:34:56 2003 -1 60.4280897 5.5794667 41.8 0 06/13/2003 09:12:36 -1 60.4281867 5.5802255 41.8 0 06/13/2003 09:12:38 -# error 1 103.4034054 129.7271053 0.0 0 06/25/2037 17:19:22 -1 60.4283320 5.5813636 -0.0 0 06/13/2003 09:12:41 -1 60.4283806 5.5817430 41.8 0 06/13/2003 09:12:42 diff --git a/branches/gpst.postgis/tests/different_dateformats.gpsml b/branches/gpst.postgis/tests/different_dateformats.gpsml deleted file mode 100644 index 5990ff9..0000000 --- a/branches/gpst.postgis/tests/different_dateformats.gpsml +++ /dev/null @@ -1,10 +0,0 @@ - - - -Date format variations - 1 1 - 2 2 - 3 3 - 4 4 - - diff --git a/branches/gpst.postgis/tests/gpst-pic/Makefile b/branches/gpst.postgis/tests/gpst-pic/Makefile deleted file mode 100644 index 0907d91..0000000 --- a/branches/gpst.postgis/tests/gpst-pic/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/make - -# $Id$ -# gpstools/tests/gpst-pic/Makefile - -all: - ./gpst-pic.t 2>&1 | remove_perltestnumbers >log/tests.log - ./gpst-pic.t --todo 2>&1 | remove_perltestnumbers >log/todo-tests.log diff --git a/branches/gpst.postgis/tests/gpst-pic/files/DSC_4426.JPG b/branches/gpst.postgis/tests/gpst-pic/files/DSC_4426.JPG deleted file mode 100644 index 40f01197ed8e6bf85c46d2cfc298b4ad243998f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 109366 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%0DOvE=8+9{Ss3&Eyh7 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 LI+&bQRj>cq?y_Yf diff --git a/branches/gpst.postgis/tests/gpst-pic/gpst-pic.t b/branches/gpst.postgis/tests/gpst-pic/gpst-pic.t deleted file mode 100755 index bade83c..0000000 --- a/branches/gpst.postgis/tests/gpst-pic/gpst-pic.t +++ /dev/null @@ -1,517 +0,0 @@ -#!/usr/bin/perl -w - -#======================================================================= -# $Id$ -# Test suite for gpst-pic(1). -# -# Character set: UTF-8 -# ©opyleft 2008– Øyvind A. Holm -# License: GNU General Public License version 2 or later, see end of -# file for legal stuff. -#======================================================================= - -BEGIN { - push(@INC, "$ENV{'HOME'}/bin/src/gpstools"); - our @version_array; - use Test::More qw{no_plan}; - use_ok(GPST); - use_ok(GPSTxml); -} - -use strict; -use Getopt::Long; - -$| = 1; - -our $Debug = 0; -our $CMD = "../../gpst-pic"; - -our %Opt = ( - - 'all' => 0, - 'debug' => 0, - 'help' => 0, - 'todo' => 0, - 'verbose' => 0, - 'version' => 0, - -); - -our $progname = $0; -$progname =~ s/^.*\/(.*?)$/$1/; - -my $rcs_id = '$Id$'; -my $id_date = $rcs_id; -$id_date =~ s/^.*?\d+ (\d\d\d\d-.*?\d\d:\d\d:\d\d\S+).*/$1/; - -push(@main::version_array, $rcs_id); - -my @cmdline_array = @ARGV; - -Getopt::Long::Configure("bundling"); -GetOptions( - - "all|a" => \$Opt{'all'}, - "debug" => \$Opt{'debug'}, - "help|h" => \$Opt{'help'}, - "todo|t" => \$Opt{'todo'}, - "verbose|v+" => \$Opt{'verbose'}, - "version" => \$Opt{'version'}, - -) || die("$progname: Option error. Use -h for help.\n"); - -$Opt{'debug'} && ($Debug = 1); -$Opt{'help'} && usage(0); -if ($Opt{'version'}) { - print_version(); - exit(0); -} - -diag(sprintf("========== Executing \"%s%s%s\" ==========", - $progname, - scalar(@cmdline_array) ? " " : "", - join(" ", @cmdline_array))); - -if ($Opt{'todo'} && !$Opt{'all'}) { - goto todo_section; -} - -=pod - -testcmd("$CMD command", # {{{ - < - - - DSC_4426.JPG - 2008-09-18T17:02:27 - - -END - "", - "Output XML information for DSC_4426.JPG", -); - -# }}} -# Unknown format -testcmd("$CMD -o blurfl files/DSC_4426.JPG", # {{{ - "", - "gpst-pic: blurfl: Unknown output format\n", - "Unknown output format specified", -); - -# }}} -# }}} --output-format -diag("Testing -w (--strip-whitespace) option..."); -testcmd("$CMD -w -o xml files/DSC_4426.JPG", # {{{ - < - - -DSC_4426.JPG -2008-09-18T17:02:27 - - -END - "", - "Strip whitespace from XML", -); - -# }}} -diag("Testing -T (--timezone) option..."); -testcmd("$CMD --timezone +1234 files/DSC_4426.JPG", # {{{ - < - - - DSC_4426.JPG - 267e841cb6788c795541e36aea70e2a55d8ec3bb - 19eb5c86f6b3662b57bc94c3ea428372 - 2008-03-02T17:51:39Z - 2008-03-02T17:51:39Z - 2008-09-18T15:02:27Z - - 200 - 0.333333 - 3.5 APEX - 0 - - - NIKON CORPRORATION - NIKON D300 - 4610 - - - -END - "", - "Show extended XML information for DSC_4426.JPG", -); - -# }}} - - } - # TODO tests }}} -} - -diag("Testing finished."); - -sub testcmd { - # {{{ - my ($Cmd, $Exp_stdout, $Exp_stderr, $Desc) = @_; - my $stderr_cmd = ""; - my $deb_str = $Opt{'debug'} ? " --debug" : ""; - my $Txt = join("", - "\"$Cmd\"", - defined($Desc) - ? " - $Desc" - : "" - ); - my $TMP_STDERR = "gpst-pic-stderr.tmp"; - - if (defined($Exp_stderr) && !length($deb_str)) { - $stderr_cmd = " 2>$TMP_STDERR"; - } - is(`$Cmd$deb_str$stderr_cmd`, $Exp_stdout, $Txt); - if (defined($Exp_stderr)) { - if (!length($deb_str)) { - is(file_data($TMP_STDERR), $Exp_stderr, "$Txt (stderr)"); - unlink($TMP_STDERR); - } - } else { - diag("Warning: stderr not defined for '$Txt'"); - } - # }}} -} - -sub likecmd { - # {{{ - my ($Cmd, $Exp_stdout, $Exp_stderr, $Desc) = @_; - my $stderr_cmd = ""; - my $deb_str = $Opt{'debug'} ? " --debug" : ""; - my $Txt = join("", - "\"$Cmd\"", - defined($Desc) - ? " - $Desc" - : "" - ); - my $TMP_STDERR = "gpst-pic-stderr.tmp"; - - if (defined($Exp_stderr) && !length($deb_str)) { - $stderr_cmd = " 2>$TMP_STDERR"; - } - like(`$Cmd$deb_str$stderr_cmd`, "$Exp_stdout", $Txt); - if (defined($Exp_stderr)) { - if (!length($deb_str)) { - like(file_data($TMP_STDERR), "$Exp_stderr", "$Txt (stderr)"); - unlink($TMP_STDERR); - } - } else { - diag("Warning: stderr not defined for '$Txt'"); - } - # }}} -} - -sub file_data { - # Return file content as a string {{{ - my $File = shift; - my $Txt; - if (open(FP, "<", $File)) { - $Txt = join("", ); - close(FP); - return($Txt); - } else { - return undef; - } - # }}} -} - -sub print_version { - # Print program version {{{ - for (@main::version_array) { - print("$_\n"); - } - # }}} -} # print_version() - -sub usage { - # Send the help message to stdout {{{ - my $Retval = shift; - - if ($Opt{'verbose'}) { - print("\n"); - print_version(); - } - print(<= $verbose_level) { - print(STDERR "$progname: $Txt\n"); - } - # }}} -} # msg() - -__END__ - -# Plain Old Documentation (POD) {{{ - -=pod - -=head1 NAME - -run-tests.pl - -=head1 REVISION - -$Id$ - -=head1 SYNOPSIS - -gpst-pic.t [options] [file [files [...]]] - -=head1 DESCRIPTION - -Contains tests for the gpst-pic(1) program. - -=head1 OPTIONS - -=over 4 - -=item B<-a>, B<--all> - -Run all tests, also TODOs. - -=item B<-h>, B<--help> - -Print a brief help summary. - -=item B<-t>, B<--todo> - -Run only the TODO tests. - -=item B<-v>, B<--verbose> - -Increase level of verbosity. Can be repeated. - -=item B<--version> - -Print version information. - -=item B<--debug> - -Print debugging messages. - -=back - -=head1 AUTHOR - -Made by Øyvind A. Holm Ssunny@sunbase.orgE>. - -=head1 COPYRIGHT - -Copyleft © Øyvind A. Holm Esunny@sunbase.orgE -This is free software; see the file F for legalese stuff. - -=head1 LICENCE - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -=head1 SEE ALSO - -gpst(1) - -=cut - -# }}} - -# vim: set fenc=UTF-8 ft=perl fdm=marker ts=4 sw=4 sts=4 et fo+=w : -# End of file $Id$ diff --git a/branches/gpst.postgis/tests/gpst-pic/log/tests.log b/branches/gpst.postgis/tests/gpst-pic/log/tests.log deleted file mode 100644 index dca6cb0..0000000 --- a/branches/gpst.postgis/tests/gpst-pic/log/tests.log +++ /dev/null @@ -1,50 +0,0 @@ -ok - use GPST; -ok - use GPSTxml; -# ========== Executing "gpst-pic.t" ========== -# Checking dependencies... -ok - "exifprobe -V" - Check that exifprobe(1) is installed -ok - "exifprobe -V" - Check that exifprobe(1) is installed (stderr) -# Testing --author option... -ok - "../../gpst-pic -a sunny files/DSC_4426.JPG" - Read date from DSC_4426.JPG and set --author -ok - "../../gpst-pic -a sunny files/DSC_4426.JPG" - Read date from DSC_4426.JPG and set --author (stderr) -# Testing --description option... -ok - "../../gpst-pic -d 'Skumle til\stander i Bergen.' files/DSC_4426.JPG" - Read date from DSC_4426.JPG and set --description with backslash -ok - "../../gpst-pic -d 'Skumle til\stander i Bergen.' files/DSC_4426.JPG" - Read date from DSC_4426.JPG and set --description with backslash (stderr) -# Testing -h (--help) option... -ok - "../../gpst-pic -h" - Option -h prints help screen -ok - "../../gpst-pic -h" - Option -h prints help screen (stderr) -ok - "../../gpst-pic -h" - No Id with only -h -# Testing --output-format option... -ok - "../../gpst-pic -o pgtab files/DSC_4426.JPG" - Output pgtab format from DSC_4426.JPG -ok - "../../gpst-pic -o pgtab files/DSC_4426.JPG" - Output pgtab format from DSC_4426.JPG (stderr) -ok - "../../gpst-pic -o xml files/DSC_4426.JPG" - Output XML information for DSC_4426.JPG -ok - "../../gpst-pic -o xml files/DSC_4426.JPG" - Output XML information for DSC_4426.JPG (stderr) -ok - "../../gpst-pic -o blurfl files/DSC_4426.JPG" - Unknown output format specified -ok - "../../gpst-pic -o blurfl files/DSC_4426.JPG" - Unknown output format specified (stderr) -# Testing -w (--strip-whitespace) option... -ok - "../../gpst-pic -w -o xml files/DSC_4426.JPG" - Strip whitespace from XML -ok - "../../gpst-pic -w -o xml files/DSC_4426.JPG" - Strip whitespace from XML (stderr) -# Testing -T (--timezone) option... -ok - "../../gpst-pic --timezone +1234 files/DSC_4426.JPG" - --timezone works -ok - "../../gpst-pic --timezone +1234 files/DSC_4426.JPG" - --timezone works (stderr) -ok - "../../gpst-pic -T +0200 files/DSC_4426.JPG" - Positive time zone -ok - "../../gpst-pic -T +0200 files/DSC_4426.JPG" - Positive time zone (stderr) -ok - "../../gpst-pic -T-0600 files/DSC_4426.JPG" - Negative time zone -ok - "../../gpst-pic -T-0600 files/DSC_4426.JPG" - Negative time zone (stderr) -ok - "../../gpst-pic -T CET files/DSC_4426.JPG" - Time zone abbreviation -ok - "../../gpst-pic -T CET files/DSC_4426.JPG" - Time zone abbreviation (stderr) -ok - "../../gpst-pic -T Z files/DSC_4426.JPG" - Zulu abbreviation -ok - "../../gpst-pic -T Z files/DSC_4426.JPG" - Zulu abbreviation (stderr) -ok - "../../gpst-pic -T erf324 files/DSC_4426.JPG" - Invalid time zone abbr, contains digits -ok - "../../gpst-pic -T erf324 files/DSC_4426.JPG" - Invalid time zone abbr, contains digits (stderr) -# Testing -v (--verbose) option... -ok - "../../gpst-pic -hv" - Option --version with -h returns Id string and help screen -ok - "../../gpst-pic -hv" - Option --version with -h returns Id string and help screen (stderr) -# Testing --version option... -ok - "../../gpst-pic --version" - Option --version returns Id string -ok - "../../gpst-pic --version" - Option --version returns Id string (stderr) -# Various... -ok - "../../gpst-pic files/DSC_4426.JPG" - Read date from DSC_4426.JPG, no options -ok - "../../gpst-pic files/DSC_4426.JPG" - Read date from DSC_4426.JPG, no options (stderr) -# Testing finished. -1..37 diff --git a/branches/gpst.postgis/tests/gpst-pic/log/todo-tests.log b/branches/gpst.postgis/tests/gpst-pic/log/todo-tests.log deleted file mode 100644 index 0f59a1a..0000000 --- a/branches/gpst.postgis/tests/gpst-pic/log/todo-tests.log +++ /dev/null @@ -1,40 +0,0 @@ -ok - use GPST; -ok - use GPSTxml; -# ========== Executing "gpst-pic.t --todo" ========== -# Running TODO tests... -not ok - "../../gpst-pic -o extxml files/DSC_4426.JPG" - Show extended XML information for DSC_4426.JPG -# Failed test '"../../gpst-pic -o extxml files/DSC_4426.JPG" - Show extended XML information for DSC_4426.JPG' -# at ./gpst-pic.t line 325. -# got: '' -# expected: ' -# -# -# DSC_4426.JPG -# 267e841cb6788c795541e36aea70e2a55d8ec3bb -# 19eb5c86f6b3662b57bc94c3ea428372 -# 2008-03-02T17:51:39Z -# 2008-03-02T17:51:39Z -# 2008-09-18T15:02:27Z -# -# 200 -# 0.333333 -# 3.5 APEX -# 0 -# -# -# NIKON CORPRORATION -# NIKON D300 -# 4610 -# -# -# -# ' -not ok - "../../gpst-pic -o extxml files/DSC_4426.JPG" - Show extended XML information for DSC_4426.JPG (stderr) -# Failed test '"../../gpst-pic -o extxml files/DSC_4426.JPG" - Show extended XML information for DSC_4426.JPG (stderr)' -# at ./gpst-pic.t line 328. -# got: 'gpst-pic: extxml: Unknown output format -# ' -# expected: '' -# Testing finished. -1..4 -# Looks like you failed 2 tests of 4. diff --git a/branches/gpst.postgis/tests/gpst-pic/testcmd b/branches/gpst.postgis/tests/gpst-pic/testcmd deleted file mode 100644 index 699ae3c..0000000 --- a/branches/gpst.postgis/tests/gpst-pic/testcmd +++ /dev/null @@ -1,9 +0,0 @@ -testcmd("$GP command", # {{{ - <") -ok - txt_to_xml() with multiline string -ok - xml_to_txt("abc") -ok - xml_to_txt("<&>") -ok - xml_to_txt() with multiline string -ok - postgresql_copy_safe() with empty string -ok - postgresql_copy_safe("abcæøåÆØÅ") -ok - postgresql_copy_safe("abc\t'\r\n") -ok - postgresql_copy_safe() with multiline, nulls and stuff -# Testing date routines... -ok - sec_to_string() without separator -ok - sec_to_string() with separator -ok - sec_to_string(-5000) — negative numbers unsupported atm -ok - sec_to_string("") -ok - sec_to_string() with invalid string -ok - sec_to_string() with a bunch of leading zeros -ok - sec_to_string() with decimals -ok - sec_to_string() with decimals and prefixing zeros -ok - sec_to_string() with decimals and extra trailing zeros -ok - sec_to_string() with missing zero before decimal point -ok - sec_to_readable(0) -ok - sec_to_readable() with invalid string -ok - sec_to_readable(86400) -ok - sec_to_readable(86400*1000) -ok - sec_to_readable(86400+7200+180+4) -ok - sec_to_readable("3.14") -ok - sec_to_readable() rejects negative numbers -ok - sec_to_readable() rejects negative decimal -ok - sec_to_readable(), missing zero before decimal point -ok - sec_to_readable() with empty string -# Testing geo routines... -ok - ddd_to_dms("12.34567") -ok - ddd_to_dms("0") -ok - ddd_to_dms("") -ok - ddd_to_dms("pH()rtY tW0") -ok - ddd_to_dms("-12.34567") -ok - ddd_to_dms("0.34567") -ok - ddd_to_dms(".34567") -ok - ddd_to_dms("-.34567") -ok - ddd_to_dms("-0.34567") -ok - ddd_to_dms("180") -ok - ddd_to_dms("-180") -ok - ddd_to_dms("-1") -ok - ddd_to_dms("2-3") -# Testing trackpoint()... -ok - trackpoint() receives empty hash -ok - trackpoint() (gpsml) -ok - trackpoint() (gpx) -ok - trackpoint(): {'format'} with invalid value ("2d") returns undef -ok - trackpoint(): {'lat'} with invalid value ("2d") returns undef -ok - trackpoint(): {'lon'} with invalid value ("2d") returns undef -ok - trackpoint(): {'what'} with invalid value ("2d") returns undef -ok - trackpoint(): {'year'} with empty value skips time -ok - trackpoint(): {'year'} with invalid value ("2d") skips time -ok - trackpoint(): Strip prefixing zeros from {'year'} -ok - trackpoint(): {'year'} is negative, skip time -ok - trackpoint(): Decimals in {'year'}, skip time -ok - trackpoint(): {'month'} with empty value skips time -ok - trackpoint(): {'month'} with invalid value ("2d") skips time -ok - trackpoint(): Strip prefixing zeros from {'month'} -ok - trackpoint(): {'month'} is negative, skip time -ok - trackpoint(): Decimals in {'month'}, skip time -ok - trackpoint(): {'day'} with empty value skips time -ok - trackpoint(): {'day'} with invalid value ("2d") skips time -ok - trackpoint(): Strip prefixing zeros from {'day'} -ok - trackpoint(): {'day'} is negative, skip time -ok - trackpoint(): Decimals in {'day'}, skip time -ok - trackpoint(): {'hour'} with empty value skips time -ok - trackpoint(): {'hour'} with invalid value ("2d") skips time -ok - trackpoint(): Strip prefixing zeros from {'hour'} -ok - trackpoint(): {'hour'} is negative, skip time -ok - trackpoint(): Decimals in {'hour'}, skip time -ok - trackpoint(): {'min'} with empty value skips time -ok - trackpoint(): {'min'} with invalid value ("2d") skips time -ok - trackpoint(): Strip prefixing zeros from {'min'} -ok - trackpoint(): {'min'} is negative, skip time -ok - trackpoint(): Decimals in {'min'}, skip time -ok - trackpoint(): {'sec'} with empty value skips time -ok - trackpoint(): {'sec'} with invalid value ("2d") skips time -ok - trackpoint(): Strip prefixing zeros from {'sec'} -ok - trackpoint(): {'sec'} is negative, skip time -ok - trackpoint(): Remove trailing zeros in {'sec'} decimals -ok - trackpoint(): Missing {'format'}, return undef -ok - trackpoint(): Missing {'what'}, return undef -ok - trackpoint(): Missing {'error'}, return undef -# Testing output from ../gpst -# Read empty input (/dev/null)... -ok - "../gpst ' | ../gpst" - Don’t print empty trackpoints -ok - "echo ' ' | ../gpst" - Don’t print empty trackpoints (stderr) -# Testing --chronology option... -ok - "../gpst --chronology chronology-error.gpsml" - Check for chronology errors and duplicated times -ok - "../gpst --chronology chronology-error.gpsml" - Check for chronology errors and duplicated times (stderr) -# Testing --skip-dups option... -ok - "../gpst -d no_signal.mayko" - Remove duplicated positions from gpsml -ok - "../gpst -d no_signal.mayko" - Remove duplicated positions from gpsml (stderr) -ok - "../gpst -d -o csv no_signal.mayko" - Remove duplicated positions from csv output format -ok - "../gpst -d -o csv no_signal.mayko" - Remove duplicated positions from csv output format (stderr) -ok - "../gpst -d -o clean no_signal.mayko" - Remove duplicated positions from clean output format -ok - "../gpst -d -o clean no_signal.mayko" - Remove duplicated positions from clean output format (stderr) -ok - "../gpst -d -o pgtab no_signal.mayko" - Remove duplicated positions from pgtab output format -ok - "../gpst -d -o pgtab no_signal.mayko" - Remove duplicated positions from pgtab output format (stderr) -# Testing --epoch option... -ok - "../gpst -e pause.gpx" - --epoch is ignored in gpsml output -ok - "../gpst -e pause.gpx" - --epoch is ignored in gpsml output (stderr) -not ok - "../gpst -e -o gpx pause.gpx" - --epoch is ignored in gpx output -# Failed test '"../gpst -e -o gpx pause.gpx" - --epoch is ignored in gpx output' -# at ./run-tests.pl line 2127. -# got: ' -# -# -# -# 25.260 -# 24.931 -# 27.975 -# 31.017 -# 30.980 -# 30.538 -# 30.515 -# 31.936 -# 31.794 -# -# -# -# ' -# expected: ' -# -# -# ACTIVE LOG164705 -# -# 25.260 -# 24.931 -# 27.975 -# 31.017 -# 30.980 -# 30.538 -# 30.515 -# 31.936 -# 31.794 -# -# -# -# ' -ok - "../gpst -e -o gpx pause.gpx" - --epoch is ignored in gpx output (stderr) -# Testing --fix option... -ok - "../gpst --fix --chronology chronology-error.gpsml" - Remove bad timestamps -ok - "../gpst --fix --chronology chronology-error.gpsml" - Remove bad timestamps (stderr) -# Testing --from-date option... -# Testing -h (--help) option... -ok - "../gpst -h" - Option -h prints help screen -ok - "../gpst -h" - Option -h prints help screen (stderr) -ok - "../gpst -h" - No Id with only -h -# Testing --inside option... -ok - "../gpst --pos1 2.11,2.12 --pos2 3.31,3.32 --inside multitrack-pause.gpx" - Check --inside option (gpx to gpst) -ok - "../gpst --pos1 2.11,2.12 --pos2 3.31,3.32 --inside multitrack-pause.gpx" - Check --inside option (gpx to gpst) (stderr) -# Testing --undefined option... -# Testing --near option... -# Testing --output option... -ok - "../gpst log.mcsv" - Read Mapsource TAB-separated format -ok - "../gpst log.mcsv" - Read Mapsource TAB-separated format (stderr) -ok - "../gpst two-digit_year.mcsv" - Read Mapsource TAB-separated format with two-digit year -ok - "../gpst two-digit_year.mcsv" - Read Mapsource TAB-separated format with two-digit year (stderr) -ok - "../gpst log.gpstxt" - Read Garmin serial text format -ok - "../gpst log.gpstxt" - Read Garmin serial text format (stderr) -ok - "../gpst log.dos.mayko" - Read DOS-formatted Mayko format -ok - "../gpst log.dos.mayko" - Read DOS-formatted Mayko format (stderr) -ok - "../gpst log.dos.gpstxt" - Read DOS-formatted Garmin serial text format -ok - "../gpst log.dos.gpstxt" - Read DOS-formatted Garmin serial text format (stderr) -ok - "../gpst log.unix.mcsv" - Read UNIX-formatted Garmin Mapsource TAB-separated format -ok - "../gpst log.unix.mcsv" - Read UNIX-formatted Garmin Mapsource TAB-separated format (stderr) -ok - "../gpst multitrack.gpx" - Read GPX file with multiple tracks -ok - "../gpst multitrack.gpx" - Read GPX file with multiple tracks (stderr) -ok - "../gpst compact.gpx" - Read GPX one-liner -ok - "../gpst compact.gpx" - Read GPX one-liner (stderr) -ok - "../gpst missing.gpsml" - Read gpsml with various data missing -ok - "../gpst missing.gpsml" - Read gpsml with various data missing (stderr) -ok - "../gpst different_dateformats.gpsml" - Read different date formats from gpsml file -ok - "../gpst different_dateformats.gpsml" - Read different date formats from gpsml file (stderr) -ok - "../gpst multitrack-pause.gpx" - Should be equal to multitrack-pause.gpsml -ok - "../gpst multitrack-pause.gpx" - Should be equal to multitrack-pause.gpsml (stderr) -ok - "../gpst -o gpx no_signal.mayko" - Output GPX from Mayko file with duplicates -ok - "../gpst -o gpx no_signal.mayko" - Output GPX from Mayko file with duplicates (stderr) -ok - "../gpst -o gpx comments.mayko" - Output GPX from Mayko file with commented-out lines -ok - "../gpst -o gpx comments.mayko" - Output GPX from Mayko file with commented-out lines (stderr) -not ok - "../gpst -o gpx missing.gpsml" - Output GPX from gpsml with missing data -# Failed test '"../gpst -o gpx missing.gpsml" - Output GPX from gpsml with missing data' -# at ./run-tests.pl line 2127. -# got: ' -# -# -# -# -# 483 -# 485 -# 486 -# 484 -# 486 -# 490 -# 487 -# -# -# -# ' -# expected: ' -# -# -# Missing various elements -# -# -# 483 -# 485 -# 486 -# 484 -# 486 -# 490 -# 487 -# -# -# -# ' -ok - "../gpst -o gpx missing.gpsml" - Output GPX from gpsml with missing data (stderr) -ok - "../gpst -o xgraph multitrack.gpx" - Output xgraph format from GPX -ok - "../gpst -o xgraph multitrack.gpx" - Output xgraph format from GPX (stderr) -ok - "../gpst -o pgtab compact.gpx" - Output pgtab from gpx format -ok - "../gpst -o pgtab compact.gpx" - Output pgtab from gpx format (stderr) -ok - "../gpst -o pgtab no_signal.mayko" - Output pgtab from mayko format -ok - "../gpst -o pgtab no_signal.mayko" - Output pgtab from mayko format (stderr) -ok - "../gpst -o pgtab missing.gpsml" - Output pgtab from missing.gpsml -ok - "../gpst -o pgtab missing.gpsml" - Output pgtab from missing.gpsml (stderr) -ok - "../gpst -o csv log.dos.mayko" - Output csv from DOS-formatted Mayko format -ok - "../gpst -o csv log.dos.mayko" - Output csv from DOS-formatted Mayko format (stderr) -ok - "../gpst -o pgwtab multitrack.gpx" - Test pgwtab format -ok - "../gpst -o pgwtab multitrack.gpx" - Test pgwtab format (stderr) -ok - "../gpst -o pgwupd multitrack.gpx" - Test pgwupd format -ok - "../gpst -o pgwupd multitrack.gpx" - Test pgwupd format (stderr) -ok - "../gpst -t -o clean pause.gpx" - Output clean format with time breaks -ok - "../gpst -t -o clean pause.gpx" - Output clean format with time breaks (stderr) -# Testing --outside option... -ok - "../gpst --pos1 2.11,2.12 --pos2 3.31,3.32 --outside multitrack-pause.gpx" - Check --outside option (gpx to gpst) -ok - "../gpst --pos1 2.11,2.12 --pos2 3.31,3.32 --outside multitrack-pause.gpx" - Check --outside option (gpx to gpst) (stderr) -# Testing --pos1 and --pos2 options... -# Testing --require option... -ok - "../gpst -re multitrack.gpx" - Require elevation from GPX data -ok - "../gpst -re multitrack.gpx" - Require elevation from GPX data (stderr) -ok - "../gpst -re one_ele.dos.gpsml" - Require elevation from gpsml -ok - "../gpst -re one_ele.dos.gpsml" - Require elevation from gpsml (stderr) -ok - "../gpst -re missing.gpsml" - Require elevation -ok - "../gpst -re missing.gpsml" - Require elevation (stderr) -ok - "../gpst -rt missing.gpsml" - Require time -ok - "../gpst -rt missing.gpsml" - Require time (stderr) -ok - "../gpst -rp missing.gpsml" - Require position -ok - "../gpst -rp missing.gpsml" - Require position (stderr) -ok - "../gpst -ret missing.gpsml" - Require elevation and time -ok - "../gpst -ret missing.gpsml" - Require elevation and time (stderr) -ok - "../gpst -retp missing.gpsml" - Require elevation, time and position -ok - "../gpst -retp missing.gpsml" - Require elevation, time and position (stderr) -ok - "../gpst -rep missing.gpsml" - Require elevation and position -ok - "../gpst -rep missing.gpsml" - Require elevation and position (stderr) -# Testing --round option... -ok - "../gpst -R lat=4,lon=5,ele=1 pause.gpx" - --round works with lat, lon, ele from gpx -ok - "../gpst -R lat=4,lon=5,ele=1 pause.gpx" - --round works with lat, lon, ele from gpx (stderr) -ok - "../gpst -R lat=3,lon=3,ele=1 -o pgtab pause.gpx" - pgtab output from gpx works with --round lat, lon, ele -ok - "../gpst -R lat=3,lon=3,ele=1 -o pgtab pause.gpx" - pgtab output from gpx works with --round lat, lon, ele (stderr) -ok - "../gpst -R lat=3,lon=3,ele=1 -o pgwtab multitrack.gpx" - --round works with lat, lon, ele from gpx, pgwtab output -ok - "../gpst -R lat=3,lon=3,ele=1 -o pgwtab multitrack.gpx" - --round works with lat, lon, ele from gpx, pgwtab output (stderr) -ok - "../gpst -R lat=3,lon=3,ele=1 -o pgwupd multitrack.gpx" - pgwupd output and --round works with lat, lon, ele from gpx -ok - "../gpst -R lat=3,lon=3,ele=1 -o pgwupd multitrack.gpx" - pgwupd output and --round works with lat, lon, ele from gpx (stderr) -# Testing --short-date option... -# Testing --save-to-file option... -# Testing --create-breaks option... -ok - "../gpst -t pause.gpx" - Output gpsml with elements from GPX files -ok - "../gpst -t pause.gpx" - Output gpsml with elements from GPX files (stderr) -ok - "../gpst -t multitrack-pause.gpx" - Insert between gpx tracks -ok - "../gpst -t multitrack-pause.gpx" - Insert between gpx tracks (stderr) -ok - "../gpst -t multitrack-pause.gpsml" - Insert between gpsml titles -ok - "../gpst -t multitrack-pause.gpsml" - Insert between gpsml titles (stderr) -# Testing -T (--time-shift) option... -ok - "../gpst -T 3600 multitrack-pause.gpx" - Add one hour to GPX input, output gpsml -ok - "../gpst -T 3600 multitrack-pause.gpx" - Add one hour to GPX input, output gpsml (stderr) -ok - "../gpst -T -3600 multitrack-pause.gpx" - Subtract one hour from GPX input, output gpsml -ok - "../gpst -T -3600 multitrack-pause.gpx" - Subtract one hour from GPX input, output gpsml (stderr) -ok - "../gpst -T 1 -o gpx multitrack-pause.gpx" - Add one second to GPX input, output GPX -ok - "../gpst -T 1 -o gpx multitrack-pause.gpx" - Add one second to GPX input, output GPX (stderr) -ok - "../gpst --time-shift -1 -o gpx multitrack-pause.gpsml" - Subtract one second from gpsml input, output GPX, use long option -ok - "../gpst --time-shift -1 -o gpx multitrack-pause.gpsml" - Subtract one second from gpsml input, output GPX, use long option (stderr) -ok - "../gpst -T 0 -o pgtab multitrack-pause.gpx" - Read GPX, time-shift 0 seconds, output pgtab -ok - "../gpst -T 0 -o pgtab multitrack-pause.gpx" - Read GPX, time-shift 0 seconds, output pgtab (stderr) -# Testing -v (--verbose) option... -ok - "../gpst -hv" - Option --version with -h returns Id string and help screen -ok - "../gpst -hv" - Option --version with -h returns Id string and help screen (stderr) -# Testing --version option... -ok - "../gpst --version" - Option --version returns Id string -ok - "../gpst --version" - Option --version returns Id string (stderr) -# Testing --strip-whitespace option... -not ok - "../gpst -w -o gpx pause.gpx" - Strip whitespace from GPX output -# Failed test '"../gpst -w -o gpx pause.gpx" - Strip whitespace from GPX output' -# at ./run-tests.pl line 2127. -# got: ' -# -# -# -# 25.260 -# 24.931 -# 27.975 -# 31.017 -# 30.980 -# 30.538 -# 30.515 -# 31.936 -# 31.794 -# -# -# -# ' -# expected: ' -# -# -# ACTIVE LOG164705 -# -# 25.260 -# 24.931 -# 27.975 -# 31.017 -# 30.980 -# 30.538 -# 30.515 -# 31.936 -# 31.794 -# -# -# -# ' -ok - "../gpst -w -o gpx pause.gpx" - Strip whitespace from GPX output (stderr) -ok - "../gpst -o gpx -w comments.mayko" - Output whitespace-stripped GPX from Mayko file with commented-out lines -ok - "../gpst -o gpx -w comments.mayko" - Output whitespace-stripped GPX from Mayko file with commented-out lines (stderr) -ok - "../gpst -w -o pgwupd multitrack.gpx" - Strip whitespace from pgwupd output -ok - "../gpst -w -o pgwupd multitrack.gpx" - Strip whitespace from pgwupd output (stderr) -# Testing --double-y-scale option... -ok - "../gpst -y -o clean pause.gpx" - Double y scale, clean output from gpx format -ok - "../gpst -y -o clean pause.gpx" - Double y scale, clean output from gpx format (stderr) -ok - "../gpst -y -o clean log.dos.mayko" - Double y scale, clean output from mayko format -ok - "../gpst -y -o clean log.dos.mayko" - Double y scale, clean output from mayko format (stderr) -# Testing --debug option... -# Strip error from Mayko format... -ok - "../gpst -o csv date_error.mayko" - Strip error from mayko format in csv output -ok - "../gpst -o csv date_error.mayko" - Strip error from mayko format in csv output (stderr) -ok - "../gpst -o clean date_error.mayko" - Strip error from mayko format in clean output -ok - "../gpst -o clean date_error.mayko" - Strip error from mayko format in clean output (stderr) -ok - "../gpst -o gpsml date_error.mayko" - Strip error from mayko format in gpsml output -ok - "../gpst -o gpsml date_error.mayko" - Strip error from mayko format in gpsml output (stderr) -ok - "../gpst -o gpx date_error.mayko" - Strip error from mayko format in gpx output -ok - "../gpst -o gpx date_error.mayko" - Strip error from mayko format in gpx output (stderr) -ok - "../gpst -o gpstrans date_error.mayko" - Strip error from mayko format in gpstrans output -ok - "../gpst -o gpstrans date_error.mayko" - Strip error from mayko format in gpstrans output (stderr) -ok - "../gpst -o pgtab date_error.mayko" - Strip error from mayko format in pgtab output -ok - "../gpst -o pgtab date_error.mayko" - Strip error from mayko format in pgtab output (stderr) -ok - "../gpst -o poscount date_error.mayko" - Strip error from mayko format in poscount output -ok - "../gpst -o poscount date_error.mayko" - Strip error from mayko format in poscount output (stderr) -ok - "../gpst -o xgraph date_error.mayko" - Strip error from mayko format in xgraph output -ok - "../gpst -o xgraph date_error.mayko" - Strip error from mayko format in xgraph output (stderr) -ok - "../gpst -o ygraph date_error.mayko" - Strip error from mayko format in ygraph output -ok - "../gpst -o ygraph date_error.mayko" - Strip error from mayko format in ygraph output (stderr) -# Testing finished. -1..233 -# Looks like you failed 3 tests of 233. diff --git a/branches/gpst.postgis/tests/log/todo-tests.log b/branches/gpst.postgis/tests/log/todo-tests.log deleted file mode 100644 index efd074d..0000000 --- a/branches/gpst.postgis/tests/log/todo-tests.log +++ /dev/null @@ -1,195 +0,0 @@ -ok - use GPST; -ok - use GPSTdate; -ok - use GPSTdebug; -ok - use GPSTgeo; -ok - use GPSTxml; -# ========== Executing "run-tests.pl --todo" ========== -# Running TODO tests... -not ok - "../gpst -o csv multitrack.gpx" - Output csv format from multitrack.gpx # TODO Remove extra \n in the beginning -# Failed (TODO) test '"../gpst -o csv multitrack.gpx" - Output csv format from multitrack.gpx' -# at ./run-tests.pl line 2127. -# got: ' -# 2003-02-11T23:35:39Z -0.1448824 51.4968266 -# 2003-02-11T23:35:49Z -0.1449938 51.4968227 -# 2003-02-11T23:36:14Z -0.1453202 51.4969040 -# -# 2003-02-11T23:36:16Z -0.1453398 51.4969214 -# 2003-02-11T23:36:31Z -0.1455514 51.4969816 -# 2003-02-11T23:36:43Z -0.1457489 51.4970224 1000 -# 2003-02-11T23:36:50Z -0.1457804 51.4970452 -# -# 2003-02-11T23:37:05Z -0.1458608 51.4970680 -# 2003-02-11T23:37:22Z -0.1460047 51.4971658 -# 2003-02-11T23:37:36Z -0.1461614 51.4972469 -# -# 2003-02-11T23:37:43Z -0.1462394 51.4972731 -# 2003-02-11T23:38:04Z -0.1463232 51.4973437 -# 2003-02-11T23:38:28Z -0.1462949 51.4973337 -# 2003-02-11T23:38:34Z -0.1462825 51.4973218 -# 2003-02-11T23:38:35Z -0.1462732 51.4973145 -# ' -# expected: '2003-02-11T23:35:39Z -0.1448824 51.4968266 -# 2003-02-11T23:35:49Z -0.1449938 51.4968227 -# 2003-02-11T23:36:14Z -0.1453202 51.4969040 -# -# 2003-02-11T23:36:16Z -0.1453398 51.4969214 -# 2003-02-11T23:36:31Z -0.1455514 51.4969816 -# 2003-02-11T23:36:43Z -0.1457489 51.4970224 1000 -# 2003-02-11T23:36:50Z -0.1457804 51.4970452 -# -# 2003-02-11T23:37:05Z -0.1458608 51.4970680 -# 2003-02-11T23:37:22Z -0.1460047 51.4971658 -# 2003-02-11T23:37:36Z -0.1461614 51.4972469 -# -# 2003-02-11T23:37:43Z -0.1462394 51.4972731 -# 2003-02-11T23:38:04Z -0.1463232 51.4973437 -# 2003-02-11T23:38:28Z -0.1462949 51.4973337 -# 2003-02-11T23:38:34Z -0.1462825 51.4973218 -# 2003-02-11T23:38:35Z -0.1462732 51.4973145 -# ' -ok - "../gpst -o csv multitrack.gpx" - Output csv format from multitrack.gpx (stderr) # TODO Remove extra \n in the beginning -not ok - "../gpst -o csv pause.gpx" - Output csv format from pause.gpx # TODO Remove extra \n in the beginning -# Failed (TODO) test '"../gpst -o csv pause.gpx" - Output csv format from pause.gpx' -# at ./run-tests.pl line 2127. -# got: ' -# 2006-05-21T16:49:11Z 5.299534 60.425494 25.260 -# 2006-05-21T16:49:46Z 5.299610 60.425464 24.931 -# 2006-05-21T16:52:04Z 5.299694 60.425314 27.975 -# 2006-05-21T16:56:36Z 5.299741 60.425384 31.017 -# 2006-05-21T16:56:47Z 5.299958 60.425339 30.980 -# 2006-05-21T16:56:56Z 5.299640 60.425238 30.538 -# 2006-05-21T16:57:03Z 5.299686 60.425246 30.515 -# 2006-05-21T16:59:08Z 5.299773 60.425345 31.936 -# 2006-05-21T17:00:54Z 5.299419 60.425457 31.794 -# ' -# expected: '2006-05-21T16:49:11Z 5.299534 60.425494 25.260 -# 2006-05-21T16:49:46Z 5.299610 60.425464 24.931 -# 2006-05-21T16:52:04Z 5.299694 60.425314 27.975 -# 2006-05-21T16:56:36Z 5.299741 60.425384 31.017 -# 2006-05-21T16:56:47Z 5.299958 60.425339 30.980 -# 2006-05-21T16:56:56Z 5.299640 60.425238 30.538 -# 2006-05-21T16:57:03Z 5.299686 60.425246 30.515 -# 2006-05-21T16:59:08Z 5.299773 60.425345 31.936 -# 2006-05-21T17:00:54Z 5.299419 60.425457 31.794 -# ' -ok - "../gpst -o csv pause.gpx" - Output csv format from pause.gpx (stderr) # TODO Remove extra \n in the beginning -not ok - "../gpst -e -o csv pause.gpx" - csv format with epoch seconds from gpx # TODO Remove extra \n in the beginning -# Failed (TODO) test '"../gpst -e -o csv pause.gpx" - csv format with epoch seconds from gpx' -# at ./run-tests.pl line 2127. -# got: ' -# 1148230151 5.299534 60.425494 25.260 -# 1148230186 5.299610 60.425464 24.931 -# 1148230324 5.299694 60.425314 27.975 -# 1148230596 5.299741 60.425384 31.017 -# 1148230607 5.299958 60.425339 30.980 -# 1148230616 5.299640 60.425238 30.538 -# 1148230623 5.299686 60.425246 30.515 -# 1148230748 5.299773 60.425345 31.936 -# 1148230854 5.299419 60.425457 31.794 -# ' -# expected: '1148230151 5.299534 60.425494 25.260 -# 1148230186 5.299610 60.425464 24.931 -# 1148230324 5.299694 60.425314 27.975 -# 1148230596 5.299741 60.425384 31.017 -# 1148230607 5.299958 60.425339 30.980 -# 1148230616 5.299640 60.425238 30.538 -# 1148230623 5.299686 60.425246 30.515 -# 1148230748 5.299773 60.425345 31.936 -# 1148230854 5.299419 60.425457 31.794 -# ' -ok - "../gpst -e -o csv pause.gpx" - csv format with epoch seconds from gpx (stderr) # TODO Remove extra \n in the beginning -not ok - "../gpst -o gpx multitrack-pause.gpsml" - Should be equal to multitrack-pause.gpx # TODO Tweak output -# Failed (TODO) test '"../gpst -o gpx multitrack-pause.gpsml" - Should be equal to multitrack-pause.gpx' -# at ./run-tests.pl line 2127. -# got: ' -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# ' -# expected: ' -# -# -# track1 -# -# -# -# -# -# -# -# track2 -# -# -# -# -# -# -# -# -# -# -# -# track3 -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# ' -ok - "../gpst -o gpx multitrack-pause.gpsml" - Should be equal to multitrack-pause.gpx (stderr) # TODO Tweak output -GPX: Cannot open file '/home/sunny/gps/waypoints.gpx'! -not ok - list_nearest_waypoints() # TODO Fix it. -# Failed (TODO) test 'list_nearest_waypoints()' -# at ./run-tests.pl line 2099. -# '' -# doesn't match '(?-xism:^\(.*,.*,.*\)$)' -# Testing finished. -1..14 diff --git a/branches/gpst.postgis/tests/missing.gpsml b/branches/gpst.postgis/tests/missing.gpsml deleted file mode 100644 index 9956675..0000000 --- a/branches/gpst.postgis/tests/missing.gpsml +++ /dev/null @@ -1,20 +0,0 @@ - - - -Missing various elements - - 60.42352 - 60.42353 5.34185 - 5.34187 483 - 485 - 60.42347 5.34212 486 - 5.34224 484 - 486 - Missing everything - - 60.42339 - 5.34262 - 60.42339 490 - 60.42338 5.34269 487 - - diff --git a/branches/gpst.postgis/tests/multitrack-pause.gpsml b/branches/gpst.postgis/tests/multitrack-pause.gpsml deleted file mode 100644 index 1133753..0000000 --- a/branches/gpst.postgis/tests/multitrack-pause.gpsml +++ /dev/null @@ -1,28 +0,0 @@ - - - -track1 - 1.11 1.12 - 1.21 1.22 - 1.31 1.32 - -track2 - 2.11 2.12 - 2.21 2.22 - 2.31 2.32 - 2.41 2.42 - - 2.451 2.452 - -track3 - 3.11 3.12 - 3.21 3.22 - 3.31 3.32 - - 3.41 3.42 - 3.51 3.52 - 3.61 3.62 - 3.71 3.72 - 3.81 3.82 - - diff --git a/branches/gpst.postgis/tests/multitrack-pause.gpx b/branches/gpst.postgis/tests/multitrack-pause.gpx deleted file mode 100644 index df92af6..0000000 --- a/branches/gpst.postgis/tests/multitrack-pause.gpx +++ /dev/null @@ -1,44 +0,0 @@ - - - - track1 - - - - - - - - track2 - - - - - - - - - - - - track3 - - - - - - - - - - - - - - diff --git a/branches/gpst.postgis/tests/multitrack.gpx b/branches/gpst.postgis/tests/multitrack.gpx deleted file mode 100644 index c4577af..0000000 --- a/branches/gpst.postgis/tests/multitrack.gpx +++ /dev/null @@ -1,81 +0,0 @@ - - - - 0-Meridian - 11-FEB-03 15:46 - 11-FEB-03 15:46 - - - 34.492798 - Abbey Road - Det hellige gangfeltet der Beatles valsa over. - 26-FEB-06 17:29:46 - - - 2469.012939 - - Galdhøpiggen med ', &, < og >. ☺ - Her er det &, < og >. ☺ - Schwæra greie - http://www.example.org/ - Waypoint - mountain - - - Halfdan Griegs vei - 04-AUG-02 19:42 - 04-AUG-02 19:42 - - - Leicester Square - 11-FEB-03 18:00 - 11-FEB-03 18:00 - - - Leira camping - 03-OKT-02 21:58 - 03-OKT-02 21:58 - - - Track 1 - - - - - - - - - Track 2 - - - - 1000 - - - - - Track 3 - - - - - - - - Track 4 - - - - - - - - - diff --git a/branches/gpst.postgis/tests/no_signal.mayko b/branches/gpst.postgis/tests/no_signal.mayko deleted file mode 100644 index 21bb9c8..0000000 --- a/branches/gpst.postgis/tests/no_signal.mayko +++ /dev/null @@ -1,10 +0,0 @@ -xmaplog 1.0 Mon Dec 23 02:00:50 2002 -1 70.6800486 23.6746151 57.4 0 12/22/2002 21:42:24 -1 70.6799322 23.6740038 6.3 0 12/22/2002 21:42:32 -1 70.6796266 23.6723991 6.0 0 12/22/2002 21:42:54 -1 70.6796266 23.6723991 0.0 0 12/22/2002 21:43:51 -1 70.6796266 23.6723991 0.0 0 12/22/2002 21:43:52 -1 70.6796266 23.6723991 0.0 0 12/22/2002 21:43:54 -1 70.6800774 23.6757566 5.1 0 12/22/2002 21:44:45 -1 70.6801502 23.6753442 4.8 0 12/22/2002 21:44:52 -1 70.6801905 23.6757542 2.5 0 12/22/2002 21:45:04 diff --git a/branches/gpst.postgis/tests/one_ele.dos.gpsml b/branches/gpst.postgis/tests/one_ele.dos.gpsml deleted file mode 100644 index 5f69d87..0000000 --- a/branches/gpst.postgis/tests/one_ele.dos.gpsml +++ /dev/null @@ -1,12 +0,0 @@ - - - -Only one point has elevation - 60.425494 5.299534 - 60.425464 5.29961 - 60.425314 5.299694 27.975 - 60.425384 5.299741 - 60.425339 5.299958 - 60.425238 5.29964 - - diff --git a/branches/gpst.postgis/tests/pause.gpx b/branches/gpst.postgis/tests/pause.gpx deleted file mode 100644 index ab163ea..0000000 --- a/branches/gpst.postgis/tests/pause.gpx +++ /dev/null @@ -1,44 +0,0 @@ - - - - ACTIVE LOG164705 - - - 25.260 - - - - 24.931 - - - - 27.975 - - - - 31.017 - - - - 30.980 - - - - 30.538 - - - - 30.515 - - - - 31.936 - - - - 31.794 - - - - - diff --git a/branches/gpst.postgis/tests/run-tests.pl b/branches/gpst.postgis/tests/run-tests.pl deleted file mode 100755 index edaf161..0000000 --- a/branches/gpst.postgis/tests/run-tests.pl +++ /dev/null @@ -1,2319 +0,0 @@ -#!/usr/bin/perl -w - -#======================================================================= -# $Id$ -# Test suite for gpst(1). -# -# Character set: UTF-8 -# ©opyleft 2006– Øyvind A. Holm -# License: GNU General Public License version 2 or later, see end of -# file for legal stuff. -#======================================================================= - -BEGIN { - push(@INC, "$ENV{'HOME'}/bin/src/gpstools"); - our @version_array; - use Test::More qw{no_plan}; - use_ok(GPST); - use_ok(GPSTdate); - use_ok(GPSTdebug); - use_ok(GPSTgeo); - use_ok(GPSTxml); -} - -use strict; -use Getopt::Long; - -$| = 1; - -our $Debug = 0; -our $CMD = "../gpst"; - -our %Opt = ( - - 'all' => 0, - 'debug' => 0, - 'help' => 0, - 'todo' => 0, - 'verbose' => 0, - 'version' => 0, - -); - -our $progname = $0; -$progname =~ s/^.*\/(.*?)$/$1/; - -my $rcs_id = '$Id$'; -my $id_date = $rcs_id; -$id_date =~ s/^.*?\d+ (\d\d\d\d-.*?\d\d:\d\d:\d\d\S+).*/$1/; - -push(@main::version_array, $rcs_id); - -my @cmdline_array = @ARGV; - -Getopt::Long::Configure("bundling"); -GetOptions( - - "all|a" => \$Opt{'all'}, - "debug" => \$Opt{'debug'}, - "help|h" => \$Opt{'help'}, - "todo|t" => \$Opt{'todo'}, - "verbose|v+" => \$Opt{'verbose'}, - "version" => \$Opt{'version'}, - -) || die("$progname: Option error. Use -h for help.\n"); - -our %Cmd = ( - 'gpsbabel' => 'gpsbabel', -); - -$Opt{'debug'} && ($Debug = 1); -$Opt{'help'} && usage(0); -if ($Opt{'version'}) { - print_version(); - exit(0); -} - -diag(sprintf("========== Executing \"%s%s%s\" ==========", - $progname, - scalar(@cmdline_array) ? " " : "", - join(" ", @cmdline_array))); - -chomp(my $gpx_header = < - -END -my $stripped_gpx_header = $gpx_header; -$stripped_gpx_header =~ s/^\s*(.*)$/$1/mg; - -if ($Opt{'todo'} && !$Opt{'all'}) { - goto todo_section; -} - -=pod - -testcmd("$CMD command", # {{{ - <"), - "<&>", - "txt_to_xml(\"<&>\")"); -is(txt_to_xml("first line\nsecond <\rthird\r\n<&>"), - "first line\nsecond <\rthird\r\n<&>", - "txt_to_xml() with multiline string"); - -is(xml_to_txt("abc"), - "abc", - "xml_to_txt(\"abc\")"); -is(xml_to_txt("<&>"), - "<&>", - "xml_to_txt(\"<&>\")"); -is(xml_to_txt("first line\nsecond <\rthird\r\n<&>"), - "first line\nsecond <\rthird\r\n<&>", - "xml_to_txt() with multiline string"); - -# txt_to_xml() and xml_to_txt() }}} -# postgresql_copy_safe() {{{ - -is(postgresql_copy_safe(""), - "", - "postgresql_copy_safe() with empty string"); - -is(postgresql_copy_safe("abcæøåÆØÅ"), - "abcæøåÆØÅ", - "postgresql_copy_safe(\"abcæøåÆØÅ\")"); - -is(postgresql_copy_safe("abc\t'\r\n"), - "abc\\t'\\r\\n", - "postgresql_copy_safe(\"abc\\t'\\r\\n\")"); - -is(postgresql_copy_safe("¤%/&gurgle\t325\\wer\ndfv'\r!\"#\n%\twe\r\x00sdf\xFFsadc\n\t\x00sdc\n"), - "¤%/&gurgle\\t325\\\\wer\\ndfv'\\r!\"#\\n%\\twe\\r\x00sdf\xFFsadc\\n\\t\x00sdc\\n", - "postgresql_copy_safe() with multiline, nulls and stuff"); - -# postgresql_copy_safe() }}} - -diag("Testing date routines..."); - -# sec_to_string() {{{ - -is(sec_to_string(1148220825), - "2006-05-21 14:13:45", - "sec_to_string() without separator"); -is(sec_to_string(1148220825, "T"), - "2006-05-21T14:13:45", - "sec_to_string() with separator"); -is(sec_to_string(-5000), - undef, - "sec_to_string(-5000) — negative numbers unsupported atm"); -is(sec_to_string(""), - undef, - "sec_to_string(\"\")"); -is(sec_to_string("pH()rtY tW0"), - undef, - "sec_to_string() with invalid string"); -is(sec_to_string("00000000000000000000001148220825"), - "2006-05-21 14:13:45", - "sec_to_string() with a bunch of leading zeros"); -is(sec_to_string("1148220825.93"), - "2006-05-21 14:13:45.93", - "sec_to_string() with decimals"); -is(sec_to_string("000000000000000000000000000001148220825.7312"), - "2006-05-21 14:13:45.7312", - "sec_to_string() with decimals and prefixing zeros"); -is(sec_to_string("1148220825.93000"), - "2006-05-21 14:13:45.93", - "sec_to_string() with decimals and extra trailing zeros"); -is(sec_to_string(".863"), - "1970-01-01 00:00:00.863", - "sec_to_string() with missing zero before decimal point"); - -# sec_to_string() }}} -# sec_to_readable() {{{ - -is(sec_to_readable(0), - "0:00:00:00", - "sec_to_readable(0)"); -is(sec_to_readable("pH()rtY tW0"), - undef, - "sec_to_readable() with invalid string"); -is(sec_to_readable(86400), - "1:00:00:00", - "sec_to_readable(86400)"); -is(sec_to_readable(86400*1000), - "1000:00:00:00", - "sec_to_readable(86400*1000)"); -is(sec_to_readable(86400+7200+180+4), - "1:02:03:04", - "sec_to_readable(86400+7200+180+4)"); -is(sec_to_readable("3.14"), - "0:00:00:03.14", - "sec_to_readable(\"3.14\")"); -is(sec_to_readable("-124"), - undef, - "sec_to_readable() rejects negative numbers"); -is(sec_to_readable("-2.34"), - undef, - "sec_to_readable() rejects negative decimal"); -is(sec_to_readable(".87"), - "0:00:00:00.87", - "sec_to_readable(), missing zero before decimal point"); -is(sec_to_readable(""), - "0:00:00:00", - "sec_to_readable() with empty string"); - -# sec_to_readable() }}} - -diag("Testing geo routines..."); - -# ddd_to_dms() {{{ - -is(ddd_to_dms("12.34567"), - "12\xB020'44.4\"", - "ddd_to_dms(\"12.34567\")"); - -is(ddd_to_dms("0"), - "0\xB000'00.0\"", - "ddd_to_dms(\"0\")"); - -is(ddd_to_dms(""), - "0\xB000'00.0\"", - "ddd_to_dms(\"\")"); - -is(ddd_to_dms("pH()rtY tW0"), - undef, - "ddd_to_dms(\"pH()rtY tW0\")"); - -is(ddd_to_dms("-12.34567"), - "-12\xB020'44.4\"", - "ddd_to_dms(\"-12.34567\")"); - -is(ddd_to_dms("0.34567"), - "0\xB020'44.4\"", - "ddd_to_dms(\"0.34567\")"); - -is(ddd_to_dms(".34567"), - "0\xB020'44.4\"", - "ddd_to_dms(\".34567\")"); - -is(ddd_to_dms("-.34567"), - "-0\xB020'44.4\"", - "ddd_to_dms(\"-.34567\")"); - -is(ddd_to_dms("-0.34567"), - "-0\xB020'44.4\"", - "ddd_to_dms(\"-0.34567\")"); - -is(ddd_to_dms("180"), - "180\xB000'00.0\"", - "ddd_to_dms(\"180\")"); - -is(ddd_to_dms("-180"), - "-180\xB000'00.0\"", - "ddd_to_dms(\"-180\")"); - -is(ddd_to_dms("-1"), - "-1\xB000'00.0\"", - "ddd_to_dms(\"-1\")"); - -is(ddd_to_dms("2-3"), - undef, - "ddd_to_dms(\"2-3\")"); - -# ddd_to_dms() }}} - -diag("Testing trackpoint()..."); # {{{ - -my %Dat = (); - -is(trackpoint(%Dat), - undef, - "trackpoint() receives empty hash"); - -my %Bck = ( - # {{{ - 'format' => 'gpsml', - 'year' => '2003', - 'month' => '06', - 'day' => '13', - 'hour' => '14', - 'min' => '36', - 'sec' => '10', - 'lat' => '59.5214', - 'lon' => '7.392133', - 'ele' => '762', - 'error' => "", - 'what' => 'tp', - # }}} -); - -# trackpoint() (gpsml) {{{ -%Dat = %Bck; -is( - trackpoint(%Dat), - " 59.5214 7.392133 762 \n", - "trackpoint() (gpsml)" -); - -# trackpoint() (gpsml) }}} -# trackpoint() (gpx) {{{ -%Dat = %Bck; -$Dat{'format'} = "gpx"; -is( - trackpoint(%Dat), - qq{ 762 \n}, - "trackpoint() (gpx)" -); - -# trackpoint() (gpx) }}} - -# trackpoint(): Various loop tests {{{ - -for my $Elem (qw{format lat lon what}) { - my %Dat = %Bck; - - $Dat{"$Elem"} = '2d'; - is(trackpoint(%Dat), - undef, - "trackpoint(): {'$Elem'} with invalid value (\"$Dat{$Elem}\") returns undef" - ); - -} - -for my $Elem (qw{year month day hour min sec}) { - # Date tests {{{ - my %Dat; - - %Dat = %Bck; - $Dat{"$Elem"} = ''; - is(trackpoint(%Dat), - " 59.5214 7.392133 762 \n", - "trackpoint(): {'$Elem'} with empty value skips time" - ); - - %Dat = %Bck; - $Dat{"$Elem"} = '2d'; - is(trackpoint(%Dat), - " 59.5214 7.392133 762 \n", - "trackpoint(): {'$Elem'} with invalid value (\"$Dat{$Elem}\") skips time" - ); - - %Dat = %Bck; - $Dat{$Elem} = "00000$Dat{$Elem}"; - is(trackpoint(%Dat), - " 59.5214 7.392133 762 \n", - "trackpoint(): Strip prefixing zeros from {'$Elem'}" - ); - - %Dat = %Bck; - $Dat{"$Elem"} = 0-$Dat{$Elem}; - is(trackpoint(%Dat), - " 59.5214 7.392133 762 \n", - "trackpoint(): {'$Elem'} is negative, skip time" - ); - - if ($Elem ne "sec") { - %Dat = %Bck; - $Dat{"$Elem"} = "$Dat{$Elem}.00"; - is(trackpoint(%Dat), - " 59.5214 7.392133 762 \n", - "trackpoint(): Decimals in {'$Elem'}, skip time" - ); - } - - # Date tests }}} -} - -%Dat = %Bck; -$Dat{'sec'} = "$Dat{'sec'}.00"; -is(trackpoint(%Dat), - " 59.5214 7.392133 762 \n", - "trackpoint(): Remove trailing zeros in {'sec'} decimals" -); - -for my $Elem (qw{format what error}) { - my %Dat = %Bck; - $Dat{$Elem} = undef; - is(trackpoint(%Dat), - undef, - "trackpoint(): Missing {'$Elem'}, return undef" - ); -} - -# Various loop tests }}} - -# trackpoint() }}} - -diag("Testing output from ../gpst"); - -diag("Read empty input (/dev/null)..."); # {{{ -testcmd("../gpst - - - - -END - "", - "Read from /dev/null", -); - -# }}} -testcmd("../gpst -o gpx - - - - -END - "", - "Output gpx from /dev/null", -); - -# }}} -# empty input }}} -diag("Read empty files..."); # {{{ -testcmd("echo ' ' | ../gpst", # {{{ - < - - - - -END - "", - "Don’t print empty trackpoints", -); - -# }}} -# Read empty files }}} -diag("Testing --chronology option..."); # {{{ -testcmd("../gpst --chronology chronology-error.gpsml", # {{{ - < - - -Chronology errors - 60.45369 5.31559 95 - 60.45353 5.31548 94 - 60.45353 5.31561 94 - - 60.45369 5.31597 Out of chronology - -0:00:37:54 - 60.45418 5.31517 92 - 60.45407 5.31542 91 - 60.45401 5.31543 98 - 60.45401 5.31543 98 - 60.45395 5.31544 103 - 60.45391 5.31545 107 - - -END - "gpst: chronology-error.gpsml: \"2006-05-02T09:46:46Z\": Next date is 0:00:06:39 in the past (2006-05-02T09:40:07Z)\n" . - "gpst: chronology-error.gpsml: \"2006-05-02T10:18:09Z\": Duplicated time\n", - "Check for chronology errors and duplicated times", -); - -# }}} -# --chronology option }}} -diag("Testing --skip-dups option..."); # {{{ -testcmd("../gpst -d no_signal.mayko", # {{{ - < - - - 70.6800486 23.6746151 - 70.6799322 23.6740038 - 70.6796266 23.6723991 - 70.6796266 23.6723991 - 70.6796266 23.6723991 - 70.6796266 23.6723991 - 70.6800774 23.6757566 - 70.6801502 23.6753442 - 70.6801905 23.6757542 - - -END - "", - "Remove duplicated positions from gpsml", -); - -# }}} -testcmd("../gpst -d -o csv no_signal.mayko", # {{{ - < - - -ACTIVE LOG164705 - 60.425494 5.299534 25.26 - 60.425464 5.29961 24.931 - 60.425314 5.299694 27.975 - 60.425384 5.299741 31.017 - 60.425339 5.299958 30.98 - 60.425238 5.29964 30.538 - 60.425246 5.299686 30.515 - 60.425345 5.299773 31.936 - 60.425457 5.299419 31.794 - - -END - "", - "--epoch is ignored in gpsml output", -); - -# }}} -testcmd("../gpst -e -o gpx pause.gpx", # {{{ - < - ACTIVE LOG164705 - - 25.260 - 24.931 - 27.975 - 31.017 - 30.980 - 30.538 - 30.515 - 31.936 - 31.794 - - - -END - "", - "--epoch is ignored in gpx output", -); - -# }}} -# --epoch option }}} -diag("Testing --fix option..."); # {{{ -testcmd("../gpst --fix --chronology chronology-error.gpsml", # {{{ - < - - -Chronology errors - 60.45369 5.31559 95 - 60.45353 5.31548 94 - 60.45353 5.31561 94 - - 60.45369 5.31597 Out of chronology - -0:00:37:54 - 60.45418 5.31517 92 - 60.45407 5.31542 91 - 60.45401 5.31543 98 - 60.45401 5.31543 98 - 60.45395 5.31544 103 - 60.45391 5.31545 107 - - -END - "gpst: chronology-error.gpsml: \"2006-05-02T09:46:46Z\": Next date is 0:00:06:39 in the past (2006-05-02T09:40:07Z)\n" . - "gpst: chronology-error.gpsml: \"2006-05-02T10:18:09Z\": Duplicated time\n", - "Remove bad timestamps", -); - -# }}} -# --fix option }}} -diag("Testing --from-date option..."); # {{{ -# --from-date option }}} -diag("Testing -h (--help) option..."); -likecmd("$CMD -h", # {{{ - '/ Show this help\./', - '/^$/', - "Option -h prints help screen", -); - -# }}} -ok(`$CMD -h` !~ /\$Id: /s, "\"$CMD -h\" - No Id with only -h"); -# --help option }}} -diag("Testing --inside option..."); # {{{ -testcmd("../gpst --pos1 2.11,2.12 --pos2 3.31,3.32 --inside multitrack-pause.gpx", # {{{ - < - - -track1 - -track2 - 2.11 2.12 - 2.21 2.22 - 2.31 2.32 - 2.41 2.42 - - 2.451 2.452 - -track3 - 3.11 3.12 - 3.21 3.22 - 3.31 3.32 - - -END - "", - "Check --inside option (gpx to gpst)", -); -# }}} - -# --inside option }}} -diag("Testing --undefined option..."); # {{{ -# --undefined option }}} -diag("Testing --near option..."); # {{{ -# --near option }}} -diag("Testing --output option..."); # {{{ -# gpsml (Default) -testcmd("../gpst log.mcsv", # {{{ - < - - - -ACTIVE LOG 125 - 54.96883 -1.62439 77 - 54.96878 -1.62413 77 - 54.96913 -1.62616 77 - 54.96934 -1.62624 77.5 - 54.96934 -1.62596 78 - 54.96931 -1.62645 78 - 54.96918 -1.62603 79 - 54.96901 -1.62364 76.1 - 54.96922 -1.6254 76.1 - 54.96914 -1.62526 75.1 - 54.96911 -1.62494 75.1 - 54.9693 -1.62489 75.1 - 54.96901 -1.62496 75.1 - 54.96871 -1.62466 74.6 - 54.96908 -1.62488 72.7 - -ACTIVE LOG 126 - 54.96904 -1.62482 72.7 - 54.96913 -1.62499 71.3 - 54.96904 -1.62497 70.8 - 54.96913 -1.62496 71.8 - 54.96924 -1.62501 72.2 - 54.9694 -1.62521 71.8 - 54.96916 -1.62515 71.3 - 54.96921 -1.625 71.3 - 54.96801 -1.62417 71.8 - -ACTIVE LOG 127 - 54.96887 -1.62504 70.8 - 54.96898 -1.62476 69.8 - 54.9691 -1.62475 69.4 - 54.96918 -1.62468 70.3 - 54.9692 -1.62465 69.4 - 54.96924 -1.62462 71.8 - 54.96928 -1.62463 71.8 - 54.96945 -1.62466 69.4 - - -END - "", - "Read Mapsource TAB-separated format", -); - -# }}} -testcmd("../gpst two-digit_year.mcsv", # {{{ - < - - - -ACTIVE LOG 032 - 60.41324 5.33352 14 - 60.38802 5.33845 18 - 60.38709 5.3379 19 - 60.38641 5.33732 18 - 60.38581 5.33647 18 - 60.38516 5.33528 15 - 60.38495 5.3349 13 - - -END - "", - "Read Mapsource TAB-separated format with two-digit year", -); - -# }}} -testcmd("../gpst log.gpstxt", # {{{ - < - - - 59.521517 7.391867 762 - 59.5214 7.392133 762 - 59.5213 7.392417 761 - 59.521183 7.3927 761 - - 59.52085 7.393517 760 - 59.520733 7.393783 760 - 59.52065 7.39405 760 - 59.520583 7.394333 760 - 59.520533 7.394633 759 - 59.520483 7.394917 759 - 59.520433 7.395233 759 - - 59.520283 7.396233 758 - 59.520233 7.39655 758 - 59.520183 7.396883 757 - 59.520133 7.397217 757 - 59.5201 7.397567 757 - - -END - "", - "Read Garmin serial text format", -); - -# }}} -testcmd("../gpst log.dos.mayko", # {{{ - < - - - 58.1818158 8.1225077 - 58.1818712 8.12532 - 58.1816347 8.1266031 - 58.1812099 8.1284612 - 58.1810315 8.129395 - 58.1809621 8.13074 - - -END - "", - "Read DOS-formatted Mayko format", -); - -# }}} -testcmd("../gpst log.dos.gpstxt", # {{{ - < - - - 66.908167 15.022983 11472 - 66.90625 15.020667 11472 - 66.904317 15.01835 11472 - 66.9024 15.016017 11473 - 66.900483 15.0137 11474 - 66.898567 15.011383 11474 - 66.896633 15.009067 11475 - 66.894717 15.006733 11475 - 66.8928 15.004417 11475 - 66.890867 15.0021 11475 - 66.88895 14.999783 11475 - - -END - "", - "Read DOS-formatted Garmin serial text format", -); - -# }}} -testcmd("../gpst log.unix.mcsv", # {{{ - < - - - -ACTIVE LOG 058 - 60.36662 5.24885 31.9 - 60.37057 5.22956 35.2 - 60.37019 5.22817 39.6 - 60.37012 5.2279 41 - 60.37009 5.22682 47.2 - 60.37011 5.22641 49.2 - 60.37011 5.22607 50.1 - 60.37002 5.22568 51.1 - 60.3701 5.22548 52.5 - - -END - "", - "Read UNIX-formatted Garmin Mapsource TAB-separated format", -); - -# }}} -testcmd("../gpst multitrack.gpx", # {{{ - < - - -Track 1 - 51.4968266 -0.1448824 - 51.4968227 -0.1449938 - 51.496904 -0.1453202 - -Track 2 - 51.4969214 -0.1453398 - 51.4969816 -0.1455514 - 51.4970224 -0.1457489 1000 - 51.4970452 -0.1457804 - -Track 3 - 51.497068 -0.1458608 - 51.4971658 -0.1460047 - 51.4972469 -0.1461614 - -Track 4 - 51.4972731 -0.1462394 - 51.4973437 -0.1463232 - 51.4973337 -0.1462949 - 51.4973218 -0.1462825 - 51.4973145 -0.1462732 - - -END - "", - "Read GPX file with multiple tracks", -); - -# }}} -testcmd("../gpst compact.gpx", # {{{ - < - - -All whitespace stripped - 70.660932 23.7028354 - 70.6609392 23.7028468 - 70.6609429 23.7028499 - 70.6609381 23.702862 - 70.6609368 23.7028648 - 70.6609344 23.7028652 - 70.6609349 23.7028707 - 70.6609348 23.7028654 - 70.6609347 23.7028599 - 70.6609348 23.7028609 - 70.6609388 23.7028653 - 70.6609426 23.7028732 - - -END - "", - "Read GPX one-liner", -); - -# }}} -testcmd("../gpst missing.gpsml", # {{{ - < - - -Missing various elements - - 60.42352 - 60.42353 5.34185 - 5.34187 483 - 485 - 60.42347 5.34212 486 - 5.34224 484 - 486 - Missing everything - 60.42339 - 5.34262 - 60.42339 490 - 60.42338 5.34269 487 - - -END - "", - "Read gpsml with various data missing", -); - -# }}} -testcmd("../gpst different_dateformats.gpsml", # {{{ - < - - -Date format variations - 1 1 - 2 2 - 3 3 - 4 4 - - -END - "", - "Read different date formats from gpsml file", -); - -# }}} -testcmd("../gpst multitrack-pause.gpx", # {{{ - file_data("multitrack-pause.gpsml"), - "", - "Should be equal to multitrack-pause.gpsml", -); - -# }}} -# gpx -testcmd("../gpst -o gpx no_signal.mayko", # {{{ - < - - - - - - - - - - - - - -END - "", - "Output GPX from Mayko file with duplicates", -); - -# }}} -testcmd("../gpst -o gpx comments.mayko", # {{{ - < - - - - - - - - - - - - - - - -END - "", - "Output GPX from Mayko file with commented-out lines", -); - -# }}} -testcmd("../gpst -o gpx missing.gpsml", # {{{ - < - Missing various elements - - - 483 - 485 - 486 - 484 - 486 - 490 - 487 - - - -END - "", - "Output GPX from gpsml with missing data", -); - -# }}} -# xgraph -testcmd("../gpst -o xgraph multitrack.gpx", # {{{ - <. ☺\t2469.012939\tmountain\t2006-05-08T18:27:59Z\tHer er det &, < og >. ☺\tSchwæra greie\thttp://www.example.org/\tWaypoint -(60.397460000,5.350610000)\tHalfdan Griegs vei\t\\N\t\\N\t\\N\t04-AUG-02 19:42\t04-AUG-02 19:42\t\\N\t\\N -(51.510130000,-0.130410000)\tLeicester Square\t\\N\t\\N\t\\N\t11-FEB-03 18:00\t11-FEB-03 18:00\t\\N\t\\N -(60.968540000,9.285350000)\tLeira camping\t\\N\t\\N\t\\N\t03-OKT-02 21:58\t03-OKT-02 21:58\t\\N\t\\N -END - "", - "Test pgwtab format", -); - -# }}} -# pgwupd -testcmd("../gpst -o pgwupd multitrack.gpx", # {{{ - < coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(51.477880000,-0.001470000) <-> coor) < 0.05; -COMMIT; -BEGIN; - UPDATE logg SET sted = clname(coor) WHERE (point(51.532030,-0.177330) <-> coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(51.532030,-0.177330) <-> coor) < 0.05; -COMMIT; -BEGIN; - UPDATE logg SET sted = clname(coor) WHERE (point(61.636684,8.312254) <-> coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(61.636684,8.312254) <-> coor) < 0.05; -COMMIT; -BEGIN; - UPDATE logg SET sted = clname(coor) WHERE (point(60.397460000,5.350610000) <-> coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(60.397460000,5.350610000) <-> coor) < 0.05; -COMMIT; -BEGIN; - UPDATE logg SET sted = clname(coor) WHERE (point(51.510130000,-0.130410000) <-> coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(51.510130000,-0.130410000) <-> coor) < 0.05; -COMMIT; -BEGIN; - UPDATE logg SET sted = clname(coor) WHERE (point(60.968540000,9.285350000) <-> coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(60.968540000,9.285350000) <-> coor) < 0.05; -COMMIT; -END - "", - "Test pgwupd format", -); - -# }}} -# clean -testcmd("../gpst -t -o clean pause.gpx", # {{{ - < - - -track1 - 1.11 1.12 - 1.21 1.22 - 1.31 1.32 - -track2 - -track3 - - 3.41 3.42 - 3.51 3.52 - 3.61 3.62 - 3.71 3.72 - 3.81 3.82 - - -END - "", - "Check --outside option (gpx to gpst)", -); - -# }}} -# --outside option }}} -diag("Testing --pos1 and --pos2 options..."); # {{{ -# --pos1 and --pos2 options }}} -diag("Testing --require option..."); # {{{ -testcmd("../gpst -re multitrack.gpx", # {{{ - < - - -Track 1 - -Track 2 - 51.4970224 -0.1457489 1000 - -Track 3 - -Track 4 - - -END - "", - "Require elevation from GPX data", -); - -# }}} -testcmd("../gpst -re one_ele.dos.gpsml", # {{{ - < - - -Only one point has elevation - 60.425314 5.299694 27.975 - - -END - "", - "Require elevation from gpsml", -); - -# }}} -testcmd("../gpst -re missing.gpsml", # {{{ - < - - -Missing various elements - 5.34187 483 - 485 - 60.42347 5.34212 486 - 5.34224 484 - 486 - 60.42339 490 - 60.42338 5.34269 487 - - -END - "", - "Require elevation", -); - -# }}} -testcmd("../gpst -rt missing.gpsml", # {{{ - < - - -Missing various elements - - 60.42352 - 60.42353 5.34185 - 5.34187 483 - 485 - 60.42339 490 - 60.42338 5.34269 487 - - -END - "", - "Require time", -); - -# }}} -testcmd("../gpst -rp missing.gpsml", # {{{ - < - - -Missing various elements - 60.42353 5.34185 - 60.42347 5.34212 486 - 60.42338 5.34269 487 - - -END - "", - "Require position", -); - -# }}} -testcmd("../gpst -ret missing.gpsml", # {{{ - < - - -Missing various elements - 5.34187 483 - 485 - 60.42339 490 - 60.42338 5.34269 487 - - -END - "", - "Require elevation and time", -); - -# }}} -testcmd("../gpst -retp missing.gpsml", # {{{ - < - - -Missing various elements - 60.42338 5.34269 487 - - -END - "", - "Require elevation, time and position", -); - -# }}} -testcmd("../gpst -rep missing.gpsml", # {{{ - < - - -Missing various elements - 60.42347 5.34212 486 - 60.42338 5.34269 487 - - -END - "", - "Require elevation and position", -); - -# }}} -# --require option }}} -diag("Testing --round option..."); # {{{ -testcmd("../gpst -R lat=4,lon=5,ele=1 pause.gpx", # {{{ - < - - -ACTIVE LOG164705 - 60.4255 5.29953 25.3 - 60.4255 5.29961 24.9 - 60.4253 5.29969 28 - 60.4254 5.29974 31 - 60.4253 5.29996 31 - 60.4252 5.29964 30.5 - 60.4252 5.29969 30.5 - 60.4253 5.29977 31.9 - 60.4255 5.29942 31.8 - - -END - "", - "--round works with lat, lon, ele from gpx", -); - -# }}} -testcmd("../gpst -R lat=3,lon=3,ele=1 -o pgtab pause.gpx", # {{{ - <. ☺\t2469\tmountain\t2006-05-08T18:27:59Z\tHer er det &, < og >. ☺\tSchwæra greie\thttp://www.example.org/\tWaypoint -(60.397,5.351)\tHalfdan Griegs vei\t\\N\t\\N\t\\N\t04-AUG-02 19:42\t04-AUG-02 19:42\t\\N\t\\N -(51.51,-0.13)\tLeicester Square\t\\N\t\\N\t\\N\t11-FEB-03 18:00\t11-FEB-03 18:00\t\\N\t\\N -(60.969,9.285)\tLeira camping\t\\N\t\\N\t\\N\t03-OKT-02 21:58\t03-OKT-02 21:58\t\\N\t\\N -END - "", - "--round works with lat, lon, ele from gpx, pgwtab output", -); - -# }}} -testcmd("../gpst -R lat=3,lon=3,ele=1 -o pgwupd multitrack.gpx", # {{{ - < coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(51.478,-0.001) <-> coor) < 0.05; -COMMIT; -BEGIN; - UPDATE logg SET sted = clname(coor) WHERE (point(51.532,-0.177) <-> coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(51.532,-0.177) <-> coor) < 0.05; -COMMIT; -BEGIN; - UPDATE logg SET sted = clname(coor) WHERE (point(61.637,8.312) <-> coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(61.637,8.312) <-> coor) < 0.05; -COMMIT; -BEGIN; - UPDATE logg SET sted = clname(coor) WHERE (point(60.397,5.351) <-> coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(60.397,5.351) <-> coor) < 0.05; -COMMIT; -BEGIN; - UPDATE logg SET sted = clname(coor) WHERE (point(51.51,-0.13) <-> coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(51.51,-0.13) <-> coor) < 0.05; -COMMIT; -BEGIN; - UPDATE logg SET sted = clname(coor) WHERE (point(60.969,9.285) <-> coor) < 0.05; - UPDATE logg SET dist = cldist(coor) WHERE (point(60.969,9.285) <-> coor) < 0.05; -COMMIT; -END - "", - "pgwupd output and --round works with lat, lon, ele from gpx", -); - -# }}} -# --round option }}} -diag("Testing --short-date option..."); # {{{ -# --short-date option }}} -diag("Testing --save-to-file option..."); # {{{ -# --save-to-file option }}} -diag("Testing --create-breaks option..."); # {{{ -testcmd("../gpst -t pause.gpx", # {{{ - < - - -ACTIVE LOG164705 - 60.425494 5.299534 25.26 - 60.425464 5.29961 24.931 -0:00:02:18 - 60.425314 5.299694 27.975 -0:00:04:32 - 60.425384 5.299741 31.017 - 60.425339 5.299958 30.98 - 60.425238 5.29964 30.538 - 60.425246 5.299686 30.515 -0:00:02:05 - 60.425345 5.299773 31.936 - 60.425457 5.299419 31.794 - - -END - "", - "Output gpsml with elements from GPX files", -); - -# }}} -testcmd("../gpst -t multitrack-pause.gpx", # {{{ - < - - -track1 - 1.11 1.12 - 1.21 1.22 - 1.31 1.32 - -track2 -0:23:59:58 - 2.11 2.12 - 2.21 2.22 - 2.31 2.32 -0:01:00:00 - 2.41 2.42 - - 2.451 2.452 - -track3 -1:01:00:03 - 3.11 3.12 - 3.21 3.22 - 3.31 3.32 - - 3.41 3.42 - 3.51 3.52 - 3.61 3.62 - 3.71 3.72 - 3.81 3.82 - - -END - "", - "Insert between gpx tracks", -); - -# }}} -testcmd("../gpst -t multitrack-pause.gpsml", # {{{ - < - - -track1 - 1.11 1.12 - 1.21 1.22 - 1.31 1.32 - -track2 -0:23:59:58 - 2.11 2.12 - 2.21 2.22 - 2.31 2.32 -0:01:00:00 - 2.41 2.42 - - 2.451 2.452 - -track3 -1:01:00:03 - 3.11 3.12 - 3.21 3.22 - 3.31 3.32 - - 3.41 3.42 - 3.51 3.52 - 3.61 3.62 - 3.71 3.72 - 3.81 3.82 - - -END - "", - "Insert between gpsml titles", -); - -# }}} -# --create-breaks option }}} -diag("Testing -T (--time-shift) option..."); -testcmd("$CMD -T 3600 multitrack-pause.gpx", # {{{ - < - - -track1 - 1.11 1.12 - 1.21 1.22 - 1.31 1.32 - -track2 - 2.11 2.12 - 2.21 2.22 - 2.31 2.32 - 2.41 2.42 - - 2.451 2.452 - -track3 - 3.11 3.12 - 3.21 3.22 - 3.31 3.32 - - 3.41 3.42 - 3.51 3.52 - 3.61 3.62 - 3.71 3.72 - 3.81 3.82 - - -END - "", - "Add one hour to GPX input, output gpsml", -); - -# }}} -testcmd("$CMD -T -3600 multitrack-pause.gpx", # {{{ - < - - -track1 - 1.11 1.12 - 1.21 1.22 - 1.31 1.32 - -track2 - 2.11 2.12 - 2.21 2.22 - 2.31 2.32 - 2.41 2.42 - - 2.451 2.452 - -track3 - 3.11 3.12 - 3.21 3.22 - 3.31 3.32 - - 3.41 3.42 - 3.51 3.52 - 3.61 3.62 - 3.71 3.72 - 3.81 3.82 - - -END - "", - "Subtract one hour from GPX input, output gpsml", -); - -# }}} -testcmd("$CMD -T 1 -o gpx multitrack-pause.gpx", # {{{ - < - - - - - - - - - - - - - - - - - - - - - - - - - - - - -END - "", - "Add one second to GPX input, output GPX", -); - -# }}} -testcmd("$CMD --time-shift -1 -o gpx multitrack-pause.gpsml", # {{{ - < - - - - - - - - - - - - - - - - - - - - - - - - - - - - -END - "", - "Subtract one second from gpsml input, output GPX, use long option", -); - -# }}} -testcmd("$CMD -T 0 -o pgtab multitrack-pause.gpx", # {{{ - < -ACTIVE LOG164705 - -25.260 -24.931 -27.975 -31.017 -30.980 -30.538 -30.515 -31.936 -31.794 - - - -END - "", - "Strip whitespace from GPX output", -); - - # }}} -testcmd("../gpst -o gpx -w comments.mayko", # {{{ - < - - - - - - - - - - - - - - - -END - "", - "Output whitespace-stripped GPX from Mayko file with commented-out lines", -); - -# }}} -testcmd("../gpst -w -o pgwupd multitrack.gpx", # {{{ - < coor) < 0.05; -UPDATE logg SET dist = cldist(coor) WHERE (point(51.477880000,-0.001470000) <-> coor) < 0.05; -COMMIT; -BEGIN; -UPDATE logg SET sted = clname(coor) WHERE (point(51.532030,-0.177330) <-> coor) < 0.05; -UPDATE logg SET dist = cldist(coor) WHERE (point(51.532030,-0.177330) <-> coor) < 0.05; -COMMIT; -BEGIN; -UPDATE logg SET sted = clname(coor) WHERE (point(61.636684,8.312254) <-> coor) < 0.05; -UPDATE logg SET dist = cldist(coor) WHERE (point(61.636684,8.312254) <-> coor) < 0.05; -COMMIT; -BEGIN; -UPDATE logg SET sted = clname(coor) WHERE (point(60.397460000,5.350610000) <-> coor) < 0.05; -UPDATE logg SET dist = cldist(coor) WHERE (point(60.397460000,5.350610000) <-> coor) < 0.05; -COMMIT; -BEGIN; -UPDATE logg SET sted = clname(coor) WHERE (point(51.510130000,-0.130410000) <-> coor) < 0.05; -UPDATE logg SET dist = cldist(coor) WHERE (point(51.510130000,-0.130410000) <-> coor) < 0.05; -COMMIT; -BEGIN; -UPDATE logg SET sted = clname(coor) WHERE (point(60.968540000,9.285350000) <-> coor) < 0.05; -UPDATE logg SET dist = cldist(coor) WHERE (point(60.968540000,9.285350000) <-> coor) < 0.05; -COMMIT; -END - "", - "Strip whitespace from pgwupd output", -); - -# }}} -# --strip-whitespace option }}} -diag("Testing --double-y-scale option..."); # {{{ -testcmd("../gpst -y -o clean pause.gpx", # {{{ - < - - - 60.4280897 5.5794667 - 60.4281867 5.5802255 - 103.4034054 129.7271053 - 60.428332 5.5813636 - 60.4283806 5.581743 - - -END - "", - "Strip error from mayko format in gpsml output", -); - -# }}} -testcmd("../gpst -o gpx date_error.mayko", # {{{ - < - - - - - - - - - - - -END - "", - "Strip error from mayko format in gpx output", -); - -# }}} -testcmd("../gpst -o gpstrans date_error.mayko", # {{{ - <); - close(FP); - return($Txt); - } else { - return undef; - } - # }}} -} - -sub print_version { - # Print program version {{{ - for (@main::version_array) { - print("$_\n"); - } - # }}} -} # print_version() - -sub usage { - # Send the help message to stdout {{{ - my $Retval = shift; - - if ($Opt{'verbose'}) { - print("\n"); - print_version(); - } - print(<= $verbose_level) { - print(STDERR "$progname: $Txt\n"); - } - # }}} -} # msg() - -__END__ - -# Plain Old Documentation (POD) {{{ - -=pod - -=head1 NAME - -run-tests.pl - -=head1 REVISION - -$Id$ - -=head1 SYNOPSIS - -run-tests.pl [options] [file [files [...]]] - -=head1 DESCRIPTION - -Contains tests for the gpst(1) program. - -=head1 OPTIONS - -=over 4 - -=item B<-a>, B<--all> - -Run all tests, also TODOs. - -=item B<-h>, B<--help> - -Print a brief help summary. - -=item B<-t>, B<--todo> - -Run only the TODO tests. - -=item B<-v>, B<--verbose> - -Increase level of verbosity. Can be repeated. - -=item B<--version> - -Print version information. - -=item B<--debug> - -Print debugging messages. - -=back - -=head1 AUTHOR - -Made by Øyvind A. Holm Ssunny@sunbase.orgE>. - -=head1 COPYRIGHT - -Copyleft © Øyvind A. Holm Esunny@sunbase.orgE -This is free software; see the file F for legalese stuff. - -=head1 LICENCE - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -=head1 SEE ALSO - -gpst(1) - -=cut - -# }}} - -# vim: set fenc=UTF-8 ft=perl fdm=marker ts=4 sw=4 sts=4 et fo+=w : -# End of file $Id$ diff --git a/branches/gpst.postgis/tests/testcmd b/branches/gpst.postgis/tests/testcmd deleted file mode 100644 index f091c3e..0000000 --- a/branches/gpst.postgis/tests/testcmd +++ /dev/null @@ -1,9 +0,0 @@ -testcmd("../gpst command", # {{{ - <