--- gobook.perl 2010/09/21 03:11:07 1.2 +++ gobook.perl 2017/07/15 00:04:02 3.4 @@ -1,22 +1,26 @@ #! /usr/bin/perl -w +# $Id: gobook.perl,v 3.4 2017/07/15 00:04:02 philip Exp $ use XML::Simple; use strict; use PostScript::Simple; use Text::Wrap; $Text::Wrap::columns = 30; -my $strips; +#my $strips; -my $xml = "OmLand.xml"; -if ( defined $xml ){ - $strips = XMLin($xml, KeyAttr => {strip => 'id'}); -} +#my $xml = "OmLand.xml"; +#if ( defined $xml ){ +# $strips = XMLin($xml, KeyAttr => {strip => 'id'}); +#} + +my $strips = XMLin('OmLand.gpx'); + +# create a new PostScript object; -# create a new PostScript object -my $p = new PostScript::Simple(papersize => "A5", - colour => 1, - eps => 0, - units => "mm",); +my $p = new PostScript::Simple(papersize => "A5", + colour => 1, + eps => 0, + units => "mm"); # co-ords are horizontal, vertical. from bottom left corner. 148 x 210 @@ -53,7 +57,7 @@ $p->setcolour(60,28,0); $p->text(35,175, "Land-Out Guide"); $p->setfont("Helvetica", 17); $p->setcolour("white"); -$p->text(12,52, "2nd Edition 1st Revision 2009"); +$p->text(12,52, "5th Edition 2017"); $p->newpage; # Contents @@ -94,13 +98,11 @@ $p->text($t1,$v, "Photos by Gavin Wills. $v -= $ls; $p->text($t1,$v, "Text by Phil Plane and Gavin Wills. "); $v -= $ls; -$p->text($t1,$v, "Copyright GlideOmarama.com 2007."); +$p->text($t1,$v, "Copyright GlideOmarama.com 2013."); $v -= $ls; -$p->text($t1,$v, "First Edition published November 2007. "); +$p->text($t1,$v, "First Edition published November 2007."); $v -= $ls; -$p->text($t1,$v, "Second Edition published November 2008. "); -$v -= $ls; -$p->text($t1,$v, "Second Edition 1st Revision published November 2009. "); +$p->text($t1,$v, "Fifth Edition published February 2017."); $p->text(70,5, "(" . $pn++ . ")"); my $welcome = q{Produced for Omarama based glider pilots to assist safe emergency landings and satisfactory retrieves, this Guide and the associated South Island Gliding Maps (SIGMap) have been nearly 4 years in the making. Special thanks to Phil Plane, Chris Streat, Chris Rudge, Malcolm Walls and posthumously to Richard Halstead who started it all. @@ -444,36 +446,36 @@ $p->text(70,5, "(" . $pn++ . ")"); # Start the strip pages with pictures: -foreach my $stripnum ( sort keys %{$strips->{strip}} ){ - if ( $strips->{strip}->{$stripnum}->{gobook} eq "yes" ){ - $strips{$strips->{strip}->{$stripnum}->{name}} = $stripnum; +foreach my $stripnum ( sort keys %{$strips->{'wpt'}} ){ + if ( $strips->{'wpt'}->{$stripnum}->{'extensions'}->{gobook} eq "yes" ){ + $strips{$strips->{'wpt'}->{$stripnum}->{'desc'}} = $stripnum; # create a new page for the pic and data $p->newpage; $p->setcolour("blue"); $p->setfont("Helvetica", 20); - $p->text($t1,195, $strips->{strip}->{$stripnum}->{name}); + $p->text($t1,195, $strips->{'wpt'}->{$stripnum}->{'desc'}); $p->text($t1+115,195, $stripnum); $p->setcolour("black"); $p->setfont("Helvetica", 14); - if ( defined $strips->{strip}->{$stripnum}->{elev} ){ - $p->text($t5,195, $strips->{strip}->{$stripnum}->{elev} . 'ft'); + if ( defined $strips->{'wpt'}->{$stripnum}->{'ele'} ){ + $p->text($t5,195, printfeet($strips->{'wpt'}->{$stripnum}->{'ele'})); } - if ( defined $strips->{strip}->{$stripnum}->{length} ){ - $p->text($t6,195, $strips->{strip}->{$stripnum}->{length} . 'm'); + if ( defined $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'length'} ){ + $p->text($t6,195, $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'length'} . 'm'); } $p->setfont("Helvetica", 10); - my $latlng = $strips->{strip}->{$stripnum}->{lat} . " " . - $strips->{strip}->{$stripnum}->{lng}; + my $latlng = printlat($strips->{'wpt'}->{$stripnum}->{'lat'}) . " " . + printlon($strips->{'wpt'}->{$stripnum}->{'lon'}); $p->text($t1,190, $latlng); - if ( defined $strips->{strip}->{$stripnum}->{slope} ){ - $p->text($t1 + 45,190, 'Slope: ' . $strips->{strip}->{$stripnum}->{slope}); + if ( defined $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'slope'} ){ + $p->text($t1 + 45,190, 'Slope: ' . $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'slope'}); } - if ( defined $strips->{strip}->{$stripnum}->{surface} ){ - $p->text($t5 ,190, 'Sfc: ' . $strips->{strip}->{$stripnum}->{surface}); + if ( defined $strips->{'wpt'}->{$stripnum}->{'extensions'}->{surface} ){ + $p->text($t5 ,190, 'Sfc: ' . $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'surface'}); } - if ( defined $strips->{strip}->{$stripnum}->{width} ){ - $p->text($t6 ,190, 'Width: ' . $strips->{strip}->{$stripnum}->{width}); + if ( defined $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'width'} ){ + $p->text($t6 ,190, 'Width: ' . $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'width'}); } my $eps = "M" . $stripnum . ".ps"; @@ -487,17 +489,17 @@ foreach my $stripnum ( sort keys %{$stri else { $p->setcolour(255,54,0); # Glide Omarama Orange $p->setfont("Helvetica", 32); - $p->text({rotate => 45}, $t2 ,20, 'Details in next edition' ); + $p->text({rotate => 45}, $t2 ,20, 'No picture yet' ); $p->setcolour("black"); } my $v = 185; $p->setfont("Helvetica", 12); $p->text($t5,$v,"Location:"); - if ( defined $strips->{strip}->{$stripnum}->{location} ){ + if ( defined $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'location'} ){ $v -= 5; $Text::Wrap::columns = 30; - my @para = split (/\n/,wrap('', '', $strips->{strip}->{$stripnum}->{location})); + my @para = split (/\n/,wrap('', '', $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'location'})); while (my $ln = shift @para){ $p->text($t5,$v, $ln); $v -= 5; @@ -507,13 +509,17 @@ foreach my $stripnum ( sort keys %{$stri $v -= 10; $p->text($t5,$v,"Comment:"); - if ( defined $strips->{strip}->{$stripnum}->{comment} ){ + if ( defined $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'comment'} ){ $v -= 5; $Text::Wrap::columns = 30; - if ( $strips->{strip}->{$stripnum}->{comment} =~ /Danger/ ){ + if ( $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'comment'} =~ /Danger/ ){ $p->setcolour("red"); + # Draw over image ... + $p->setlinewidth(4); + $p->arc( 70, 60, 20, 0, 360); + $p->line(50,40, 90,80); } - my @para = split (/\n/,wrap('', '', $strips->{strip}->{$stripnum}->{comment})); + my @para = split (/\n/,wrap('', '', $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'comment'})); while (my $ln = shift @para){ $p->text($t5,$v, $ln); $v -= 5; @@ -524,10 +530,10 @@ foreach my $stripnum ( sort keys %{$stri $v -= 10; $p->text($t5,$v,"Alternate:"); - if ( defined $strips->{strip}->{$stripnum}->{alternate} ){ + if ( defined $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'alternate'} ){ $v -= 5; $Text::Wrap::columns = 30; - my @para = split (/\n/,wrap('', '', $strips->{strip}->{$stripnum}->{alternate})); + my @para = split (/\n/,wrap('', '', $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'alternate'})); while (my $ln = shift @para){ $p->text($t5,$v, $ln); $v -= 5; @@ -541,25 +547,25 @@ foreach my $stripnum ( sort keys %{$stri startpage(); $v = 185; -foreach my $stripnum ( sort keys %{$strips->{strip}} ){ - if ( $strips->{strip}->{$stripnum}->{gobook} eq "yes" ){ - $strips{$strips->{strip}->{$stripnum}->{name}} = $stripnum; +foreach my $stripnum ( sort keys %{$strips->{'wpt'}} ){ + if ( $strips->{'wpt'}->{$stripnum}->{'extensions'}->{gobook} eq "yes" ){ + $strips{$strips->{'wpt'}->{$stripnum}->{'desc'}} = $stripnum; $p->setfont("Helvetica-Bold", 12); $p->text($t1,$v, $stripnum); - $p->text($t2,$v, $strips->{strip}->{$stripnum}->{name}); + $p->text($t2,$v, $strips->{'wpt'}->{$stripnum}->{'desc'}); $p->setfont("Helvetica", 12); $v -= 8; $p->text($t1,$v,"Station:"); - if ( defined $strips->{strip}->{$stripnum}->{station} ){ - $p->text($t2,$v, $strips->{strip}->{$stripnum}->{station}); + if ( defined $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'station'} ){ + $p->text($t2,$v, $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'station'}); } $v -= 6; $p->text($t1,$v,"Contact:"); - if ( defined $strips->{strip}->{$stripnum}->{contact} ){ + if ( defined $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'contact'} ){ $Text::Wrap::columns = 50; - my @para = split (/\n/,wrap('', '', $strips->{strip}->{$stripnum}->{contact})); + my @para = split (/\n/,wrap('', '', $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'contact'})); while (my $ln = shift @para){ $p->text($t2,$v, $ln); $v -= 6; @@ -568,8 +574,8 @@ foreach my $stripnum ( sort keys %{$stri } $v -= 6; $p->text($t1,$v,"Retrieve:"); - if ( defined $strips->{strip}->{$stripnum}->{retrieve} ){ - $p->text($t2,$v, $strips->{strip}->{$stripnum}->{retrieve}); + if ( defined $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'retrieve'} ){ + $p->text($t2,$v, $strips->{'wpt'}->{$stripnum}->{'extensions'}->{'retrieve'}); } $v -= 8; @@ -601,6 +607,9 @@ foreach my $stripname ( sort keys %strip # write the output to a file $p->output("gobook.ps"); +# use ghostscript to convert to pdf ... +`gs -q -dNOPAUSE -dSAFER -dBATCH -sDEVICE=pdfwrite -sOutputFile=gobook.pdf gobook.ps`; + exit 0; sub startpage { @@ -618,3 +627,42 @@ sub newindex { $p->setfont("Helvetica", 12); } +sub printlat { + my $latitude = shift(@_); + my $minutes = 0; + my $degrees = 0; + my $northing = ""; + + if ($latitude < 0) { + $northing = "S"; + $latitude = 0 - $latitude; + } + else{ + $northing = "N"; + } + $degrees = int($latitude); + $minutes = ($latitude - $degrees) * 60; + return sprintf("%d:%06.3f%s",$degrees,$minutes,$northing); +} + +sub printlon { + my $longitude = shift(@_); + my $minutes = 0; + my $degrees = 0; + my $westing = ""; + if ($longitude < 0) { + $westing = "W"; + $longitude = 0 - $longitude; + } + else{ + $westing = "E"; + } + $degrees = int($longitude); + $minutes = ($longitude - $degrees) * 60; + return sprintf("%d:%06.3f%s",$degrees,$minutes,$westing); +} + +sub printfeet { + my $meters = shift(@_); + return sprintf("%d ft", int($meters * 3.2808399)); +}