]> git.openstreetmap.org Git - rails.git/blob - public/javascripts/map.js
Potlatch for API 0.6 now saving ways happily with node versioning... I think
[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    var numzoom = map.getNumZoomLevels();
138    if (zoom >= numzoom) zoom = numzoom - 1;
139    map.setCenter(center.clone().transform(epsg4326, map.getProjectionObject()), zoom);
140 }
141
142 function setMapExtent(extent) {
143    map.zoomToExtent(extent.clone().transform(epsg4326, map.getProjectionObject()));
144 }
145
146 function getMapExtent(extent) {
147    return map.getExtent().clone().transform(map.getProjectionObject(), epsg4326);
148 }
149
150 function getEventPosition(event) {
151    return map.getLonLatFromViewPortPx(event.xy).clone().transform(map.getProjectionObject(), epsg4326);
152 }
153
154 function getMapLayers() {
155    var layerConfig = "";
156
157    for (var layers = map.getLayersBy("isBaseLayer", true), i = 0; i < layers.length; i++) {
158       layerConfig += layers[i] == map.baseLayer ? "B" : "0";
159    }
160
161    for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) {
162       layerConfig += layers[i].getVisibility() ? "T" : "F";
163    }
164
165    return layerConfig;
166 }
167
168 function setMapLayers(layerConfig) {
169    var l = 0;
170
171    for (var layers = map.getLayersBy("isBaseLayer", true), i = 0; i < layers.length; i++) {
172       var c = layerConfig.charAt(l++);
173
174       if (c == "B") {
175          map.setBaseLayer(layers[i]);
176       }
177    }
178
179    while (layerConfig.charAt(l) == "B" || layerConfig.charAt(l) == "0") {
180       l++;
181    }
182
183    for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) {
184       var c = layerConfig.charAt(l++);
185
186       if (c == "T") {
187          layers[i].setVisibility(true);
188       } else if(c == "F") {
189          layers[i].setVisibility(false);
190       }
191    }
192 }
193
194 function scaleToZoom(scale) {
195    return Math.log(360.0/(scale * 512.0)) / Math.log(2.0);
196 }