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