make layers completely customizable

master
Antoine Beaupré 2012-08-24 15:55:28 -04:00
parent 2fb93db1af
commit 081fd38636
2 changed files with 50 additions and 18 deletions

View File

@ -67,10 +67,19 @@ sub getsetup () {
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 => 1,
Google => 'Hybrid',
},
description => "Layers to use in the map. If the value is 1, use the default for the map, otherwise the argument is a URL (for OSM layers, e.g. http://a.tile.stamen.com/toner/\${z}/\${x}/\${y}.png) or a type option for Google maps (Normal, Satellite, Hybrid or Physical).",
safe => 0,
rebuild => 1,
},
osm_layers_order => {
type => "string",
example => { 'OSM', 'Google' },
description => "Display order for the layers. The first layer is the default layer, must match exactly the left side of the osm_layers hash.",
safe => 0,
rebuild => 1,
},
@ -580,6 +589,8 @@ sub map_setup_code($;@) {
if ($mapurl) {
$options{'mapurl'} = $mapurl;
}
$options{'layers'} = $config{osm_layers};
$options{'layers_order'} = $config{osm_layers_order};
return "mapsetup('mapdiv-$name', " . to_json(\%options) . ");";
}

View File

@ -41,23 +41,44 @@ function mapsetup(divname, options) {
numZoomLevels: 19
});
if (options.mapurl) {
map.addLayer(new OpenLayers.Layer.OSM("OpenStreetMap (Local)", options.mapurl));
} else {
map.addLayer(new OpenLayers.Layer.OSM("OpenStreetMap (Mapnik)"));
for (x in options.layers_order) {
layer = options.layers_order[x];
console.log("setting up layer: " + layer + " with argument : " + options.layers[layer]);
if (layer.indexOf("Google") >= 0) {
if (options.google_apikey && options.google_apikey != 'null') {
var gtype = G_NORMAL_MAP;
var gtext = "";
if (options.layers[layer] == "Satellite") {
gtype = G_SATELLITE_MAP;
} else if (options.layers[layer] == "Hybrid") {
gtype = G_HYBRID_MAP // the normal map overlaying the satellite photographs
} else if (options.layers[layer] == "Physical") {
gtype = G_PHYSICAL_MAP // terrain information
}
// this nightmare is possible through http://docs.openlayers.org/library/spherical_mercator.html
googleLayer = new OpenLayers.Layer.Google(
"Google " + options.layers[layer],
{type: gtype,
'sphericalMercator': true,
'maxExtent': new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
projection: new OpenLayers.Projection("EPSG:3857")}
);
map.addLayer(googleLayer);
} else {
console.log("no API key defined for Google layer, skipping");
}
} else { // OSM
if (options.layers[layer] != 1) {
l = options.layers[layer];
fqdn = l.split("/")[2].split(".")
text = fqdn[fqdn.length-2]
map.addLayer(new OpenLayers.Layer.OSM("OpenStreetMap (" + text + ")", l));
} else {
map.addLayer(new OpenLayers.Layer.OSM("OpenStreetMap (Mapnik)"));
}
}
}
// this nightmare is possible through http://docs.openlayers.org/library/spherical_mercator.html
if (options.google_apikey && options.google_apikey != 'null') {
googleLayer = new OpenLayers.Layer.Google(
"Google Hybrid",
{type: G_HYBRID_MAP,
'sphericalMercator': true,
'maxExtent': new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
projection: new OpenLayers.Projection("EPSG:3857")}
);
map.addLayer(googleLayer);
}
if (options.format == 'CSV') {
pois = new OpenLayers.Layer.Text( "CSV",
{ location: options.csvurl,