]> git.openstreetmap.org Git - rails.git/blob - public/javascripts/map.js
Add 'history' tab + Move 'recent changes' changeset list to re-use the same _changese...
[rails.git] / public / javascripts / map.js
1 var epsg4326 = new OpenLayers.Projection("EPSG:4326");
2 var map;
3 var markers;
4 var popup;
5
6 var nonamekeys = {
7    'openstreetmap.org': '2f59745a6b525b4ebdb100891d5b6711',
8    'www.openstreetmap.org': 'fd093e52f0965d46bb1c6c6281022199',
9    'openstreetmap.com': '4c60e7f5f31c576a9bb8da71c8d61152',
10    'www.openstreetmap.com': '142f25a0770a51a9a400b3513834a199',
11    'openstreetmap.net': '687c58fd1d715596bfc94abe653d8ac0',
12    'www.openstreetmap.net': '0bd1654141c85d30b9c2ccdb5302f2e4'
13 };
14
15 OpenLayers._getScriptLocation = function () {
16   // Should really have this file as an erb, so that this can return 
17   // the real rails root
18    return "/openlayers/";
19 }
20
21 function createMap(divName, options) {
22    options = options || {};
23
24    map = new OpenLayers.Map(divName, {
25       controls: options.controls || [
26          new OpenLayers.Control.ArgParser(),
27          new OpenLayers.Control.Attribution(),
28          new OpenLayers.Control.LayerSwitcher(),
29          new OpenLayers.Control.Navigation(),
30          new OpenLayers.Control.PanZoomBar(),
31          new OpenLayers.Control.ScaleLine()
32       ],
33       units: "m",
34       maxResolution: 156543.0339,
35       numZoomLevels: 20,
36       displayProjection: new OpenLayers.Projection("EPSG:4326")
37    });
38
39    var mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik", {
40       displayOutsideMaxExtent: true,
41       wrapDateLine: true
42    });
43    map.addLayer(mapnik);
44
45    var osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender", {
46       displayOutsideMaxExtent: true,
47       wrapDateLine: true
48    });
49    map.addLayer(osmarender);
50
51    var cyclemap = new OpenLayers.Layer.OSM.CycleMap("Cycle Map", {
52       displayOutsideMaxExtent: true,
53       wrapDateLine: true
54    });
55    map.addLayer(cyclemap);
56
57    var nonamekey = nonamekeys[document.domain];
58    var noname = new OpenLayers.Layer.OSM("NoName", [
59       "http://a.tile.cloudmade.com/" + nonamekey + "/3/256/",
60       "http://b.tile.cloudmade.com/" + nonamekey + "/3/256/",
61       "http://c.tile.cloudmade.com/" + nonamekey + "/3/256/"
62    ], {
63       displayOutsideMaxExtent: true,
64       wrapDateLine: true,
65       numZoomLevels: 19
66    });
67    map.addLayer(noname);
68
69    var maplint = new OpenLayers.Layer.OSM.Maplint("Maplint", {
70       displayOutsideMaxExtent: true,
71       wrapDateLine: true
72    });
73    map.addLayer(maplint);
74
75    var numZoomLevels = Math.max(mapnik.numZoomLevels, osmarender.numZoomLevels);
76    markers = new OpenLayers.Layer.Markers("Markers", {
77       displayInLayerSwitcher: false,
78       numZoomLevels: numZoomLevels,
79       maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508),
80       maxResolution: 156543,
81       units: "m",
82       projection: "EPSG:900913"
83    });
84    map.addLayer(markers);
85
86    return map;
87 }
88
89 function getArrowIcon() {
90    var size = new OpenLayers.Size(25, 22);
91    var offset = new OpenLayers.Pixel(-30, -27);
92    var icon = new OpenLayers.Icon("/images/arrow.png", size, offset);
93
94    return icon;
95 }
96
97 function addMarkerToMap(position, icon, description) {
98    var marker = new OpenLayers.Marker(position.clone().transform(epsg4326, map.getProjectionObject()), icon);
99
100    markers.addMarker(marker);
101
102    if (description) {
103       marker.events.register("click", marker, function() { openMapPopup(marker, description) });
104    }
105
106    return marker;
107 }
108
109 function openMapPopup(marker, description) {
110    closeMapPopup();
111
112    popup = new OpenLayers.Popup.AnchoredBubble("popup", marker.lonlat, null,
113                                                description, marker.icon, true);
114    popup.setBackgroundColor("#E3FFC5");
115    popup.autoSize = true;
116    map.addPopup(popup);
117
118    return popup;
119 }
120
121 function closeMapPopup() {
122    if (popup) {
123       map.removePopup(popup);
124       delete popup;
125    }
126 }
127
128 function removeMarkerFromMap(marker){
129    markers.removeMarker(marker);
130 }
131
132 function getMapCenter(center, zoom) {
133    return map.getCenter().clone().transform(map.getProjectionObject(), epsg4326);
134 }
135
136 function setMapCenter(center, zoom) {
137    zoom = parseInt(zoom);
138    var numzoom = map.getNumZoomLevels();
139    if (zoom >= numzoom) zoom = numzoom - 1;
140    map.setCenter(center.clone().transform(epsg4326, map.getProjectionObject()), zoom);
141 }
142
143 function setMapExtent(extent) {
144    map.zoomToExtent(extent.clone().transform(epsg4326, map.getProjectionObject()));
145 }
146
147 function getMapExtent(extent) {
148    return map.getExtent().clone().transform(map.getProjectionObject(), epsg4326);
149 }
150
151 function getEventPosition(event) {
152    return map.getLonLatFromViewPortPx(event.xy).clone().transform(map.getProjectionObject(), epsg4326);
153 }
154
155 function getMapLayers() {
156    var layerConfig = "";
157
158    for (var layers = map.getLayersBy("isBaseLayer", true), i = 0; i < layers.length; i++) {
159       layerConfig += layers[i] == map.baseLayer ? "B" : "0";
160    }
161
162    for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) {
163       layerConfig += layers[i].getVisibility() ? "T" : "F";
164    }
165
166    return layerConfig;
167 }
168
169 function setMapLayers(layerConfig) {
170    var l = 0;
171
172    for (var layers = map.getLayersBy("isBaseLayer", true), i = 0; i < layers.length; i++) {
173       var c = layerConfig.charAt(l++);
174
175       if (c == "B") {
176          map.setBaseLayer(layers[i]);
177       }
178    }
179
180    while (layerConfig.charAt(l) == "B" || layerConfig.charAt(l) == "0") {
181       l++;
182    }
183
184    for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) {
185       var c = layerConfig.charAt(l++);
186
187       if (c == "T") {
188          layers[i].setVisibility(true);
189       } else if(c == "F") {
190          layers[i].setVisibility(false);
191       }
192    }
193 }
194
195 function scaleToZoom(scale) {
196    return Math.log(360.0/(scale * 512.0)) / Math.log(2.0);
197 }