1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4
<title>OpenDataMap.ca - Open Data Ottawa Points of Interest</title>
8
<link rel="stylesheet" type="text/css" href="css/style.css" media="screen">
10
<script type="text/javascript" src="openlayers/OpenLayers.js" charset="utf-8"></script>
11
<script type="text/javascript" src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js" charset="utf-8"></script>
13
<script type="text/javascript" charset="utf-8">
14
function set_cookie(c_key, c_val) {
15
var c = c_key + '=' + c_val;
17
// cookie expires in 1 month
19
dt.setTime(dt.getTime() + (30 * 24 * 60 * 60 * 1000));
20
c = c + '; expires=' + dt.toGMTString();
25
function get_cookie(c_key) {
26
var c_key_eq = c_key + "=";
27
var cookies = document.cookie.split(';');
29
for(i = 0; i < cookies.length; i++) {
30
var cookie = cookies[i];
31
while (cookie.charAt(0)==' ') {
32
cookie = cookie.substring(1, cookie.length);
35
if (cookie.indexOf(c_key_eq) == 0) {
36
return cookie.substring(c_key_eq.length, cookie.length);
43
// Coordinates for Ottawa, ON or values saved in cookies
44
var lat = get_cookie('lat') != null ? parseFloat(get_cookie('lat').replace(/^\s+|\s+$/g,"")) : 48.8957;
45
var lon = get_cookie('lon') != null ? parseFloat(get_cookie('lon').replace(/^\s+|\s+$/g,"")) : 2.388;
46
var zoom = get_cookie('zoom') != null ? parseInt(get_cookie('zoom').replace(/^\s+|\s+$/g,"")) : 14;
50
var map; // holds Map object
51
var markers = {users: null, events: null}; // holds Markers object
52
var my_markers = new Array(); // our list of Markers
54
// Set the language to English
55
OpenLayers.Lang.setCode("en");
57
// Determines if the marker is within the bounds of the visible part of the map at the current zoom level
58
function marker_is_in_view(marker) {
59
var tlLonLat = map.getLonLatFromPixel(new OpenLayers.Pixel(1,1)).
60
transform(map.getProjectionObject(),map.displayProjection);
61
var mapsize = map.getSize();
62
var brLonLat = map.getLonLatFromPixel(new OpenLayers.Pixel(mapsize.w - 1, mapsize.h - 1)).
63
transform(map.getProjectionObject(),map.displayProjection);
65
var tlLonLatF = new OpenLayers.LonLat(tlLonLat.lon, tlLonLat.lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
66
var brLonLatF = new OpenLayers.LonLat(brLonLat.lon, brLonLat.lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
68
if (tlLonLatF.lon <= marker.lonlat.lon && marker.lonlat.lon <= brLonLatF.lon &&
69
tlLonLatF.lat >= marker.lonlat.lat && marker.lonlat.lat >= brLonLatF.lat) {
76
// Determines if the parameter is in the my_markers array
77
function marker_in_my_markers(marker) {
78
for (var i = 0; i < my_markers.length; i++) {
79
if (my_markers[i].lonlat.lon == marker.lonlat.lon && my_markers[i].lonlat.lat == marker.lonlat.lat) {
86
// When the map is moved, fetch some markers
88
function moveend_listener(evt) {
93
var zoom = map.getZoom();
94
var tlLonLat = map.getLonLatFromPixel(new OpenLayers.Pixel(1,1)).
95
transform(map.getProjectionObject(),map.displayProjection);
96
var mapsize = map.getSize();
97
var brLonLat = map.getLonLatFromPixel(new OpenLayers.Pixel(mapsize.w - 1, mapsize.h - 1)).
98
transform(map.getProjectionObject(),map.displayProjection);
100
var url = (function() {
102
var width = (tlLonLat.lat - brLonLat.lat) * more;
103
var height = (brLonLat.lon - tlLonLat.lon) * more;
105
return function(layer) {
106
return 'http://apicarte.ubuntu-fr.org/r/'
108
+ '/' + (brLonLat.lat - width)
109
+ ',' + (tlLonLat.lon - height)
110
+ ',' + (tlLonLat.lat + width)
111
+ ',' + (brLonLat.lon + height) + '.json';
115
// GET and process some markers
116
var cb = function(evt) {
119
if (request.readyState != 4)
122
if (request.status != 200)
125
var data = request.responseText.indexOf('{');
126
var layer = request.responseText.substring(0, data);
127
data = JSON.parse(request.responseText.substring(data));
129
var my_markers_2 = new Array();
130
while (my_markers.length > 0) {
131
var current_marker = my_markers.pop();
132
if (last_zoom < map.getZoom() && marker_is_in_view(current_marker) == 1) {
133
my_markers_2.push(current_marker);
135
markers[layer].removeMarker(current_marker);
136
current_marker.destroy();
139
my_markers = my_markers_2;
140
last_zoom = map.getZoom();
142
data.matches.forEach(function(wpt) {
143
// Build a new marker
144
var size = new OpenLayers.Size(32, 37);
145
var offset = new OpenLayers.Pixel(-(size.w / 2), -size.h);
146
var icon = new OpenLayers.Icon("http://osm.org/images/osm_logo.png", size, offset);
147
var lonLatMarker = new OpenLayers.LonLat(wpt.longitude, wpt.latitude).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
148
var marker = new OpenLayers.Marker(lonLatMarker, icon);
150
if (marker_in_my_markers(marker) == 1) {
151
// if we already have this marker on the map, don't try to re-add it
154
// Add the marker to the map
155
var feature = new OpenLayers.Feature(markers[layer], lonLatMarker);
156
feature.closeBox = true;
157
feature.popupClass = OpenLayers.Class(OpenLayers.Popup.AnchoredBubble, {minSize: new OpenLayers.Size(300, 180) } );
158
feature.data.popupContentHTML = '<h2>' + wpt.key + '</h2><p>' + wpt.properties.desc + '</p>';
159
feature.data.overflow = 'auto';
160
marker.feature = feature;
162
var markerClick = function(evt) {
163
if (this.popup == null) {
164
this.popup = this.createPopup(this.closeBox);
165
map.addPopup(this.popup);
170
OpenLayers.Event.stop(evt);
173
marker.events.register("mousedown", feature, markerClick);
175
markers[layer].addMarker(marker);
176
my_markers.push(marker);
181
for (var layer in markers) {
182
var request = new XMLHttpRequest;
183
request.onreadystatechange = cb;
184
request.open('GET', url(layer), true);
188
var centerLonLat = map.getLonLatFromPixel(new OpenLayers.Pixel(mapsize.w / 2, mapsize.h / 2)). transform(map.getProjectionObject(),map.displayProjection);
190
set_cookie('lon', centerLonLat.lon);
191
set_cookie('lat', centerLonLat.lat);
192
set_cookie('zoom', map.getZoom());
195
// Initialize the map
198
map = new OpenLayers.Map ("map", {
199
controls: [new OpenLayers.Control.Navigation(), new OpenLayers.Control.PanZoomBar()],
200
maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
201
maxResolution: 156543.0399,
204
projection: new OpenLayers.Projection("EPSG:900913"),
205
displayProjection: new OpenLayers.Projection("EPSG:4326"),
206
eventListeners: { "moveend": moveend_listener, "zoomend": moveend_listener }
209
var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
210
map.addLayer(layerMapnik);
212
var layerTah = new OpenLayers.Layer.OSM.Osmarender("Tiles@Home");
213
map.addLayer(layerTah);
215
var layerCycleMap = new OpenLayers.Layer.OSM.CycleMap("CycleMap");
216
map.addLayer(layerCycleMap);
218
for (var layer in markers) {
219
markers[layer] = new OpenLayers.Layer.Markers(layer.name);
220
map.addLayer(markers[layer]);
223
map.addControl(new OpenLayers.Control.LayerSwitcher());
225
var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
226
map.setCenter(lonLat, zoom);
231
<body onload="init();">