make layers completely customizable
authorAntoine Beaupré <anarcat@koumbit.org>
Fri, 24 Aug 2012 19:55:28 +0000 (15:55 -0400)
committerAntoine Beaupré <anarcat@koumbit.org>
Sat, 25 Aug 2012 12:20:30 +0000 (08:20 -0400)
IkiWiki/Plugin/osm.pm
underlays/osm/ikiwiki/osm.js

index d86dbd66ec9d992aeb33243e95d64357fdd20d42..4c50fec538a6e37fa011f105eb93fbcd4475e407 100644 (file)
@@ -67,10 +67,19 @@ sub getsetup () {
                        safe => 0,
                        rebuild => 1,
                },
                        safe => 0,
                        rebuild => 1,
                },
-               osm_map_url => {
+               osm_layers => {
                        type => "string",
                        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,
                },
                        safe => 0,
                        rebuild => 1,
                },
@@ -580,6 +589,8 @@ sub map_setup_code($;@) {
        if ($mapurl) {
                $options{'mapurl'} = $mapurl;
        }
        if ($mapurl) {
                $options{'mapurl'} = $mapurl;
        }
+        $options{'layers'} = $config{osm_layers};
+        $options{'layers_order'} = $config{osm_layers_order};
 
        return "mapsetup('mapdiv-$name', " . to_json(\%options) . ");";
 }
 
        return "mapsetup('mapdiv-$name', " . to_json(\%options) . ");";
 }
index 4f53b1dc8e2c97798ed93e9d0fa1d74139ed56d6..9547ee29c3e1fdf1677a531226f41d1ee8d9472f 100644 (file)
@@ -41,23 +41,44 @@ function mapsetup(divname, options) {
                numZoomLevels: 19
        });
 
                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,
        if (options.format == 'CSV') {
                pois = new OpenLayers.Layer.Text( "CSV",
                        { location: options.csvurl,