Provided by: libgeo-coordinates-osgb-perl_2.14-1_all bug

NAME

       Geo::Coordinates::OSGB::Grid - Format and parse British National Grid references

VERSION

       Examine $Geo::Coordinates::OSGB::Grid::VERSION for details.

SYNOPSIS

         use Geo::Coordinates::OSGB::Grid qw/parse_grid format_grid/;

         my ($e,$n) = parse_grid('TQ 23451 09893');
         my $gr     = format_grid($e, $n); # "TQ 234 098"

DESCRIPTION

       This module provides useful functions for parsing and formatting OSGB grid references.  Some detailed
       background is given in "background.pod" and on the OS web site.

SUBROUTINES AND METHODS

   Subroutines to generate grid references
       •   "random_grid([sheet1, sheet2, ...])"

           Takes  an  optional list of map sheet identifiers, and returns a random easting and northing for some
           place covered by one of the maps.  There's no guarantee that the point will not be in the sea, but it
           will be within the bounding box of one of the maps and it should be within one of the  areas  covered
           by the OSTN02 data set.

           If  you  omit the list of sheets, then one of map sheets defined in Geo::Coordinates::OSGB::Maps will
           be picked at random.

           As a convenience whole numbers in the range 1..204 will be interpreted as Landranger  sheets,  as  if
           you had written "A:1", "A:2", etc.

           Any  sheet  identifiers  in  the  list  that  are not defined in Geo::Coordinates::OSGB::Maps will be
           (silently) ignored.

           The easting and northing are returned as meters from the grid origin, so that they are  suitable  for
           input to the "format_grid" routines.

   Subroutines to format (easting, northing) pairs
       •   "format_grid(e, n)"

           Formats  an (easting, northing) pair into traditional `full national grid reference' with two letters
           and two sets of three numbers, like this `SU 387 147'.

               $gridref = format_grid(438710.908, 114792.248); # SU 387 147

           If you want the individual components call it in a list context.

               ($sq, $e, $n) = format_grid(438710.908, 114792.248); # ('SU', 387, 147)

           Note that rather than being rounded, the easting and northing are truncated to hectometres (as the OS
           system demands), so the grid reference refers to the lower left corner of the relevant  100m  square.
           The system is described below the legend on all OS Landranger maps.

       •   "format_grid(e, n, {form => 'SS EEE NNN', maps => 0, series => 'ABCHJ'})"

           The  format  grid  routine  takes  an  optional  third argument to control the form of grid reference
           returned.  This should be a hash reference with one or more of the keys shown above, with the default
           values.

           form    Controls the format of the grid reference.  With "$e, $n" set as above:

                       Format          produces        Format            produces
                       ----------------------------------------------------------------
                       'SS'            SU
                       'SSEN'          SU31            'SS E N'          SU 3 1
                       'SSEENN'        SU3814          'SS EE NN'        SU 38 14
                       'SSEEENNN'      SU387147        'SS EEE NNN'      SU 387 147
                       'SSEEEENNNN'    SU38711479      'SS EEEE NNNN'    SU 3871 1479
                       'SSEEEEENNNNN'  SU3871014792    'SS EEEEE NNNNN'  SU 38710 14792

                   You can't leave out the SS, you can't have N before E, and there must be the same  number  of
                   Es and Ns.

                   There are two other special formats:

                        form => 'TRAD' is equivalent to form => 'SS EEE NNN'
                        form => 'GPS'  is equivalent to form => 'SS EEEEE NNNNN'

                   In   a  list  context,  this  option  means  that  the  individual  components  are  returned
                   appropriately truncated as shown.  So with "SS EEE NNN" you get back "('SU', 387,  147)"  and
                   not "('SU', 387.10908, 147.92248)".  The format can be given as upper case or lower case or a
                   mixture.   If  you  want just the local easting and northing without the grid square, get the
                   individual parts in a list context and format them yourself:

                       my $gr = sprintf('Grid ref %2$s %3$s on Sheet %4$s', format_grid_landranger($e, $n))
                       # returns: Grid ref 387 147 on Sheet 196

           maps    Controls whether to include a list of map sheets after the grid reference.  Set it to  1  (or
                   any  true  value)  to  include  the list, and to 0 (or any false value) to leave it out.  The
                   default is "maps => 0".

                   In a scalar context you get back a string like this:

                       SU 387 147 on A:196, B:OL22E, C:180

                   In a list context you get back a list like this:

                       ('SU', 387, 147, A:196, B:OL22E, C:180)

           series  This option is only used when "maps" is true.  It controls which series of maps to include in
                   the list of sheets.  Currently the series included are:

                   "A" : OS Landranger 1:50000 maps

                   "B" : OS Explorer 1:25000 maps (some of these are designated as `Outdoor Leisure' maps)

                   "C" : OS Seventh Series One-Inch 1:63360 maps

                   "H" : Harvey British Mountain maps - mainly at 1:40000

                   "J" : Harvey Super Walker maps - mainly at 1:25000

                   so if you only want Explorer maps use: "series => 'B'", and if you want  only  Explorers  and
                   Landrangers use: "series => 'AB'", and so on.

                   Note  that  the  numbers  returned for the Harvey maps have been invented for the purposes of
                   this module.  They do not appear on the maps themselves; instead the maps have  titles.   You
                   can  use the numbers returned as an index to the data in Geo::Coordinates::OSGB::Maps to find
                   the appropriate title.

       •   "format_grid_trad(e,n)"

           Equivalent to "format_grid(e,n, { form => 'trad' })".

       •   "format_grid_GPS(e,n)"

           Equivalent to "format_grid(e,n, { form => 'gps' })".

       •   "format_grid_map(e,n)"

           Equivalent to "format_grid(e,n, { maps => 1 })".

       •   "format_grid_landranger(e,n)"

           Equivalent to

              format_grid(e,n,{ form => 'ss eee nnn', maps => 1, series => 'A' })

           except that the leading "A:" will be stripped from any sheet names returned, and you get  a  slightly
           fancier  set  of  phrases  in  a  scalar context depending on how many map numbers are in the list of
           sheets.

       For more examples of formatting look at the test files.

   Subroutines to extract (easting, northing) pairs from grid references
       •   "parse_grid"

           The "parse_grid" routine extracts a (easting, northing) pair from a string, or a list  of  arguments,
           representing a grid reference.  The pair returned are in units of metres from the false origin of the
           grid, so that you can pass them to "format_grid" or "grid_to_ll".

           The arguments should be in one of the following forms

           •       A single string representing a grid reference

                     String                        ->  interpreted as
                     --------------------------------------------------
                     parse_grid("TA 123 678")      ->  (512300, 467800)
                     parse_grid("TA 12345 67890")  ->  (512345, 467890)

                   The  spaces  are  optional  in all cases.  You can also refer to a 100km square as "TA" which
                   will return "(500000,400000)", a 10km square as "TA16" which will return "(510000,  460000)",
                   or  to  a  kilometre square as "TA1267" which gives "(512000, 467000)".  For completeness you
                   can also use "TA 1234 6789" to refer to a decametre square "(512340, 467890)" but  you  might
                   struggle to find a use for that one.

           •       A list representing a grid reference

                     List                             ->  interpreted as
                     -----------------------------------------------------
                     parse_grid('TA', 0, 0)           ->  (500000, 400000)
                     parse_grid('TA', 123, 678)       ->  (512300, 467800)
                     parse_grid('TA', 12345, 67890)   ->  (512345, 467890)
                     parse_grid('TA', '123 678')      ->  (512300, 467800)
                     parse_grid('TA', '12345 67890')  ->  (512345, 467890)

                   If you are processing grid references from some external data source beware that if you use a
                   list  with  bare  numbers  you may lose any leading zeros for grid references close to the SW
                   corner of a grid square.  This can lead to some ambiguity.   Either  make  the  numbers  into
                   strings  to preserve the leading digits or supply a hash of options as a fourth argument with
                   the `figs' option to define how many figures are supposed to be in each easting and northing.
                   Like this:

                     List                                     ->  interpreted as
                     -------------------------------------------------------------
                     parse_grid('TA', 123, 8)                 ->  (512300, 400800)
                     parse_grid('TA', 123, 8, { figs => 5 })  ->  (500123, 400008)

                   The default setting of figs is 3, which assumes you are using hectometres as in a traditional
                   grid reference.

           •       A string or list representing a map sheet and a grid reference on that sheet

                        Map input                      ->  interpreted as
                        ----------------------------------------------------
                        parse_grid('A:164/352194')     ->  (435200, 219400)
                        parse_grid('B:OL43E/914701')   ->  (391400, 570100)
                        parse_grid('B:OL43E 914 701')  ->  (391400, 570100)
                        parse_grid('B:OL43E','914701') ->  (391400, 570100)
                        parse_grid('B:OL43E',914,701)  ->  (391400, 570100)

                   Again spaces are optional, but you need some non-digit between the  map  identifier  and  the
                   grid  reference.   There are also some constraints: the map identifier must be one defined in
                   Geo::Coordinates::OSGB::Maps; and the following grid reference must actually be on the  given
                   sheet.   Note also that you need to supply a specific sheet for a map that has more than one.
                   The given example would fail if the map was given as `B:OL43', since that map has two sheets:
                   `B:OL43E' and `B:OL43W'.

                   If you give the identifier as just a number, it's assumed that you wanted a Landranger map;

                        parse_grid('176/224711')  ->  (522400, 171100)
                        parse_grid(164,513,62)    ->  (451300, 206200)

                   The routine  will  croak  of  you  pass  it  a  sheet  identifier  that  is  not  defined  in
                   Geo::Coordinates::OSGB::Maps.   It  will  also croak if the supplied easting and northing are
                   not actually on the sheet.

                   In earlier versions, the easting and northing arguments were optional, and  you  could  leave
                   them out to get just the SW corner of the sheet.  This functionality has been removed in this
                   version,  because  it's  not always obvious where the SW corner of a sheet is (for an example
                   look at the inset on Landranger sheet 107).

                   If you need access to the position of the sheets in this version, you  should  work  directly
                   with the data in Geo::Coordinates::OSGB::Maps.

       •   "parse_trad_grid(grid_ref)"

           This is included only for backward compatibility.  It is now just a synonym for "parse_grid".

       •   "parse_GPS_grid(grid_ref)"

           This is included only for backward compatibility.  It is now just a synonym for "parse_grid".

       •   "parse_landranger_grid(sheet, e, n)"

           This is included only for backward compatibility.  It is now just a synonym for "parse_grid".

       •   "parse_map_grid(sheet, e, n)"

           This is included only for backward compatibility.  It is now just a synonym for "parse_grid".

