NAME
   Geo::Google::PolylineEncoder - encode lat/lons to Google Maps Polylines

SYNOPSIS
     use Geo::Google::PolylineEncoder;

     my $points = [
                   { lat => 38.5, lon => -120.2 },
                   { lat => 40.7, lon => -120.95 },
                   { lat => 43.252, lon => -126.453 },
                  ];
     my $encoder = Geo::Google::PolylineEncoder->new;
     my $eline   = $encoder->encode( $points );
     print $eline->{num_levels};  # 18
     print $eline->{zoom_factor}; # 2
     print $eline->{points};      # _p~iF~ps|U_ulLnnqC_mqNvxq`@
     print $eline->{levels};      # POP

     # in Javascript, assuming eline was encoded as JSON:
     # ... load GMap2 ...
     var opts = {
       points: eline.points,
       levels: eline.levels,
       numLevels: eline.num_levels,
       zoomFactor: eline.zoom_factor,
     };
     var line = GPolyline.fromEncoded( opts );

DESCRIPTION
   This module encodes a list of lat/lon points representing a polyline
   into a format for use with Google Maps. This format is described here:

   <http://code.google.com/apis/maps/documentation/polylinealgorithm.html>

   The module is a port of Mark McClure's "PolylineEncoder.js" with some
   minor tweaks. The original can be found here:

   <http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/>

CONSTRUCTOR & ACCESSORS
   new( [%args] )
       Create a new encoder. Arguments are optional and correspond to the
       accessor with the same name: "num_levels", "zoom_factor",
       "visible_threshold", "force_endpoints".

       Note: there's nothing stopping you from setting these properties
       each time you "encode" a polyline.

   num_levels
       How many different levels of magnification the polyline has.
       Default: 18.

   zoom_factor
       The change in magnification between those levels (see "num_levels").
       Default: 2.

   visible_threshold
       Indicates the length of a barely visible object at the highest zoom
       level. Default: 0.00001.

   force_endpoints
       Indicates whether or not the endpoints should be visible at all zoom
       levels. force_endpoints is. Probably should stay true regardless.
       Default: 1=true.

   escape_encoded_points
       Indicates whether or not the encoded points should have escape
       characters escaped, eg:

         $points =~ s/\\/\\\\/g;

       This is useful if you'll be evalling the resulting strings, or
       copying them into a static document.

       Warning: don't turn this on if you'll be passing the encoded points
       straight on to your application, or you'll get unexpected results
       (ie: lines that start out right, but end up horribly wrong). It may
       even crash your browser.

       Default: 0=false.

METHODS
   encode( \@points );
       Encode the points into a string for use with Google Maps
       "GPolyline.fromEncoded" using a variant of the Douglas-Peucker
       algorithm and the Polyline encoding algorithm defined by Google.

       Expects a reference to a @points array ala:

         [
          { lat => 38.5, lon => -120.2 },
          { lat => 40.7, lon => -120.95 },
          { lat => 43.252, lon => -126.453 },
         ];

       Returns a hashref containing:

         {
          points => 'encoded points string',
          levels => 'encoded levels string',
          num_levels => int($num_levels),
          zoom_factor => int($zoom_factor),
         };

       You can then use the JSON modules (or XML, or whatever) to pass the
       encoded values to your Javascript application for use there.

TODO
   Benchmarking, & maybe bring distance calcs in-line as Joel Rosenberg
   did:
   <http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/gmap_polyli
   ne_encoder.rb.txt>

   As Lee Goddard suggests, accept points as arrays in inputs to encode(),
   eg:

    my $points = [ [$lat1, $lon1], ... ]; # like this
    my $points = [ $lat1, $lon1, $lat2, $lon2 ]; # or this

AUTHOR
   Steve Purkis <[email protected]>

   Ported from Mark McClure's "PolylineEncoder.js" which can be found here:
   <http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/PolylineEnc
   oderClass.html>

   Some encoding ideas borrowed from Geo::Google.

COPYRIGHT
   Copyright (c) 2008 Steve Purkis. Released under the same terms as Perl
   itself.

SEE ALSO
   <http://code.google.com/apis/maps/documentation/polylinealgorithm.html>,
   <http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/PolylineEnc
   oderClass.html> (JavaScript implementation),
   <http://www.usnaviguide.com/google-encode.htm> (similar implementation
   in perl), Geo::Google, JSON