]> git.openstreetmap.org Git - rails.git/blob - public/javascripts/map.js
Make sure the zoom level is valid when positioning the map. Closes #1158.
[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    var numzoom = map.getNumZoomLevels();
135    if (zoom >= numzoom) zoom = numzoom - 1;
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 }