EXAMPLES

         use Geo::Coordinates::OSGB::Grid
            qw/parse_grid
               format_grid
               format_grid_landranger/;

         # Get full coordinates in metres from GR
         my ($e,$n) = parse_grid('TQ 23451 09893');

         # Reading and writing grid references
         # Format full easting and northing into traditional formats
         my $gr1 = format_grid($e, $n);                              # "TQ 234 098"
         my $gr2 = format_grid($e, $n, { form => 'SSEEENNN' } );     # "TQ234098"
         my $gr3 = format_grid($e, $n, { form => 'SSEEEEENNNNN'} );  # "TQ 23451 09893"
         my $gr4 = format_grid($e, $n, { form => 'gps'} );           # "TQ 23451 09893"
         my $gr5 = format_grid_landranger($e, $n);# "TQ 234 098 on Landranger sheet 198"

         # or call in list context to get the individual parts
         my ($sq, $ee, $nn) = format_grid($e, $n); # ('TQ', 234, 98)

         # parse routines to convert from these formats to full e,n
         ($e,$n) = parse_grid('TQ 234 098');
         ($e,$n) = parse_grid('TQ234098'); # spaces optional
         ($e,$n) = parse_grid('TQ',234,98); # or even as a list
         ($e,$n) = parse_grid('TQ 23451 09893'); # as above..

         # You can also get grid refs from individual maps.
         # Sheet between 1..204; gre & grn must be 3 or 5 digits long
         ($e,$n) = parse_grid(176,123,994);
         # put leading zeros in quotes
         ($e,$n) = parse_grid(196,636,'024');

       For more examples of parsing look at the test files.

