Geo::GoogleEarth::Pluggable::Plugin::GreatCircle - Great Circle plugin for Geo::GoogleEarth::Pluggable


Geo-GoogleEarth-Pluggable-Plugin-GreatCircle documentation Contained in the Geo-GoogleEarth-Pluggable-Plugin-GreatCircle distribution.

Index


Code Index:

NAME

Top

Geo::GoogleEarth::Pluggable::Plugin::GreatCircle - Great Circle plugin for Geo::GoogleEarth::Pluggable

SYNOPSIS

Top

  use Geo::GoogleEarth::Pluggable;
  my $document=Geo::GoogleEarth::Pluggable->new;
  my $arc=$document->GreatCircleArcSegment(%data);

DESCRIPTION

Top

Calculates the Great Circle Arc between two points and creates points in between so that Google Earth can display it as "straight" lines and it still looks like a Great Circle Arc.

USAGE

Top

METHODS

Top

GreatCircleArcSegment

Returns a LineString object.

  my $list=$folder->GreatCircleArcSegment(
                      startPoint=>{lat=>39,lon=>-77}, 
                      endPoint=>{lat=>40,lon=>-76});
  my @list=$folder->GreatCircleArcSegment(
                      name=>"My Great Circle", #name passed through to LineString
                      startPoint=>{lat=>39,lon=>-77}, 
                      endPoint=>{lat=>40,lon=>-76}, 
                      span=>5000);

startPoint and endPoint can be any valid scalar structure supported by GPS::Point->newMulti() constructor

BUGS

Top

Log on RT and send to geo-perl email list

SUPPORT

Top

AUTHOR

Top

  Michael R. Davis
  CPAN ID: MRDVT
  STOP, LLC
  domain=>michaelrdavis,tld=>com,account=>perl
  http://www.stopllc.com/

COPYRIGHT

Top

SEE ALSO

Top


Geo-GoogleEarth-Pluggable-Plugin-GreatCircle documentation Contained in the Geo-GoogleEarth-Pluggable-Plugin-GreatCircle distribution.
package Geo::GoogleEarth::Pluggable::Plugin::GreatCircle;
use warnings;
use strict;
use GPS::Point;
use Geo::Forward;
use Geo::Inverse;   #fail at complie time if you don't have it

our $VERSION='0.01';

sub GreatCircleArcSegment {
  my $self=shift; #$self isa Geo::GoogleEarth::Pluggable::Folder object
  my %data=@_;
  my $span=delete($data{"span"})||10000; #meters

  my $pt=[];  #list of GPS::Point objects
  $pt->[0] = GPS::Point->newMulti(delete($data{"startPoint"}));
  my $end  = GPS::Point->newMulti(delete($data{"endPoint"}));

  my ($faz, $baz, $dist)=$pt->[0]->distance($end); #requires Geo::Inverse
  $pt->[0]->heading($faz);
  $end->heading($baz-180);

  my $n=int($dist/$span);
  $n=2 if $n < 2;
  $span=$dist/$n;

  use Geo::Forward;
  my $gf=Geo::Forward->new;
  foreach my $i (1 .. $n-1) {
    my ($lat,$lon,$baz) = $gf->forward($pt->[$i-1]->latlon,$faz,$span);
    $pt->[$i]=GPS::Point->new(lat=>$lat, lon=>$lon);
    $faz=$baz+180;
  }

  $pt->[$n]=$end;
  $data{"coordinates"}=$pt;
  return $self->LineString(%data);
}

1;