aboutsummaryrefslogtreecommitdiffstats
path: root/web/js
diff options
context:
space:
mode:
Diffstat (limited to 'web/js')
-rw-r--r--web/js/map-OpenLayers.js106
-rw-r--r--web/js/map-cheshireeast.js33
-rw-r--r--web/js/map-wmts-bristol.js12
-rw-r--r--web/js/map-wmts-buckinghamshire.js12
-rw-r--r--web/js/map-wmts-hounslow.js12
-rw-r--r--web/js/map-wmts-isleofwight.js23
-rw-r--r--web/js/map-wmts-zurich.js12
7 files changed, 145 insertions, 65 deletions
diff --git a/web/js/map-OpenLayers.js b/web/js/map-OpenLayers.js
index eb62904b0..4af5e61d4 100644
--- a/web/js/map-OpenLayers.js
+++ b/web/js/map-OpenLayers.js
@@ -250,9 +250,11 @@ $.extend(fixmystreet.utils, {
marker_size: function() {
var zoom = fixmystreet.map.getZoom() + fixmystreet.zoomOffset;
- if (zoom >= 15) {
+ var size_normal = fixmystreet.maps.zoom_for_normal_size || 15;
+ var size_small = fixmystreet.maps.zoom_for_small_size || 13;
+ if (zoom >= size_normal) {
return window.selected_problem_id ? 'small' : 'normal';
- } else if (zoom >= 13) {
+ } else if (zoom >= size_small) {
return window.selected_problem_id ? 'mini' : 'small';
} else {
return 'mini';
@@ -261,9 +263,11 @@ $.extend(fixmystreet.utils, {
selected_marker_size: function() {
var zoom = fixmystreet.map.getZoom() + fixmystreet.zoomOffset;
- if (zoom >= 15) {
+ var size_normal = fixmystreet.maps.zoom_for_normal_size || 15;
+ var size_small = fixmystreet.maps.zoom_for_small_size || 13;
+ if (zoom >= size_normal) {
return 'big';
- } else if (zoom >= 13) {
+ } else if (zoom >= size_small) {
return 'normal';
} else {
return 'small';
@@ -375,6 +379,96 @@ $.extend(fixmystreet.utils, {
new OpenLayers.LonLat( state.lon, state.lat ),
state.zoom
);
+ },
+
+ setup_geolocation: function() {
+ if (!OpenLayers.Control.Geolocate || !fixmystreet.map ||
+ !fixmystreet.utils || !fixmystreet.utils.parse_query_string ||
+ fixmystreet.utils.parse_query_string().geolocate !== '1'
+ ) {
+ return;
+ }
+
+ var layer;
+
+ function createCircleOfUncertainty(e) {
+ var loc = new OpenLayers.Geometry.Point(e.point.x, e.point.y);
+ return new OpenLayers.Feature.Vector(
+ OpenLayers.Geometry.Polygon.createRegularPolygon(
+ loc,
+ e.position.coords.accuracy,
+ 40,
+ 0
+ ),
+ {},
+ {
+ fillColor: '#0074FF',
+ fillOpacity: 0.3,
+ strokeWidth: 0
+ }
+ );
+ }
+ function addGeolocationLayer(e) {
+ layer = new OpenLayers.Layer.Vector('Geolocation');
+ fixmystreet.map.addLayer(layer);
+ layer.setZIndex(fixmystreet.map.getLayersByName("Pins")[0].getZIndex() - 1);
+ var marker = new OpenLayers.Feature.Vector(
+ new OpenLayers.Geometry.Point(e.point.x, e.point.y),
+ {
+ marker: true
+ },
+ {
+ graphicName: 'circle',
+ strokeColor: '#fff',
+ strokeWidth: 4,
+ fillColor: '#0074FF',
+ fillOpacity: 1,
+ pointRadius: 10
+ }
+ );
+ layer.addFeatures([ createCircleOfUncertainty(e), marker ]);
+ }
+
+ function updateGeolocationMarker(e) {
+ if (!layer) {
+ addGeolocationLayer(e);
+ } else {
+ // Reuse the existing circle marker so its DOM element (and
+ // hopefully CSS animation) is preserved.
+ var marker = layer.getFeaturesByAttribute('marker', true)[0];
+ // Can't reuse the background circle feature as there seems to
+ // be no easy way to replace its geometry with a new
+ // circle sized according to this location update's accuracy.
+ // Instead recreate the feature from scratch.
+ var uncertainty = createCircleOfUncertainty(e);
+ // Because we're replacing the accuracy circle, it needs to be
+ // rendered underneath the location marker. In order to do this
+ // we have to remove all features and re-add, as simply removing
+ // and re-adding one feature will always render it on top of others.
+ layer.removeAllFeatures();
+ layer.addFeatures([ uncertainty, marker ]);
+
+ // NB The above still breaks CSS animation because the marker
+ // was removed from the DOM and re-added. We could leave the
+ // marker alone and just remove the uncertainty circle
+ // feature, re-add it as a new feature and then manually shift
+ // its position in the DOM by getting its element's ID from
+ // uncertainty.geometry.id and moving it before the <circle>
+ // element.
+
+ // Don't forget to update the position of the GPS marker.
+ marker.move(new OpenLayers.LonLat(e.point.x, e.point.y));
+ }
+ }
+
+ var control = new OpenLayers.Control.Geolocate({
+ bind: false, // Don't want the map to pan to each location
+ watch: true,
+ enableHighAccuracy: true
+ });
+ control.events.register("locationupdated", null, updateGeolocationMarker);
+ fixmystreet.map.addControl(control);
+ control.activate();
}
});
@@ -787,6 +881,10 @@ $.extend(fixmystreet.utils, {
setup_inspector_marker_drag();
}
+ if (fixmystreet.page == "around" || fixmystreet.page == "new") {
+ fixmystreet.maps.setup_geolocation();
+ }
+
if ( fixmystreet.zoomToBounds ) {
zoomToBounds( fixmystreet.markers.getDataExtent() );
}
diff --git a/web/js/map-cheshireeast.js b/web/js/map-cheshireeast.js
new file mode 100644
index 000000000..cedc92dba
--- /dev/null
+++ b/web/js/map-cheshireeast.js
@@ -0,0 +1,33 @@
+fixmystreet.maps.config = function() {
+ fixmystreet.controls = [
+ new OpenLayers.Control.Attribution(),
+ new OpenLayers.Control.ArgParserFMS(),
+ new OpenLayers.Control.Navigation(),
+ new OpenLayers.Control.PermalinkFMS('map'),
+ new OpenLayers.Control.PanZoomFMS({id: 'fms_pan_zoom' })
+ ];
+ /* Linking back to around from report page, keeping track of map moves */
+ if ( fixmystreet.page == 'report' ) {
+ fixmystreet.controls.push( new OpenLayers.Control.PermalinkFMS('key-tool-problems-nearby', '/around') );
+ }
+ fixmystreet.map_type = OpenLayers.Layer.CheshireEast;
+};
+
+OpenLayers.Layer.CheshireEast = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+ url: 'https://maps-cache.cheshiresharedservices.gov.uk/maps/?wmts/CE_OS_AllBasemaps_COLOUR/oscce_grid/${z}/${x}/${y}.jpeg&KEY=3a3f5c60eca1404ea114e6941c9d3895',
+
+ initialize: function(name, options) {
+ options = OpenLayers.Util.extend({
+ units: "m",
+ projection: new OpenLayers.Projection("EPSG:27700"),
+ maxExtent: new OpenLayers.Bounds(-3276800, -3276800, 3276800, 3276800),
+ resolutions: [1792.003584007169, 896.0017920035843, 448.0008960017922, 224.0004480008961, 112.000224000448, 56.000112000224014, 28.000056000111993, 14.000028000056004, 7.000014000028002, 2.8000056000112004, 1.4000028000056002, 0.7000014000028001, 0.35000070000140004, 0.14000028000056003].slice(fixmystreet.zoomOffset || 0),
+ }, options);
+ OpenLayers.Layer.XYZ.prototype.initialize.call(this, name, this.url, options);
+ },
+
+ CLASS_NAME: "OpenLayers.Layer.CheshireEast"
+});
+
+fixmystreet.maps.zoom_for_normal_size = 7;
+fixmystreet.maps.zoom_for_small_size = 4;
diff --git a/web/js/map-wmts-bristol.js b/web/js/map-wmts-bristol.js
index 757f347df..2090fa0cf 100644
--- a/web/js/map-wmts-bristol.js
+++ b/web/js/map-wmts-bristol.js
@@ -115,13 +115,5 @@ fixmystreet.maps.config = function() {
this.setup_wmts_base_map();
};
-fixmystreet.maps.marker_size = function() {
- var zoom = fixmystreet.map.getZoom() + fixmystreet.zoomOffset;
- if (zoom >= 7) {
- return 'normal';
- } else if (zoom >= 4) {
- return 'small';
- } else {
- return 'mini';
- }
-};
+fixmystreet.maps.zoom_for_normal_size = 7;
+fixmystreet.maps.zoom_for_small_size = 4;
diff --git a/web/js/map-wmts-buckinghamshire.js b/web/js/map-wmts-buckinghamshire.js
index ee5ac8753..ae44cdf13 100644
--- a/web/js/map-wmts-buckinghamshire.js
+++ b/web/js/map-wmts-buckinghamshire.js
@@ -130,13 +130,5 @@ fixmystreet.maps.config = function() {
this.setup_wmts_base_map();
};
-fixmystreet.maps.marker_size = function() {
- var zoom = fixmystreet.map.getZoom() + fixmystreet.zoomOffset;
- if (zoom >= 7) {
- return 'normal';
- } else if (zoom >= 4) {
- return 'small';
- } else {
- return 'mini';
- }
-};
+fixmystreet.maps.zoom_for_normal_size = 7;
+fixmystreet.maps.zoom_for_small_size = 4;
diff --git a/web/js/map-wmts-hounslow.js b/web/js/map-wmts-hounslow.js
index 1f8927b3f..d021fab50 100644
--- a/web/js/map-wmts-hounslow.js
+++ b/web/js/map-wmts-hounslow.js
@@ -177,13 +177,5 @@ fixmystreet.maps.config = function() {
this.setup_wmts_base_map();
};
-fixmystreet.maps.marker_size = function() {
- var zoom = fixmystreet.map.getZoom() + fixmystreet.zoomOffset;
- if (zoom >= 8) {
- return 'normal';
- } else if (zoom >= 4) {
- return 'small';
- } else {
- return 'mini';
- }
-};
+fixmystreet.maps.zoom_for_normal_size = 8;
+fixmystreet.maps.zoom_for_small_size = 4;
diff --git a/web/js/map-wmts-isleofwight.js b/web/js/map-wmts-isleofwight.js
index 464bee913..57e41e696 100644
--- a/web/js/map-wmts-isleofwight.js
+++ b/web/js/map-wmts-isleofwight.js
@@ -183,24 +183,5 @@ fixmystreet.maps.config = function() {
this.setup_wmts_base_map();
};
-fixmystreet.maps.marker_size = function() {
- var zoom = fixmystreet.map.getZoom() + fixmystreet.zoomOffset;
- if (zoom >= 7) {
- return 'normal';
- } else if (zoom >= 4) {
- return 'small';
- } else {
- return 'mini';
- }
-};
-
-fixmystreet.maps.selected_marker_size = function() {
- var zoom = fixmystreet.map.getZoom() + fixmystreet.zoomOffset;
- if (zoom >= 7) {
- return 'big';
- } else if (zoom >= 4) {
- return 'normal';
- } else {
- return 'small';
- }
-};
+fixmystreet.maps.zoom_for_normal_size = 7;
+fixmystreet.maps.zoom_for_small_size = 4;
diff --git a/web/js/map-wmts-zurich.js b/web/js/map-wmts-zurich.js
index 346e9b89a..436dca6ff 100644
--- a/web/js/map-wmts-zurich.js
+++ b/web/js/map-wmts-zurich.js
@@ -152,13 +152,5 @@ fixmystreet.maps.config = function() {
fixmystreet.area_format = { fillColor: 'none', strokeWidth: 4, strokeColor: 'black' };
};
-fixmystreet.maps.marker_size = function() {
- var zoom = fixmystreet.map.getZoom() + fixmystreet.zoomOffset;
- if (zoom >= 6) {
- return 'normal';
- } else if (zoom >= 3) {
- return 'small';
- } else {
- return 'mini';
- }
-};
+fixmystreet.maps.zoom_for_normal_size = 6;
+fixmystreet.maps.zoom_for_small_size = 3;