#! perl -w use strict; # # A program to produce a post-script plot of all the Landranger sheets, # complete with the GB coast line and the 100km grid sqaure letters. # Toby Thurston --- 7 Oct 2008 # use Geo::Coordinates::OSGB "ll_to_grid", "parse_landranger_grid", "format_grid_GPS"; use Getopt::Std; our $opt_a = 4; getopt('a'); # paper size... $opt_a = 4 unless $opt_a =~ /\A\d\Z/ && $opt_a < 6; my @sheets = (); my %squares = (); my $extreme_south = 200000; my $extreme_north = 0; my $extreme_west = 200000; my $extreme_east = 0; my $sheet_size = 40_000; my $GR_pattern = qr/^([A-Z][A-Z])(\d\d\d)(\d\d\d)$/; for my $sheet (1 .. 204) { # get the grid coordinates for the SW corner of the map my ($x, $y) = parse_landranger_grid($sheet); # put this sheet into the list of sheets push @sheets, sprintf "%f %f moveto currentpoint %d dup rectstroke %d dup rmoveto (%s) cshow\n", $x/1000, $y/1000, $sheet_size/1000, $sheet_size/2000, $sheet; # which grid squares does this sheet touch? for my $xx ($x, $x+$sheet_size-100) { for my $yy ($y, $y+$sheet_size-100) { my ($sq, $e, $n) = format_grid_GPS($xx,$yy); next if defined $squares{$sq}; $squares{$sq} = sprintf "%f %f moveto currentpoint 100 100 rectstroke 50 40 rmoveto (%s) cshow\n", ($xx-$e)/1000, ($yy-$n)/1000, $sq; } } # keep track of bounding box $extreme_east = $x if $x > $extreme_east; $extreme_west = $x if $x < $extreme_west; $extreme_north = $y if $y > $extreme_north; $extreme_south = $y if $y < $extreme_south; } # allow for most north-eastern sheets $extreme_east += $sheet_size; $extreme_south += $sheet_size; $extreme_north += $sheet_size*4; # allow for the top most grid square ... my $ew_range = $extreme_east-$extreme_west; my $ns_range = $extreme_north-$extreme_south; # size of the paper in mm my ($width, $height) = (148,210); $opt_a == 4 && (($width, $height) = (210,297)); $opt_a == 3 && (($width, $height) = (297,420)); $opt_a == 2 && (($width, $height) = (420,594)); $opt_a == 1 && (($width, $height) = (594,840)); $opt_a == 0 && (($width, $height) = (840,1188)); # convert to points and deduct margins (20pts) $width = int($width / 25.4 * 72 + 0.5) - 40; $height = int($height / 25.4 * 72 + 0.5) - 40; my $urx = $width + 20; my $ury = $height + 20; my $scale = 1000 * $width / $ew_range; my $h_scale = 1000 * $height / $ns_range; $scale = $h_scale if $h_scale < $scale; print << "PREAMBLE"; %!PS-Adobe-3.0 EPSF-3.0 %%Creator: $0 %%Copyright: (C) 2008 Toby Thurston %%Title:(Index to the Landranger Sheets) %%CreationDate: (17 Jan 2008) %%BoundingBox: 20 20 $urx $ury %%Pages: 1 %%EndComments %%BeginSetup /Large { /Helvetica 24 selectfont } def /small { /Helvetica 8 selectfont } def /cshow { /s exch def s stringwidth pop neg 2 div dup 0 exch 0 rmoveto s show rmoveto } def %%EndSetup %%Page: 1 1 %%BeginPageSetup /pgsave save def %%EndPageSetup small $scale dup scale 170 30 translate -120 0 850 1280 rectclip PREAMBLE # a file of longitude & latitude data in "matlab" format open GB, ") { chomp; my ($lon, $lat) = split; if ( $lon eq '#' ) { print "stroke\n"; $cmd = 'moveto' } else { my ($e, $n) = ll_to_grid($lat,$lon); printf "%.3f %.3f %s\n", $e/1000, $n/1000, $cmd; $cmd = 'lineto' if ($cmd eq 'moveto'); } } close GB; print "grestore\n"; print "gsave .6 1 .6 setrgbcolor\n"; for my $lon (-9 .. 2) { my ($e, $n) = ll_to_grid(49.95, $lon); printf "%.3f %.3f moveto gsave 2 0 rmoveto small ($lon) show /degree glyphshow grestore\n", $e/1000, $n/1000; for my $lat (500 .. 609) { ($e,$n) = ll_to_grid($lat/10, $lon); printf "%.3f %.3f lineto\n", $e/1000, $n/1000; } print "gsave 2 0 rmoveto small ($lon) show /degree glyphshow grestore stroke\n"; } for my $lat (51 .. 60) { my ($e, $n) = ll_to_grid($lat, -9.2); printf "%.3f %.3f moveto gsave -2 2 rmoveto small ($lat) show /degree glyphshow grestore\n", $e/1000, $n/1000; for my $lon (-91 .. 22) { ($e,$n) = ll_to_grid($lat, $lon/10); printf "%.3f %.3f lineto\n", $e/1000, $n/1000; } print "gsave 0 2 rmoveto small ($lat) show /degree glyphshow grestore stroke\n"; } print "grestore\n"; print "gsave Large 1 .6 .6 setrgbcolor\n"; print $squares{$_} for sort keys %squares; print "grestore\n"; print ".3 setlinewidth\n"; print @sheets; print "pgsave restore showpage\n%%EOF\n";