diff options
Diffstat (limited to 'underlays/osm/ikiwiki/osm.js')
-rw-r--r-- | underlays/osm/ikiwiki/osm.js | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/underlays/osm/ikiwiki/osm.js b/underlays/osm/ikiwiki/osm.js new file mode 100644 index 000000000..37e588f7b --- /dev/null +++ b/underlays/osm/ikiwiki/osm.js @@ -0,0 +1,166 @@ +// taken from http://stackoverflow.com/questions/901115/get-query-string-values-in-javascript +var urlParams = {}; +(function () { + var e, + a = /\\+/g, // Regex for replacing addition symbol with a space + r = /([^&=]+)=?([^&]*)/g, + d = function (s) { return decodeURIComponent(s.replace(a, " ")); }, + q = window.location.search.substring(1); + + while (e = r.exec(q)) + urlParams[d(e[1])] = d(e[2]); +})(); + +function mapsetup(divname, options) { + div = document.getElementById(divname); + if (options.fullscreen) { + permalink = 'permalink'; + div.style.top = 0; + div.style.left = 0; + div.style.position = 'absolute'; + div.style.width = '100%'; + div.style.height = '100%'; + } + else { + div.style.height = options.height; + div.style.width = options.width; + div.style.float = options.float; + permalink = {base: options.href, title: "View larger map"}; + } + map = new OpenLayers.Map(divname, { + controls: [ + new OpenLayers.Control.Navigation(), + new OpenLayers.Control.ScaleLine(), + new OpenLayers.Control.Permalink(permalink) + ], + displayProjection: new OpenLayers.Projection("EPSG:4326"), + maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), + projection: "EPSG:900913", + units: "m", + maxResolution: 156543.0339, + numZoomLevels: 19 + }); + + for (x in options.layers) { + layer = options.layers[x]; + console.log("setting up layer: " + layer); + if (layer.indexOf("Google") >= 0) { + if (options.google_apikey && options.google_apikey != 'null') { + var gtype = G_NORMAL_MAP; + if (layer.indexOf("Satellite") >= 0) { + gtype = G_SATELLITE_MAP; + } else if (layer.indexOf("Hybrid") >= 0) { + gtype = G_HYBRID_MAP // the normal map overlaying the satellite photographs + } else if (layer.indexOf("Physical") >= 0) { + gtype = G_PHYSICAL_MAP // terrain information + } + // this nightmare is possible through http://docs.openlayers.org/library/spherical_mercator.html + googleLayer = new OpenLayers.Layer.Google( + 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 if (layer == 'OSM') { // OSM default layer + map.addLayer(new OpenLayers.Layer.OSM("OSM (Mapnik)")); + } else { // assumed to be a URL + text = layer.match(/([^.\/]*\.[^.\/]*(\/[^\$]*)?)\/.*$/i) // take the first two parts of the FQDN and everything before the first $ + map.addLayer(new OpenLayers.Layer.OSM("OSM (" + text[1] + ")", layer)); + } + } + + if (options.format == 'CSV') { + pois = new OpenLayers.Layer.Text( "CSV", + { location: options.csvurl, + projection: new OpenLayers.Projection("EPSG:4326") + }); + } else if (options.format == 'GeoJSON') { + pois = new OpenLayers.Layer.Vector("GeoJSON", { + protocol: new OpenLayers.Protocol.HTTP({ + url: options.jsonurl, + format: new OpenLayers.Format.GeoJSON() + }), + strategies: [new OpenLayers.Strategy.Fixed()], + projection: new OpenLayers.Projection("EPSG:4326") + }); + } else { + pois = new OpenLayers.Layer.Vector("KML", { + protocol: new OpenLayers.Protocol.HTTP({ + url: options.kmlurl, + format: new OpenLayers.Format.KML({ + extractStyles: true, + extractAttributes: true + }) + }), + strategies: [new OpenLayers.Strategy.Fixed()], + projection: new OpenLayers.Projection("EPSG:4326") + }); + } + map.addLayer(pois); + select = new OpenLayers.Control.SelectFeature(pois); + map.addControl(select); + select.activate(); + + pois.events.on({ + "featureselected": function (event) { + var feature = event.feature; + var content = '<h2><a href="' + feature.attributes.href + '">' +feature.attributes.name + "</a></h2>" + feature.attributes.description; + popup = new OpenLayers.Popup.FramedCloud("chicken", + feature.geometry.getBounds().getCenterLonLat(), + new OpenLayers.Size(100,100), + content, + null, true, function () {select.unselectAll()}); + feature.popup = popup; + map.addPopup(popup); + }, + "featureunselected": function (event) { + var feature = event.feature; + if (feature.popup) { + map.removePopup(feature.popup); + feature.popup.destroy(); + delete feature.popup; + } + } + }); + + if (options.editable) { + vlayer = new OpenLayers.Layer.Vector( "Editable" ); + map.addControl(new OpenLayers.Control.EditingToolbar(vlayer)); + map.addLayer(vlayer); + } + + if (options.fullscreen) { + map.addControl(new OpenLayers.Control.PanZoomBar()); + map.addControl(new OpenLayers.Control.LayerSwitcher()); + map.addControl(new OpenLayers.Control.MousePosition()); + map.addControl(new OpenLayers.Control.KeyboardDefaults()); + } else { + map.addControl(new OpenLayers.Control.ZoomPanel()); + } + + //Set start centrepoint and zoom + if (!options.lat || !options.lon) { + options.lat = urlParams['lat']; + options.lon = urlParams['lon']; + } + if (!options.zoom) { + options.zoom = urlParams['zoom']; + } + if (options.lat && options.lon) { + var lat = options.lat; + var lon = options.lon; + var zoom= options.zoom || 10; + center = new OpenLayers.LonLat( lon, lat ).transform( + new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984 + map.getProjectionObject() // to Spherical Mercator Projection + ); + map.setCenter (center, zoom); + } else { + pois.events.register("loadend", this, function () { map.zoomToExtent(pois.getDataExtent()); }); + } +} |