hook(type => "format", id => "osm", call => \&format);
hook(type => "preprocess", id => "osm", call => \&preprocess);
hook(type => "preprocess", id => "waypoint", call => \&process_waypoint);
- hook(type => "savestate", id => "waypoint", call => \&savestate);
+ hook(type => "changes", id => "waypoint", call => \&changes);
hook(type => "cgi", id => "osm", call => \&cgi);
}
safe => 0,
rebuild => 1,
},
- osm_map_url => {
+ osm_layers => {
type => "string",
- example => "/tiles/\${z}/\${x}/\${y}.png",
- description => "Url to get map tiles from (if none specified, uses the openstreetmap server, see http://wiki.openstreetmap.org/wiki/Creating_your_own_tiles for more info on serving your own tiles)",
+ example => { 'OSM', 'GoogleSatellite' },
+ description => "Layers to use in the map. Can be either the 'OSM' string or a type option for Google maps (GoogleNormal, GoogleSatellite, GoogleHybrid or GooglePhysical). It can also be an arbitrary URL in a syntax acceptable for OpenLayers.Layer.OSM.url parameter.",
safe => 0,
rebuild => 1,
},
}
}
$icon = urlto($icon, $dest, 1);
+ $icon =~ s!/*$!!; # hack - urlto shouldn't be appending a slash in the first place
$tag = '' unless $tag;
register_rendered_files($map, $page, $dest);
$pagestate{$page}{'osm'}{$map}{'waypoints'}{$name} = {
my $tag = shift;
# look for an icon attached to the tag
my $attached = $tag . '/' . $config{'osm_tag_default_icon'};
- if (srcfile($attached)) {
+ if (srcfile($attached, 1)) {
return $attached;
}
else {
return ($lon, $lat);
}
-sub savestate {
+sub changes {
my %waypoints = ();
my %linestrings = ();
foreach my $map (keys %waypoints) {
my $output;
my $writer = XML::Writer->new( OUTPUT => \$output,
- DATA_MODE => 1, ENCODING => 'UTF-8');
+ DATA_MODE => 1, DATA_INDENT => ' ', ENCODING => 'UTF-8');
$writer->xmlDecl();
$writer->startTag("kml", "xmlns" => "http://www.opengis.net/kml/2.2");
$writer->startTag("Document");
# first pass: get the icons
+ my %tags_map = (); # keep track of tags seen
foreach my $name (keys %{$waypoints{$map}}) {
my %options = %{$waypoints{$map}{$name}};
- $writer->startTag("Style", id => $options{tag});
- $writer->startTag("IconStyle");
- $writer->startTag("Icon");
- $writer->startTag("href");
- $writer->characters($options{icon});
- $writer->endTag();
- $writer->endTag();
- $writer->endTag();
- $writer->endTag();
+ if (!$tags_map{$options{tag}}) {
+ debug("found new style " . $options{tag});
+ $tags_map{$options{tag}} = ();
+ $writer->startTag("Style", id => $options{tag});
+ $writer->startTag("IconStyle");
+ $writer->startTag("Icon");
+ $writer->startTag("href");
+ $writer->characters($options{icon});
+ $writer->endTag();
+ $writer->endTag();
+ $writer->endTag();
+ $writer->endTag();
+ }
+ $tags_map{$options{tag}}{$name} = \%options;
}
foreach my $name (keys %{$waypoints{$map}}) {
}
}
if ($loader) {
- return embed_map_code($page) . "<script type=\"text/javascript\" charset=\"utf-8\">$loader</script>";
+ return embed_map_code($page) . "<script type=\"text/javascript\">$loader</script>";
}
else {
return '';
print "<html><body>";
print "<div id=\"mapdiv-$map\"></div>";
print embed_map_code();
- print "<script type=\"text/javascript\" charset=\"utf-8\">";
+ print "<script type=\"text/javascript\">";
print map_setup_code($map, $map,
lat => "urlParams['lat']",
lon => "urlParams['lon']",
if ($mapurl) {
$options{'mapurl'} = $mapurl;
}
+ $options{'layers'} = $config{osm_layers};
+ $name=~s/'//g; # $name comes from user input
return "mapsetup('mapdiv-$name', " . to_json(\%options) . ");";
}