diff options
Diffstat (limited to 'web')
-rw-r--r-- | web/cobrands/fixmystreet-uk-councils/alloy.js | 127 | ||||
-rw-r--r-- | web/cobrands/fixmystreet/assets.js | 10 | ||||
-rw-r--r-- | web/cobrands/northamptonshire/assets.js | 481 |
3 files changed, 616 insertions, 2 deletions
diff --git a/web/cobrands/fixmystreet-uk-councils/alloy.js b/web/cobrands/fixmystreet-uk-councils/alloy.js new file mode 100644 index 000000000..064237072 --- /dev/null +++ b/web/cobrands/fixmystreet-uk-councils/alloy.js @@ -0,0 +1,127 @@ +(function(){ + +OpenLayers.Protocol.Alloy = OpenLayers.Class(OpenLayers.Protocol.HTTP, { + read: function(options) { + OpenLayers.Protocol.prototype.read.apply(this, arguments); + options = options || {}; + options.params = OpenLayers.Util.applyDefaults( + options.params, this.options.params); + options = OpenLayers.Util.applyDefaults(options, this.options); + var all_tiles = this.getTileRange_(options.scope.bounds, options.scope.layer.maxExtent, options.scope.layer.map); + var rresp; + var start = new Date(); + var max = all_tiles.length; + $(fixmystreet).trigger('alloy:start_request', [start, max]); + for (var i = 0; i < max; i++) { + var resp = new OpenLayers.Protocol.Response({requestType: "read"}); + resp.start = start; + var url = this.getURL(all_tiles[i], options); + resp.priv = OpenLayers.Request.GET({ + url: url, //options.url, + callback: this.createCallback(this.handleRead, resp, options), + params: options.params, + headers: options.headers + }); + rresp = resp; + } + return rresp; + }, + + getURL: function(coords, options) { + return OpenLayers.String.format(options.base, {'layerid': options.layerid, 'layerVersion': options.layerVersion, 'z': 15, 'x': coords[0], 'y': coords[1]}); + }, + + getTileRange_: function(bounds, maxExtent, map) { + var min = this.getTileCoord_([bounds.left, bounds.top], maxExtent, map, true); + var max = this.getTileCoord_([bounds.right, bounds.bottom], maxExtent, map, false); + var coords = []; + for (var i = min[0], ii = max[0]; i <= ii; ++i) { + for (var j = min[1], jj = max[1]; j <= jj; ++j) { + coords.push([i,j]); + } + } + return coords; + }, + + getTileCoord_: function(bounds, maxExtent, map, reverse) { + var origin = new OpenLayers.LonLat(maxExtent.left, maxExtent.top); + var resolution = map.getResolutionForZoom(3); + + var adjustX = reverse ? 0.5 : 0; + var adjustY = reverse ? 0 : 0.5; + var xFromOrigin = Math.floor((bounds[0] - origin.lon) / resolution + adjustX); + var yFromOrigin = Math.floor((bounds[1] - origin.lat) / resolution + adjustY); + var tileCoordX = Math.floor(xFromOrigin / 512); + var tileCoordY = Math.floor(yFromOrigin / 512) * -1; + + if (reverse) { + tileCoordX -= 1; + tileCoordY -= 1; + } + + return [ tileCoordX, tileCoordY ]; + } +}); + +OpenLayers.Strategy.Alloy = OpenLayers.Class(OpenLayers.Strategy.FixMyStreet, { + count: 0, + max: 0, + requestStart: 0, + initialize: function(name, options) { + OpenLayers.Strategy.FixMyStreet.prototype.initialize.apply(this, arguments); + $(fixmystreet).on('alloy:start_request', this.newRequest.bind(this)); + }, + newRequest: function(evt, start, max) { + this.max = max; + this.requestStart = start; + this.count = 0; + this.layer.destroyFeatures(); + }, + merge: function(resp) { + // because we are issuing async requests it's possible that if someone moves the + // map we've triggered a new set of requests, in which case ignore the old ones. + if (resp.start < this.requestStart) { + return; + } + this.count++; + // This if/else clause lifted from OpenLayers.Strategy.BBOX + if (resp.success()) { + var features = resp.features; + if(features && features.length > 0) { + var remote = this.layer.projection; + var local = this.layer.map.getProjectionObject(); + if(!local.equals(remote)) { + var geom; + for(var i=0, len=features.length; i<len; ++i) { + geom = features[i].geometry; + if(geom) { + geom.transform(remote, local); + } + } + } + this.layer.addFeatures(features); + } + } else { + this.bounds = null; + } + // only fire loadend things if we've got all the tiles + if (this.count == this.max) { + if ( this.layer.checkFeature ) { + this.layer.checkFeature(null, fixmystreet.get_lonlat_from_dom()); + } + this.layer.events.triggerEvent("loadend", {response: resp}); + } + }, + +}); + +fixmystreet.assets.alloy_defaults = { + http_options: { + base: "https://alloy-api-tile01.yotta.co.uk/api/render-layer/tile/${layerid}/28/${layerVersion}-/${z}/${x}/${y}", + }, + format_class: OpenLayers.Format.GeoJSON, + srsName: "EPSG:3857", + strategy_class: OpenLayers.Strategy.Alloy +}; + +})(); diff --git a/web/cobrands/fixmystreet/assets.js b/web/cobrands/fixmystreet/assets.js index 1761e6a3e..d22db7bed 100644 --- a/web/cobrands/fixmystreet/assets.js +++ b/web/cobrands/fixmystreet/assets.js @@ -190,7 +190,12 @@ OpenLayers.Layer.VectorNearest = OpenLayers.Class(OpenLayers.Layer.VectorAsset, updateUSRNField: function() { if (this.fixmystreet.usrn) { var usrn_field = this.fixmystreet.usrn.field; - var selected_usrn = this.selected_feature ? this.selected_feature.attributes[this.fixmystreet.usrn.attribute] : ''; + var selected_usrn; + if ( this.selected_feature ) { + selected_usrn = this.fixmystreet.getUSRN ? + this.fixmystreet.getUSRN(this.selected_feature) : + this.selected_feature.attributes[this.fixmystreet.usrn.attribute]; + } $("input[name=" + usrn_field + "]").val(selected_usrn); } }, @@ -521,7 +526,8 @@ fixmystreet.assets = { options.format_options.geometryName = options.geometryName; } protocol_options.format = new options.format_class(options.format_options); - protocol = new OpenLayers.Protocol.HTTP(protocol_options); + var protocol_class = options.protocol_class || OpenLayers.Protocol.HTTP; + protocol = new protocol_class(protocol_options); } else { protocol_options = { version: "1.1.0", diff --git a/web/cobrands/northamptonshire/assets.js b/web/cobrands/northamptonshire/assets.js new file mode 100644 index 000000000..2b35de674 --- /dev/null +++ b/web/cobrands/northamptonshire/assets.js @@ -0,0 +1,481 @@ +(function(){ + +if (!fixmystreet.maps) { + return; +} + + +var layers = [ + /* +{ + "layer_name": "Street Lights", + "layer": 5, + "version": "5.4-9.6-" +}, +{ + "layer_name": "Street Lighting Nightscape", + "layer": 9, + "version": "9.6-" +}, +{ + "layer_name": "Carriageways", + "layer": 20, + "version": "20.54-" +}, +{ + "layer_name": "Road Heirarchy", + "layer": 39, + "version": "39.53-" +}, +{ + "layer_name": "Posts", + "layer": 59, + "version": "59.133-" +}, +{ + "layer_name": "Grips", + "layer": 61, + "version": "61.1-" +}, +{ + "layer_name": "Traffic Monitoring", + "layer": 62, + "version": "62.2-" +}, +{ + "layer_name": "Special Treatment", + "layer": 64, + "version": "64.1-" +}, +{ + "layer_name": "Gully", + "layer": 66, + "version": "66.9-" +}, +{ + "layer_name": "Channel", + "layer": 68, + "version": "68.2-" +}, +{ + "layer_name": "Comms Cabinet", + "layer": 69, + "version": "69.1-" +}, +{ + "layer_name": "Steps", + "layer": 70, + "version": "70.1-" +}, +{ + "layer_name": "Step Handrail", + "layer": 71, + "version": "71.1-" +}, +{ + "layer_name": "Tree Group", + "layer": 74, + "version": "74.1-" +}, +{ + "layer_name": "Defects Ancillary Items", + "layer": 171, + "version": "171.33-" +}, +{ + "layer_name": "Speed Limit", + "layer": 172, + "version": "172.33-" +}, +{ + "layer_name": "PRoW Network", + "layer": 173, + "version": "173.1-" +}, +{ + "layer_name": "Footway Schemes", + "layer": 174, + "version": "174.1-" +}, +{ + "layer_name": "FINGER POST", + "layer": 178, + "version": "178.39-" +}, +{ + "layer_name": "GAPS", + "layer": 179, + "version": "179.1-" +}, +{ + "layer_name": "OBSTRUCTIONS", + "layer": 182, + "version": "182.2-" +}, +{ + "layer_name": "STEPS", + "layer": 184, + "version": "184.2-" +}, +{ + "layer_name": "Gate Types", + "layer": 191, + "version": "191.2-" +}, +{ + "layer_name": "Gate Condition", + "layer": 192, + "version": "192.2-" +}, +{ + "layer_name": "Bridge Type", + "layer": 193, + "version": "193.17-" +}, +{ + "layer_name": "Bridge Condition", + "layer": 194, + "version": "194.17-" +}, +{ + "layer_name": "PRoW Net By Type", + "layer": 201, + "version": "201.1-" +}, +{ + "layer_name": "Finger Post Condition", + "layer": 209, + "version": "209.39-" +}, +{ + "layer_name": "F Post Path Type", + "layer": 210, + "version": "210.39-" +}, +{ + "layer_name": "AW_Sewer", + "layer": 215, + "version": "215.1-" +}, +{ + "layer_name": "CCTV", + "layer": 218, + "version": "218.1-" +}, +{ + "layer_name": "VMS", + "layer": 219, + "version": "219.1-" +}, +{ + "layer_name": "Warning Signs", + "layer": 220, + "version": "220.1-" +}, +{ + "layer_name": "Traffic Calming", + "layer": 221, + "version": "221.1-" +}, +{ + "layer_name": "Bluetooth Counter", + "layer": 222, + "version": "222.1-" +}, +{ + "layer_name": "Midblock", + "layer": 223, + "version": "223.1-" +}, +{ + "layer_name": "Over Height", + "layer": 224, + "version": "224.1-" +}, +{ + "layer_name": "RTI Display", + "layer": 226, + "version": "226.1-" +}, +{ + "layer_name": "System Links", + "layer": 227, + "version": "227.1-" +}, +{ + "layer_name": "CULVERTS (PRoW)", + "layer": 229, + "version": "229.1-" +}, +{ + "layer_name": "PEDESTRIAN GUARDRAIL", + "layer": 230, + "version": "230.1-" +}, +{ + "layer_name": "Traffic Signal Controller", + "layer": 231, + "version": "231.1-" +}, +{ + "layer_name": "Traffic Signal Posts", + "layer": 232, + "version": "232.1-" +}, + */ +{ + "categories": [ "Grit Bin - damaged/replacement", "Grit Bin - empty/refill" ], + "item_name": "grit bin", + "layer_name": "Grit Bins", + "layer": 13, + "version": "13.7-" +}, +{ + "categories": [ "Highway Bridges - Damaged/Unsafe" ], + "asset_type": 'area', + "item_name": 'bridge', + "layer_name": "Structures", + "layer": 14, + "version": "14.3-" +}, +{ + "categories": [ "Damaged / Missing / Facing Wrong Way", "Obscured by vegetation or Dirty" ], + "item_name": "sign", + "layer_name": "Signs", + "layer": 303, + "version": "303.1-" +}, +{ + "categories": [ "Shelter Damaged", "Sign/Pole Damaged" ], + "layer_name": "Bus Stop", + "layer": 72, + "version": "72.8-" +}, +{ + "categories": [ "Bridge-Damaged/ Missing" ], + "item_name": "bridge", + "layer_name": "BRIDGES", + "layer": 177, + "version": "177.18-" +}, +{ + "categories": [ "Gate - Damaged/ Missing" ], + "layer_name": "GATE", + "layer": 181, + "version": "181.3-" +}, +{ + "categories": [ "Stile-Damaged/Missing" ], + "layer_name": "STILE", + "layer": 185, + "version": "185.3-" +}, +{ + "categories": [ "Sign/Waymarking - Damaged/Missing" ], + "item_name": "waymarking", + "layer_name": "WAYMARK POST", + "layer": 187, + "version": "187.3-" +}, +{ + "categories": [ + "Damaged/Exposed Wiring / Vandalised", + "Lamp/Bulb Failure", + "Signal Failure", + "Signal Failure all out", + "Signal Stuck", + "Signal Head Failure", + "Request Timing Review", + "Damaged Control box", + "Signal Failure/Damaged - Toucan/Pelican", + ], + "item_name": "signal or crossing", + "layer_name": "TL Junction", + "layer": 225, + "version": "225.5-" +}, +{ + "categories": [ + "Fallen Tree", + "Restricted Visibility / Overgrown / Overhanging", + "Restricted Visibility", + ], + "layer_name": "Tree", + "layer": 228, + "version": "228.24-" +}, +{ + "categories": [ "Safety Bollard - Damaged/Missing" ], + "layer_name": "Safety Bollard", + "layer": 233, + "version": "233.27-" +}, +]; + +$.each(layers, function(index, layer) { + if ( layer.categories ) { + fixmystreet.assets.add($.extend(true, {}, fixmystreet.assets.alloy_defaults, { + protocol: OpenLayers.Protocol.Alloy, + http_options: { + layerid: layer.layer, + layerVersion: layer.version, + }, + non_interactive: false, + asset_type: layer.asset_type || 'spot', + body: "Northamptonshire County Council", + asset_category: layer.categories, + asset_item: layer.item_name || layer.layer_name.toLowerCase(), + attributes: { + asset_resource_id: function() { + return this.fid; + } + } + })); + } +}); + +fixmystreet.assets.add($.extend(true, {}, fixmystreet.assets.alloy_defaults, { + protocol: OpenLayers.Protocol.Alloy, + http_options: { + layerid: 221, + layerVersion: '221.4-', + }, + body: "Northamptonshire County Council", + road: true, + asset_type: "area", + always_visible: false, + non_interactive: true, + asset_category: [ + "Damaged Speed Humps", + ], + usrn: { + attribute: 'fid', + field: 'asset_resource_id' + }, + getUSRN: function(feature) { + return feature.fid; + } +})); + +var barrier_style = new OpenLayers.Style({ + fill: false, + strokeColor: "#555555", + strokeOpacity: 1, + strokeWidth: 4 +}); + +fixmystreet.assets.add($.extend(true, {}, northants_defaults, { + protocol_class: OpenLayers.Protocol.Alloy, + http_options: { + layerid: 230, + layerVersion: '230.2-', + }, + stylemap: new OpenLayers.StyleMap({ + 'default': barrier_style + }), + body: "Northamptonshire County Council", + road: true, + always_visible: false, + non_interactive: true, + asset_category: [ + "Pedestrian Barriers - Damaged / Missing", + ], + usrn: { + attribute: 'fid', + field: 'asset_resource_id' + }, + getUSRN: function(feature) { + return feature.fid; + } +})); + +var highways_style = new OpenLayers.Style({ + fill: false, + strokeColor: "#111111", + strokeOpacity: 0.1, + strokeWidth: 7 +}); + +fixmystreet.assets.add($.extend(true, {}, fixmystreet.assets.alloy_defaults, { + protocol: OpenLayers.Protocol.Alloy, + http_options: { + layerid: 308, + layerVersion: '308.8-', + }, + stylemap: new OpenLayers.StyleMap({ + 'default': highways_style + }), + body: "Northamptonshire County Council", + road: true, + always_visible: false, + non_interactive: true, + asset_category: [ + "Loose / Raised/Sunken", + "Broken / Missing", + "Blocked - flooding private property", + "Blocked - flooding road/path", + "Blocked/Damaged", + "Blocked Ditch", + "Blocked Ditch Causing Flooding", + "Obstruction (Not Vegetation)", + "Pothole / Failed Reinstatement", + "Slabs - Uneven / Damaged / Cracked", + "Slabs - Missing", + "Damaged/Loose", + "Missing", + "Crash Barriers - Damaged / Missing", + "Road Markings - Worn/Faded", + "Flooding", + "Mud on Road", + "Potholes / Highway Condition", + "Spill - Oil/Diesel", + "Damaged/Missing", + "Weeds", + "Verges - Damaged by Vehicles", + "Icy Footpath", + "Icy Road", + "Missed published Gritted Route", + ], + usrn: { + attribute: 'fid', + field: 'asset_resource_id' + }, + getUSRN: function(feature) { + return feature.fid; + } +})); + +var prow_style = new OpenLayers.Style({ + fill: false, + strokeColor: "#115511", + strokeOpacity: 0.1, + strokeWidth: 7 +}); + +fixmystreet.assets.add($.extend(true, {}, fixmystreet.assets.alloy_defaults, { + protocol_class: OpenLayers.Protocol.Alloy, + http_options: { + layerid: 173, + layerVersion: '173.1-', + }, + stylemap: new OpenLayers.StyleMap({ + 'default': prow_style + }), + body: "Northamptonshire County Council", + road: true, + always_visible: false, + non_interactive: true, + asset_category: [ + "Livestock", + "Passage-Obstructed/Overgrown" + ], + usrn: { + attribute: 'fid', + field: 'asset_resource_id' + }, + getUSRN: function(feature) { + return feature.fid; + } +})); + +})(); |