BUGS AND LIMITATIONS

       The  useful area of these routines is confined to the British Isles, not including Ireland or the Channel
       Islands.  But very little range checking is done, so you can generate pseudo grid references  for  points
       that  are  some  way  outside  this  useful area.  The corners of this larger area run from 64.75N 32.33W
       (Iceland) to 65.8N 22.65E (Norway) to 44.5N 11.8E (Venice) to 44N 19.5W (the Western Approaches).

DIAGNOSTICS

   Messages from "format_grid"
       In case of error "format_grid" will die with a message.  Possible messages are:

       •   Format ... was not recognized

           The format code you supplied with "{ form => ... }" did not match any of the expected patterns.

       •   Too far off the grid: ...

           The (easting, northing) pair you supplied are too far away from the OS grid to be formatting  with  a
           valid grid square letter combination.

   Message from "parse_grid"
       In case of error "parse_grid" will die with one of the following messages:

       •   No easting or northing found

           This  means  you passed something more than a 2-letter grid square but there were no numbers found in
           the latter part of the string.

       •   Easting and northing have different lengths in ...

           The easting and northing you supply must have same length to avoid ambiguity.

       •   Too many digits in ...

           You have supplied more than 10 digits.

       •   Grid reference .... is not on sheet ...

           You can get this if you pass a map sheet identifier and a short grid ref, but the  grid  ref  is  not
           actually on that particular sheet.

       •   Failed to parse a grid reference from ...

           This is the catch all message issues if none of the patterns matches your input.

       If  you  get  an  expected result from any of these subroutines, please generate a test case to reproduce
       your result and get in touch to ask me about it.

CONFIGURATION AND ENVIRONMENT

       There is no configuration required either of these modules or your environment.  It should  work  on  any
       recent version of Perl better than 5.8, on any platform.

DEPENDENCIES

       Perl 5.08 or better.

INCOMPATIBILITIES

       None known.

LICENSE AND COPYRIGHT

       Copyright (C) 2002-2016 Toby Thurston

       OSTN02  transformation  data  included  in  this  module is freely available from the Ordnance Survey but
       remains Crown Copyright (C) 2002

       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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

AUTHOR

       Toby Thurston -- 10 Feb 2016

       toby@cpan.org

SEE ALSO

       See Geo::Coordinates::OSGB.

perl v5.22.1                                       2016-02-13                  Geo::Coordinates::OSGB::Grid(3pm)