]> git.openstreetmap.org Git - rails.git/blob - public/javascripts/map.js
reverting the javascript change in changeset 10926, that needs to be specific to...
[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    });
37
38    var mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik", {
39       displayOutsideMaxExtent: true,
40       wrapDateLine: true
41    });
42    map.addLayer(mapnik);
43
44    var osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender", {
45       displayOutsideMaxExtent: true,
46       wrapDateLine: true
47    });
48    map.addLayer(osmarender);
49
50    var cyclemap = new OpenLayers.Layer.OSM.CycleMap("Cycle Map", {
51       displayOutsideMaxExtent: true,
52       wrapDateLine: true
53    });
54    map.addLayer(cyclemap);
55
56    var nonamekey = nonamekeys[document.domain];
57    var noname = new OpenLayers.Layer.OSM("NoName", [
58       "http://a.tile.cloudmade.com/" + nonamekey + "/3/256/",
59       "http://b.tile.cloudmade.com/" + nonamekey + "/3/256/",
60       "http://c.tile.cloudmade.com/" + nonamekey + "/3/256/"
61    ], {
62       displayOutsideMaxExtent: true,
63       wrapDateLine: true,
64       numZoomLevels: 19
65    });
66    map.addLayer(noname);
67
68    var maplint = new OpenLayers.Layer.OSM.Maplint("Maplint", {
69       displayOutsideMaxExtent: true,
70       wrapDateLine: true
71    });
72    map.addLayer(maplint);
73
74    var numZoomLevels = Math.max(mapnik.numZoomLevels, osmarender.numZoomLevels);
75    markers = new OpenLayers.Layer.Markers("Markers", {
76       displayInLayerSwitcher: false,
77       numZoomLevels: numZoomLevels,
78       maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508),
79       maxResolution: 156543,
80       units: "m",
81       projection: "EPSG:900913"
82    });
83    map.addLayer(markers);
84
85    return map;
86 }
87
88 function getArrowIcon() {
89    var size = new OpenLayers.Size(25, 22);
90    var offset = new OpenLayers.Pixel(-30, -27);
91    var icon = new OpenLayers.Icon("/images/arrow.png", size, offset);
92
93    return icon;
94 }
95
96 function addMarkerToMap(position, icon, description) {
97    var marker = new OpenLayers.Marker(position.clone().transform(epsg4326, map.getProjectionObject()), icon);
98
99    markers.addMarker(marker);
100
101    if (description) {
102       marker.events.register("click", marker, function() { openMapPopup(marker, description) });
103    }
104
105    return marker;
106 }
107
108 function openMapPopup(marker, description) {
109    closeMapPopup();
110
111    popup = new OpenLayers.Popup.AnchoredBubble("popup", marker.lonlat, null,
112                                                description, marker.icon, true);
113    popup.setBackgroundColor("#E3FFC5");
114    popup.autoSize = true;
115    map.addPopup(popup);
116
117    return popup;
118 }
119
120 function closeMapPopup() {
121    if (popup) {
122       map.removePopup(popup);
123       delete popup;
124    }
125 }
126
127 function removeMarkerFromMap(marker){
128    markers.removeMarker(marker);
129 }
130
131 function getMapCenter(center, zoom) {
132    return map.getCenter().clone().transform(map.getProjectionObject(), epsg4326);
133 }
134
135 function setMapCenter(center, zoom) {
136    map.setCenter(center.clone().transform(epsg4326, map.getProjectionObject()), zoom);
137 }
138
139 function setMapExtent(extent) {
140    map.zoomToExtent(extent.clone().transform(epsg4326, map.getProjectionObject()));
141 }
142
143 function getMapExtent(extent) {
144    return map.getExtent().clone().transform(map.getProjectionObject(), epsg4326);
145 }
146
147 function getEventPosition(event) {
148    return map.getLonLatFromViewPortPx(event.xy).clone().transform(map.getProjectionObject(), epsg4326);
149 }
150
151 function getMapLayers() {
152    var layerConfig = "";
153
154    for (var layers = map.getLayersBy("isBaseLayer", true), i = 0; i < layers.length; i++) {
155       layerConfig += layers[i] == map.baseLayer ? "B" : "0";
156    }
157
158    for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) {
159       layerConfig += layers[i].getVisibility() ? "T" : "F";
160    }
161
162    return layerConfig;
163 }
164
165 function setMapLayers(layerConfig) {
166    var l = 0;
167
168    for (var layers = map.getLayersBy("isBaseLayer", true), i = 0; i < layers.length; i++) {
169       var c = layerConfig.charAt(l++);
170
171       if (c == "B") {
172          map.setBaseLayer(layers[i]);
173       }
174    }
175
176    while (layerConfig.charAt(l) == "B" || layerConfig.charAt(l) == "0") {
177       l++;
178    }
179
180    for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) {
181       var c = layerConfig.charAt(l++);
182
183       if (c == "T") {
184          layers[i].setVisibility(true);
185       } else if(c == "F") {
186          layers[i].setVisibility(false);
187       }
188    }
189 }
190
191 function scaleToZoom(scale) {
192    return Math.log(360.0/(scale * 512.0)) / Math.log(2.0);
193 }