| Geo-GoogleEarth-Pluggable documentation | Contained in the Geo-GoogleEarth-Pluggable distribution. |
Geo::GoogleEarth::Pluggable - Generates GoogleEarth Documents
use Geo::GoogleEarth::Pluggable; my $document=Geo::GoogleEarth::Pluggable->new(%data); #is a special Folder... my $folder =$document->Folder(%data); #isa Geo::GoogleEarth::Pluggable::Folder my $point =$document->Point(%data); #isa Geo::GoogleEarth::Pluggable::Point my $netlink =$document->NetworkLink(%data); #isa Geo::GoogleEarth::Pluggable::NetworkLink my $lookat =$document->LookAt(%data); #isa Geo::GoogleEarth::Pluggable::LookAt my $style =$document->Style(%data); #isa Geo::GoogleEarth::Pluggable::Style print $document->render;
KML CGI Example
use Geo::GoogleEarth::Pluggable;
my $document=Geo::GoogleEarth::Pluggable->new(name=>"KML Document");
print $document->header,
$document->render;
KMZ CGI Example
use Geo::GoogleEarth::Pluggable;
my $document=Geo::GoogleEarth::Pluggable->new(name=>"KMZ Document");
print $document->header_kmz,
$document->archive;
Geo::GoogleEarth::Pluggable is a Perl object oriented interface that allows for the creation of XML documents that can be used with Google Earth.
Geo::GoogleEarth::Pluggable (aka Document) is a Geo::GoogleEarth::Pluggable::Folder with a render method.
-- Base --- Folder --- Document
|
+- Placemark -+- Point
| +- LineString
| +- LinearRing
|
+- StyleBase -+- Style
| +- StyleMap
|
+- NetworkLink
This is all of the code you need to generate a complete Google Earth document.
use Geo::GoogleEarth::Pluggable; my $document=Geo::GoogleEarth::Pluggable->new; $document->Point(name=>"White House", lat=>38.897337, lon=>-77.036503); print $document->render;
my $document=Geo::GoogleEarth::Pluggable->new(name=>"My Name");
Returns the object type.
my $type=$folder->type;
Returns the document object.
All objects know to which document they belong even the document itself!
Returns an XML document with an XML declaration and a root name of "Document"
print $document->render;
Returns a KMZ formatted Zipped archive of the XML document
print $document->archive;
Add or update a namespace
$document->xmlns->{"namespace"}=$url;
Delete a namespace
delete($document->xmlns->{"xmlns:gx"});
Replace all namespaces
$document->{"xmlns"}={namespace=>$url};
Reset to default namespaces
delete($document->{"xmlns"});
This method is in the document since all Styles and StyleMaps are in the document not folders.
my $id=$document->nextId($type); #$type in "Style" or "StyleMap"
Returns a header appropriate for a web application
Content-type: application/vnd.google-earth.kml+xml Content-Disposition: attachment; filename=filename.xls $document->header #embedded in browser $document->header(filename=>"filename.xls") #download prompt $document->header(content_type=>"application/vnd.google-earth.kml+xml") #default content type
Returns a header appropriate for a web application
Content-type: application/vnd.google-earth.kml+xml Content-Disposition: attachment; filename=filename.xls $document->header_kmz #embedded in browser $document->header_kmz(filename=>"filename.xls") #download prompt $document->header_kmz(content_type=>"application/vnd.google-earth.kmz") #default content type
Please log on RT and send to the geo-perl email list.
The XML produced by XML::LibXML is not "pretty". If you need pretty XML you must pass the output through xmllint or a simular product.
For example:
perl -MGeo::GoogleEarth::Pluggable -e "print Geo::GoogleEarth::Pluggable->new->render" | xmllint --format -
This package can only write KML and KMZ files. However, if you need to read KML files, please see the Geo::KML package's from method.
DavisNetworks.com supports all Perl applications including this package.
Michael R. Davis (mrdvt92) CPAN ID: MRDVT
This program is free software licensed under the...
The BSD License
The full text of the license can be found in the LICENSE file included with this module.
| Geo-GoogleEarth-Pluggable documentation | Contained in the Geo-GoogleEarth-Pluggable distribution. |
package Geo::GoogleEarth::Pluggable; use strict; use warnings; use base qw{Geo::GoogleEarth::Pluggable::Folder}; use XML::LibXML::LazyBuilder qw{DOM E}; use Archive::Zip qw{COMPRESSION_DEFLATED}; use IO::Scalar qw{}; our $VERSION='0.14';
sub type {"Document"};
sub document {shift};
sub render { my $self=shift; my $d = DOM(E(kml=>{$self->xmlns}, $self->node)); return $d->toString; }
sub archive { my $self=shift; my $azip=Archive::Zip->new; my $member=$azip->addString($self->render, "doc.kml"); $member->desiredCompressionMethod(COMPRESSION_DEFLATED); #$member->desiredCompressionLevel(9); #RT60563, RT54827 my $archive=q{}; my $iosh=IO::Scalar->new( \$archive ); $azip->writeToFileHandle($iosh); $iosh->close; return $archive; }
sub xmlns { my $self=shift; unless (defined($self->{'xmlns'})) { $self->{'xmlns'}={ 'xmlns' => "http://www.opengis.net/kml/2.2", 'xmlns:gx' => "http://www.google.com/kml/ext/2.2", 'xmlns:kml' => "http://www.opengis.net/kml/2.2", 'xmlns:atom' => "http://www.w3.org/2005/Atom", }; } return wantarray ? %{$self->{'xmlns'}} : $self->{'xmlns'}; }
sub nextId { my $self=shift; my $type=shift || "Unknown"; $self->{"nextId"}=0 unless defined $self->{"nextId"}; return sprintf("%s-%s-%s", $type, "perl", $self->{"nextId"}++); }
*header_kml=\&header; sub header { my $self=shift; my %data=@_; $data{"content_type"}="application/vnd.google-earth.kml+xml" unless defined $data{"content_type"}; my $header=sprintf("Content-type: %s\n", $data{"content_type"}); $header.=sprintf("Content-Disposition: attachment; filename=%s\n", $data{"filename"}) if defined $data{"filename"}; $header.="\n"; return $header; }
sub header_kmz { my $self=shift; my %data=@_; $data{"content_type"}||="application/vnd.google-earth.kmz"; return $self->header(%data); }
1;