]> git.openstreetmap.org Git - rails.git/blob - public/javascripts/map.js
217e6e7589caa9fce2c7fcfb3e2e16f075c3491e
[rails.git] / public / javascripts / map.js
1 var map;
2 var markers;
3 var popup;
4
5 function createMap(divName) {
6    map = new OpenLayers.Map(divName,
7                             { maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508),
8                               numZoomLevels: 19,
9                               maxResolution: 156543,
10                               units: 'm',
11                               projection: "EPSG:41001" });
12
13    var mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik", { displayOutsideMaxExtent: true });
14    map.addLayer(mapnik);
15
16    var osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender", { displayOutsideMaxExtent: true });
17    map.addLayer(osmarender);
18
19    markers = new OpenLayers.Layer.Markers("markers", { visibility: false });
20    map.addLayer(markers);
21
22    map.addControl(new OpenLayers.Control.LayerSwitcher());
23    map.addControl(new OpenLayers.Control.KeyboardDefaults());
24
25    return map;
26 }
27
28 function getArrowIcon() {
29    var size = new OpenLayers.Size(25, 22);
30    var offset = new OpenLayers.Pixel(-30, -27);
31    var icon = new OpenLayers.Icon("/images/arrow.png", size, offset);
32
33    return icon;
34 }
35
36 function addMarkerToMap(position, icon, description) {
37    var marker = new OpenLayers.Marker(position, icon);
38
39    markers.addMarker(marker);
40    markers.setVisibility(true);
41
42    if (description) {
43       marker.events.register("click", marker, function() { openMapPopup(marker, description) });
44    }
45
46    return marker;
47 }
48
49 function openMapPopup(marker, description) {
50    closeMapPopup();
51
52    popup = new OpenLayers.Popup.AnchoredBubble("popup", marker.lonlat,
53                                                sizeMapPopup(description),
54                                                "<p style='padding-right: 28px'>" + description + "</p>",
55                                                marker.icon, true);
56    popup.setBackgroundColor("#E3FFC5");
57    map.addPopup(popup);
58
59    return popup;
60 }
61
62 function closeMapPopup() {
63    if (popup) {
64       map.removePopup(popup);
65       delete popup;
66    }
67 }
68
69 function sizeMapPopup(text) {
70    var box = document.createElement("div");
71
72    box.innerHTML = text;
73    box.style.visibility = "hidden";
74    box.style.position = "absolute";
75    box.style.top = "0px";
76    box.style.left = "0px";
77    box.style.width = "200px";
78    box.style.height = "auto";
79
80    document.body.appendChild(box);
81
82    var width = box.offsetWidth;
83    var height = box.offsetHeight;
84
85    document.body.removeChild(box);
86
87    return new OpenLayers.Size(width + 30, height + 24);
88 }
89
90 function removeMarkerFromMap(marker){
91    markers.removeMarker(marker);
92 }
93
94 function getMapLayers() {
95    var layers = "";
96
97    for (var i=0; i< this.map.layers.length; i++) {
98       var layer = this.map.layers[i];
99
100       if (layer.isBaseLayer) {
101          layers += (layer == this.map.baseLayer) ? "B" : "0";
102       } else {
103          layers += (layer.getVisibility()) ? "T" : "F";
104       }
105    }
106
107    return layers;
108 }
109
110 function setMapLayers(layers) {
111    for (var i=0; i < layers.length; i++) {
112       var layer = map.layers[i];
113       var c = layers.charAt(i);
114
115       if (c == "B") {
116          map.setBaseLayer(layer);
117       } else if ( (c == "T") || (c == "F") ) {
118          layer.setVisibility(c == "T");
119       }
120    }
121 }
122
123 function mercatorToLonLat(merc) {
124    var lon = (merc.lon / 20037508.34) * 180;
125    var lat = (merc.lat / 20037508.34) * 180;
126
127    lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
128
129    return new OpenLayers.LonLat(lon, lat);
130 }
131
132 function lonLatToMercator(ll) {
133    var lon = ll.lon * 20037508.34 / 180;
134    var lat = Math.log(Math.tan((90 + ll.lat) * Math.PI / 360)) / (Math.PI / 180);
135
136    lat = lat * 20037508.34 / 180;
137
138    return new OpenLayers.LonLat(lon, lat);
139 }
140
141 function scaleToZoom(scale) {
142    return Math.log(360.0/(scale * 512.0)) / Math.log(2.0);
143 }