{"version":3,"file":"mainMap.bundle.min.js","mappings":"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","sources":["webpack://[name]/webpack/runtime/chunk loaded","webpack://[name]/./Scripts/AppGeoLocation.ts","webpack://[name]/./Scripts/AppRecordGeoLocation.ts","webpack://[name]/./Scripts/AppStorage.ts","webpack://[name]/./Scripts/BaseLayer.ts","webpack://[name]/./Scripts/BaseLayerFactory.ts","webpack://[name]/./Scripts/BingSession.ts","webpack://[name]/./Scripts/MainMap.ts","webpack://[name]/./Scripts/MapContextMenu.ts","webpack://[name]/./Scripts/MapGazetteer.ts","webpack://[name]/./Scripts/MapGpx.ts","webpack://[name]/./Scripts/MapGridRef.ts","webpack://[name]/./Scripts/MapHighlightFeatures.ts","webpack://[name]/./Scripts/MapSidePanel.ts","webpack://[name]/./Scripts/MapViewSettings.ts","webpack://[name]/./Scripts/MapViewStore.ts","webpack://[name]/./Scripts/MapfeatureInfo.ts","webpack://[name]/./Scripts/TrailwiseEventBus.ts","webpack://[name]/./Scripts/TrailwiseEvents.ts","webpack://[name]/external var \"bootstrap\"","webpack://[name]/webpack/bootstrap","webpack://[name]/webpack/runtime/compat get default export","webpack://[name]/webpack/runtime/define property getters","webpack://[name]/webpack/runtime/hasOwnProperty shorthand","webpack://[name]/webpack/runtime/make namespace object","webpack://[name]/webpack/runtime/runtimeId","webpack://[name]/webpack/runtime/jsonp chunk loading","webpack://[name]/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import { Feature, Overlay } from 'ol';\r\nimport Point from 'ol/geom/Point';\r\nimport olMap from 'ol/Map';\r\nimport Geolocation from 'ol/Geolocation';\r\nimport * as olProj from 'ol/proj';\r\nimport VectorLayer from 'ol/layer/Vector';\r\nimport VectorSource from 'ol/source/Vector';\r\nimport Style from \"ol/style/Style\";\r\nimport Fill from \"ol/style/Fill\";\r\nimport Circle from \"ol/style/Circle\";\r\nimport Stroke from \"ol/style/Stroke\";\r\nimport { AppStorage } from \"./AppStorage\";\r\nimport TrailwiseEventBus from './TrailwiseEventBus';\r\nimport { Modal } from 'bootstrap';\r\nimport LineString from 'ol/geom/LineString';\r\nimport GeometryLayout from 'ol/geom/GeometryLayout';\r\nimport OverlayPositioning from 'ol/OverlayPositioning';\r\nimport BaseLayer from 'ol/layer/Base';\r\nimport { AppRecordGeoLocation } from './AppRecordGeoLocation';\r\nimport { Coordinate } from 'ol/coordinate';\r\n\r\n\r\nexport class AppGeoLocation {\r\n\r\n private geolocation: Geolocation;\r\n private locateMeFeature: Feature;\r\n //private trackMeFeature: Feature;\r\n private locationLayer: VectorLayer;\r\n private trackingLocation: boolean = false;\r\n private hasTouch: boolean;\r\n private appStorage: AppStorage;\r\n private trackingModal: Modal;\r\n private geolocationModal: Modal;\r\n private previousM = 0;\r\n private deltaMean = 500; // the geolocation sampling period mean in ms\r\n private markerEl: HTMLImageElement;\r\n private marker: Overlay;\r\n private recordGeoLocation: AppRecordGeoLocation;\r\n private updateViewTriggered: boolean = false;\r\n private previousPosition: Coordinate = null;\r\n private orientateWhilstTracking: boolean = false; \r\n private didCenterOnLocation: boolean = false;\r\n // LineString to store the different geolocation positions. This LineString\r\n // is time aware.\r\n // The Z dimension is actually used to store the rotation (heading).\r\n private positions = new LineString([], GeometryLayout.XYZM);\r\n\r\n public constructor(private map: olMap, private baseLayer: BaseLayer) {\r\n this.init();\r\n }\r\n\r\n private init = (): void => {\r\n let self = this\r\n\r\n this.geolocationModal = new Modal(document.getElementById('geoLocationModal'));\r\n this.trackingModal = new Modal(document.getElementById('trackingModal'));\r\n this.hasTouch = ('ontouchstart' in window || navigator.msMaxTouchPoints > 0);\r\n this.addLocationLayer(this.map);\r\n this.appStorage = new AppStorage();\r\n this.recordGeoLocation = new AppRecordGeoLocation();\r\n this.geolocation = new Geolocation({\r\n tracking: false,\r\n projection: this.map.getView().getProjection(),\r\n trackingOptions: {\r\n enableHighAccuracy: true,\r\n maximumAge: 20000,\r\n timeout: 10000\r\n }\r\n });\r\n\r\n // Geolocation marker\r\n this.markerEl = document.getElementById('geolocation_marker') as HTMLImageElement;\r\n this.markerEl.style.display = \"block\";\r\n this.marker = new Overlay({\r\n positioning: OverlayPositioning.CENTER_CENTER,\r\n element: this.markerEl,\r\n stopEvent: false\r\n });\r\n\r\n\r\n\r\n // Listen to position changes\r\n this.geolocation.on('change', function () {\r\n const position = self.geolocation.getPosition();\r\n const accuracy = self.geolocation.getAccuracy();\r\n const heading = self.geolocation.getHeading() || 0;\r\n const speed = self.geolocation.getSpeed() || 0;\r\n const m = Date.now();\r\n let distance: number = 0;\r\n\r\n if (self.orientateWhilstTracking) {\r\n //if the distance is < 1.5m and speed < 0.7 do not update the location (causing map to spin when stationary)\r\n if (self.previousPosition !== null) {\r\n let ls = new LineString([self.previousPosition, position])\r\n distance = ls.getLength();\r\n //console.log(\"Length:\" + distance);\r\n //console.log(\"Speed:\" + speed);\r\n if (distance < 2.5 && speed < 2) {\r\n return;\r\n }\r\n }\r\n\r\n TrailwiseEventBus.trackingGeolocationChange(self.geolocation);\r\n self.addPosition(position, heading, m, speed);\r\n\r\n const coords = self.positions.getCoordinates();\r\n const len = coords.length;\r\n if (len >= 2) {\r\n self.deltaMean = (coords[len - 1][3] - coords[0][3]) / (len - 1);\r\n }\r\n }\r\n else {\r\n //no orientation\r\n if (self.didCenterOnLocation === false) {\r\n //zoom in for start of tracking and from then on just centre the map\r\n self.map.getView().animate({ center: position, zoom: 16 });\r\n self.didCenterOnLocation = true;\r\n } else {\r\n self.map.getView().setCenter(position);\r\n self.marker.setPosition(position);\r\n } \r\n }\r\n\r\n //const html = [\r\n // 'Position: ' + position[0].toFixed(2) + ', ' + position[1].toFixed(2),\r\n // 'Accuracy: ' + accuracy,\r\n // 'Heading: ' + Math.round(self.radToDeg(heading)) + '°',\r\n // 'Speed: ' + (speed * 3.6).toFixed(1) + ' km/h',\r\n // 'Delta: ' + Math.round(self.deltaMean) + 'ms',\r\n //].join('
');\r\n //console.log('Position: ' + position[0].toFixed(2) + ', ' + position[1].toFixed(2));\r\n //console.log('Heading: ' + Math.round(self.radToDeg(heading)) + '°');\r\n //document.getElementById('info').innerHTML = html;\r\n });\r\n\r\n this.geolocation.on('error', function () { \r\n document.getElementById('btnStartTracking').removeEventListener('click', self.onStartTracking);\r\n document.getElementById('trackingModal').removeEventListener('hidden.bs.modal', self.onStartTracking);\r\n\r\n $('.ol-zoom').show();\r\n $('#btnTrackMeEnd').hide();\r\n $('#btnTrackMe').show();\r\n $('#btnLocateMe').removeAttr('disabled');\r\n\r\n if (self.trackingLocation) {\r\n //turn tracking off\r\n self.onTrackLocation();\r\n }\r\n\r\n self.geolocationModal.show();\r\n // FIXME we should remove the coordinates in positions\r\n });\r\n\r\n this.trackingLocation = false;\r\n\r\n //add touch class so that the button re-sizes the same as zoom controls\r\n if (this.hasTouch) {\r\n $('#btnGoToCurrentLocation').parent('.ol-geolocation').addClass('ol-touch');\r\n }\r\n\r\n $('#btnGoToCurrentLocation').on(\"click\", function (event) {\r\n self.toggleOptionsDialogue(10);\r\n });\r\n\r\n let onModalClose = function () {\r\n if (self.trackingLocation === false) {\r\n self.toggleOptionsDialogue(1000);\r\n } \r\n }\r\n\r\n //track me\r\n $('#btnTrackMe').on('click', function () {\r\n //self.showTrackingModal();\r\n self.updateViewTriggered = false;\r\n self.trackingModal.show(); \r\n\r\n document.getElementById('btnStartTracking').addEventListener('click', self.onStartTracking); \r\n document.getElementById('trackingModal').addEventListener('hidden.bs.modal', onModalClose);\r\n });\r\n\r\n $('#btnTrackMeEnd').on('click', function () {\r\n document.getElementById('btnStartTracking').removeEventListener('click', self.onStartTracking); \r\n document.getElementById('trackingModal').removeEventListener('hidden.bs.modal', onModalClose);\r\n\r\n $('#btnTrackMeEnd').hide();\r\n $('#btnTrackMe').show();\r\n $('#btnLocateMe').removeAttr('disabled');\r\n self.onTrackLocation();\r\n self.toggleOptionsDialogue(1000);\r\n });\r\n\r\n //locate me\r\n $('#btnLocateMe').on('click', function () {\r\n self.onLocateMe();\r\n });\r\n\r\n //got this\r\n //$('#ckTrackingGotThis').on('change', function () {\r\n // self.appStorage.setValue(\"TrackingGotThis\", $(this).prop(\"checked\"));\r\n //});\r\n\r\n //this.initSimulate();\r\n }\r\n\r\n private onStartTracking = (): void => { \r\n const self = this;\r\n $('#btnTrackMe').hide();\r\n $('#btnTrackMeEnd').show();\r\n $('#btnLocateMe').attr('disabled', 'disabled'); \r\n \r\n self.orientateWhilstTracking = $(\"#rdoTrackingOrientate\").prop(\"checked\");\r\n self.toggleOptionsDialogue(2500);\r\n self.onTrackLocation(); \r\n self.trackingModal.hide();\r\n\r\n window.setTimeout(function () {\r\n if (!self.updateViewTriggered) {\r\n //nudge the map, if starting tracking from the last tracking point (ie the map hasn't moved) then postrender won't be firing until there is some other interaction with the map\r\n self.map.getView().adjustCenter([1,1]); \r\n }\r\n }, 500);\r\n }\r\n\r\n private addPosition = (position, heading, m, speed): void => {\r\n const x = position[0];\r\n const y = position[1];\r\n const fCoords = this.positions.getCoordinates();\r\n const previous = fCoords[fCoords.length - 1];\r\n const prevHeading = previous && previous[2];\r\n if (prevHeading) {\r\n let headingDiff = heading - this.mod(prevHeading);\r\n\r\n // force the rotation change to be less than 180°\r\n if (Math.abs(headingDiff) > Math.PI) {\r\n const sign = headingDiff >= 0 ? 1 : -1;\r\n headingDiff = -sign * (2 * Math.PI - Math.abs(headingDiff));\r\n }\r\n heading = prevHeading + headingDiff;\r\n }\r\n this.positions.appendCoordinate([x, y, heading, m]);\r\n\r\n // only keep the 20 last coordinates\r\n this.positions.setCoordinates(this.positions.getCoordinates().slice(-20));\r\n\r\n // FIXME use speed instead\r\n if (heading && speed) {\r\n this.markerEl.src = '/images/geolocation_marker_heading2.png';\r\n } else {\r\n this.markerEl.src = '/images/geolocation_marker2.png';\r\n }\r\n\r\n this.previousPosition = position;\r\n }\r\n\r\n private updateView = (): void => {\r\n const self = this;\r\n\r\n // use sampling period to get a smooth transition\r\n let m = Date.now() - this.deltaMean * 1.5;\r\n m = Math.max(m, self.previousM);\r\n self.previousM = m;\r\n // interpolate position along positions LineString\r\n const c = self.positions.getCoordinateAtM(m, true);\r\n if (c) {\r\n self.map.getView().setCenter(self.getCenterWithHeading(c, -c[2], self.map.getView().getResolution()));\r\n self.map.getView().setRotation(-c[2]);\r\n self.marker.setPosition(c);\r\n self.map.render();\r\n self.updateViewTriggered = true;\r\n }\r\n }\r\n\r\n // recenters the view by putting the given coordinates at 3/4 from the top of\r\n // the screen\r\n private getCenterWithHeading = (position, rotation, resolution): [number, any] => {\r\n const size = this.map.getSize();\r\n const height = size[1];\r\n\r\n return [\r\n position[0] - (Math.sin(rotation) * height * resolution * 1) / 4,\r\n position[1] + (Math.cos(rotation) * height * resolution * 1) / 4,\r\n ];\r\n }\r\n\r\n private showTrackingModal = (): void => {\r\n //check if the user has dismissed this before \r\n if (this.appStorage.getValue(\"TrackingGotThis\") !== \"true\") {\r\n this.trackingModal.show();\r\n }\r\n }\r\n\r\n private onTrackLocation = (): void => { \r\n let self = this;\r\n\r\n if (self.trackingLocation === false) {\r\n TrailwiseEventBus.trackingStart(\"\");\r\n\r\n self.previousPosition = null;\r\n self.map.getView().setZoom(16); \r\n self.map.addOverlay(self.marker);\r\n\r\n self.geolocation.setTracking(true);\r\n\r\n if (self.orientateWhilstTracking) {\r\n //hide zoom\r\n $('.ol-zoom').hide();\r\n self.markerEl.src = '/images/geolocation_marker_heading2.png'; \r\n self.baseLayer.on('postrender', self.updateView);\r\n self.map.render(); \r\n }\r\n else { \r\n self.map.getView().setRotation(0);\r\n self.didCenterOnLocation = false;\r\n self.markerEl.src = '/images/geolocation_marker2.png';\r\n } \r\n\r\n if (self.locationLayer.getSource().getFeatures().length > 0) {\r\n self.locationLayer.getSource().removeFeature(self.locateMeFeature);\r\n }\r\n self.trackingLocation = true;\r\n $('#btnGoToCurrentLocation').parent('.ol-geolocation').addClass('ol-control-active');\r\n }\r\n else {\r\n //show zoom\r\n $('.ol-zoom').show();\r\n\r\n //already tracking but button clicked again\r\n //remove handler\r\n self.baseLayer.un('postrender', self.updateView);\r\n\r\n //raise event\r\n TrailwiseEventBus.trackingEnd(\"\");\r\n\r\n self.geolocation.setTracking(false);\r\n self.map.removeOverlay(self.marker);\r\n self.trackingLocation = false;\r\n $('#btnGoToCurrentLocation').parent('.ol-geolocation').removeClass('ol-control-active');\r\n }\r\n }\r\n\r\n private toggleOptionsDialogue = (delayInMilliseconds: number): void => {\r\n window.setTimeout(function () {\r\n $('#geolocationOptions').animate({ width: 'toggle', opacity: 'toggle' });\r\n }, delayInMilliseconds);\r\n }\r\n\r\n private onLocateMe = (): void => {\r\n let self = this;\r\n let callBack = function (coords, postitionFeature, error) {\r\n\r\n if (coords && !error) {\r\n self.map.getView().animate({ center: coords, zoom: 16 });\r\n\r\n self.toggleOptionsDialogue(1500);\r\n\r\n if (self.locationLayer.getSource().getFeatures().length > 0) {\r\n //always try to remove feature first\r\n self.locationLayer.getSource().removeFeature(postitionFeature);\r\n }\r\n\r\n //addfeature and remove after 15 seconds\r\n self.locationLayer.getSource().addFeature(postitionFeature);\r\n\r\n window.setTimeout(function () {\r\n if (self.locationLayer.getSource().getFeatures().length > 0 && !self.trackingLocation) {\r\n self.locationLayer.getSource().removeFeature(postitionFeature);\r\n }\r\n }, 15000);\r\n };\r\n }\r\n\r\n this.getCurrentPosition(callBack);\r\n }\r\n\r\n private getCurrentPosition = (callback): void => {\r\n let self = this;\r\n\r\n let onSuccess = function (position) {\r\n let coords = olProj.fromLonLat([position.coords.longitude, position.coords.latitude], \"EPSG:3857\");\r\n //console.log(\"coords:\" + coords);\r\n\r\n self.locateMeFeature.setGeometry(coords ? new Point(coords) : null);\r\n callback(coords, self.locateMeFeature);\r\n };\r\n\r\n let onError = function (error) {\r\n self.geolocationModal.show();\r\n self.toggleOptionsDialogue(500);\r\n console.log(\"AppGeoLocation error: code=\" + error.code + \", message=\" + error.message);\r\n callback(null, null, error);\r\n };\r\n\r\n navigator.geolocation.getCurrentPosition(onSuccess, onError, this.geolocation.getTrackingOptions());\r\n }\r\n\r\n private addLocationLayer = (map: olMap): void => {\r\n this.locateMeFeature = new Feature({\r\n id: 'positionfeature',\r\n name: 'positionFeature'\r\n });\r\n\r\n this.locateMeFeature.setStyle(new Style({\r\n image: new Circle({\r\n radius: 10,\r\n fill: new Fill({\r\n color: '#d98216'\r\n }),\r\n stroke: new Stroke({\r\n color: 'rgba(0, 0, 0, 0.1)',\r\n width: 45,\r\n })\r\n })\r\n }));\r\n\r\n this.locationLayer = new VectorLayer({\r\n //id: 'locationLayer',\r\n //name: 'locationLayer'\r\n });\r\n this.locationLayer.set(\"id\", \"locationLayer\", true);\r\n this.locationLayer.set(\"name\", \"locationLayer\", true);\r\n\r\n this.locationLayer.setSource(\r\n new VectorSource({\r\n features: [this.locateMeFeature]\r\n })\r\n );\r\n\r\n this.locationLayer.setVisible(true);\r\n map.addLayer(this.locationLayer);\r\n }\r\n\r\n private initSimulate = (): void => {\r\n let self = this;\r\n\r\n const simulatePositionChange = (position): void => {\r\n const coords = position.coords;\r\n self.geolocation.set('accuracy', coords.accuracy);\r\n self.geolocation.set('heading', self.degToRad(coords.heading));\r\n\r\n //already in 3857 for home demo\r\n //const projectedPosition = olProj.fromLonLat([coords.longitude, coords.latitude]);\r\n //self.geolocation.set('position', projectedPosition);\r\n\r\n self.geolocation.set('position', [coords.longitude, coords.latitude]);\r\n self.geolocation.set('speed', coords.speed);\r\n self.geolocation.changed();\r\n }\r\n\r\n // simulate device move\r\n let simulationData;\r\n const client = new XMLHttpRequest();\r\n client.open('GET', '/Data/geolocation-orientation.json');\r\n\r\n /**\r\n * Handle LocationData loading.\r\n */\r\n client.onload = function () {\r\n simulationData = JSON.parse(client.responseText).data;\r\n };\r\n client.send();\r\n\r\n const simulateBtn = document.getElementById('simulate');\r\n simulateBtn.addEventListener(\r\n 'click',\r\n function () { \r\n self.orientateWhilstTracking = true;\r\n self.map.getView().setZoom(16);\r\n TrailwiseEventBus.trackingStart(\"\");\r\n self.map.addOverlay(self.marker);\r\n\r\n const coordinates = [...simulationData];\r\n\r\n const first = coordinates.shift();\r\n simulatePositionChange(first);\r\n\r\n function geolocate() { \r\n const position = coordinates.shift();\r\n if (!position) {\r\n self.baseLayer.un('postrender', self.updateView);\r\n TrailwiseEventBus.trackingEnd(\"\");\r\n self.map.removeOverlay(self.marker);\r\n self.geolocation.setTracking(false);\r\n self.trackingLocation = false;\r\n return;\r\n }\r\n\r\n simulatePositionChange(position);\r\n window.setTimeout(function () {\r\n geolocate();\r\n }, 1000);\r\n }\r\n geolocate();\r\n\r\n self.baseLayer.on('postrender', self.updateView);\r\n self.map.render();\r\n },\r\n false\r\n );\r\n }\r\n\r\n\r\n // convert radians to degrees\r\n private radToDeg = (rad: number): number => {\r\n return (rad * 360) / (Math.PI * 2);\r\n }\r\n\r\n // convert degrees to radians\r\n private degToRad = (deg: number): number => {\r\n return (deg * Math.PI * 2) / 360;\r\n }\r\n\r\n // modulo for negative values\r\n private mod = (n: number): number => {\r\n return ((n % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI);\r\n }\r\n}","import Geolocation from 'ol/Geolocation';\r\nimport { AppStorage } from \"./AppStorage\";\r\nimport * as olSphere from 'ol/sphere';\r\nimport TrailwiseEventBus from './TrailwiseEventBus';\r\nimport { Coordinate } from 'ol/coordinate';\r\nimport * as olProj from 'ol/proj';\r\nimport LineString from 'ol/geom/LineString';\r\n\r\nexport class GeoData {\r\n public data: Array;\r\n\r\n public constructor() {\r\n this.data = new Array();\r\n }\r\n\r\n public add = (data: Geolocation): void => {\r\n const location = new LocationData(data);\r\n let prevLoc: LocationData;\r\n\r\n if (this.data.length > 0) {\r\n //get the coords from the previous entry so we can calculate the distance\r\n prevLoc = this.data[this.data.length - 1];\r\n //let prevCord: Coordinate = olProj.fromLonLat([prevLoc.coords.longitude, prevLoc.coords.latitude], \"EPSG:3857\");\r\n //let currentCord: Coordinate = olProj.fromLonLat([location.coords.longitude, location.coords.latitude], \"EPSG:3857\");\r\n\r\n let prevCord: Coordinate = [prevLoc.coords.longitude, prevLoc.coords.latitude];\r\n let currentCord: Coordinate = [location.coords.longitude, location.coords.latitude];\r\n let ls = new LineString([prevCord, currentCord])\r\n //location.distanceFromPrevious = olSphere.getDistance(prevCord, currentCord);\r\n location.distanceFromPrevious = ls.getLength();\r\n } \r\n this.data.push(location);\r\n }\r\n}\r\n\r\nexport class LocationData {\r\n public coords: LocationCoords;\r\n public timestamp: number;\r\n public time: string;\r\n public distanceFromPrevious: number;\r\n\r\n public constructor(data: Geolocation) {\r\n this.timestamp = new Date().getTime();\r\n this.time = new Date().getMinutes().toString() + \":\" + new Date().getSeconds().toString() + \":\" + new Date().getMilliseconds().toString();\r\n \r\n this.coords = new LocationCoords();\r\n this.coords.speed = data.getSpeed() || 0;\r\n this.coords.accuracy = data.getAccuracy() || 0;\r\n this.coords.altitudeAccuracy = data.getAltitudeAccuracy() || 0;\r\n this.coords.altitude = data.getAltitude() || 0;\r\n this.coords.longitude = data.getPosition()[0];\r\n this.coords.latitude = data.getPosition()[1];\r\n this.coords.heading = data.getHeading() || 0;\r\n }\r\n}\r\n\r\nexport class LocationCoords {\r\n public speed: number;\r\n public accuracy: number;\r\n public altitudeAccuracy: number;\r\n public altitude: number;\r\n public longitude: number;\r\n public heading: number;\r\n public latitude: number;\r\n}\r\n\r\nexport class AppRecordGeoLocation {\r\n\r\n private appStorage: AppStorage;\r\n\r\n public constructor() {\r\n const self = this;\r\n this.appStorage = new AppStorage();\r\n\r\n TrailwiseEventBus.trackingStart.on(function () {\r\n self.onTrackingStarted();\r\n });\r\n TrailwiseEventBus.trackingEnd.on(function () {\r\n self.onTrackingEnded();\r\n });\r\n TrailwiseEventBus.trackingGeolocationChange.on(function (geoLocation:Geolocation) {\r\n self.onTrackingGeolocationChange(geoLocation);\r\n }); \r\n }\r\n\r\n private onTrackingStarted = (): void => {\r\n this.clearGeoData();\r\n }\r\n\r\n private onTrackingGeolocationChange = (geoLocation: Geolocation): void => {\r\n this.addGeoData(geoLocation);\r\n }\r\n\r\n private onTrackingEnded = (): void => {\r\n \r\n }\r\n\r\n private addGeoData = (data: Geolocation): void => {\r\n let obj = JSON.parse(this.appStorage.getValue(\"geodata\")) as GeoData\r\n\r\n let d = new GeoData();\r\n d.data = obj.data;\r\n d.add(data);\r\n this.appStorage.setValue(\"geodata\", JSON.stringify(d));\r\n }\r\n\r\n private clearGeoData = (): void => {\r\n this.appStorage.clear(\"geodata\");\r\n this.appStorage.setValue(\"geodata\", JSON.stringify(new GeoData()));\r\n }\r\n}\r\n\r\n","import { IAppStorage } from \"./IAppStorage\";\r\n\r\n\r\nexport class AppStorage implements IAppStorage {\r\n\r\n private _store: Storage;\r\n private _sessionStore: Storage;\r\n private _canStore: boolean;\r\n\r\n constructor() {\r\n //remap to local var\r\n this._store = localStorage;\r\n this._sessionStore = sessionStorage;\r\n this._canStore = (typeof (Storage) !== \"undefined\");\r\n }\r\n\r\n //set a storage value\r\n public setValue = (key: string, value: string): void => {\r\n if (this._canStore) {\r\n this._store[key] = value;\r\n }\r\n }\r\n\r\n public setSessionValue = (key: string, value: string): void => {\r\n if (this._canStore) {\r\n this._sessionStore[key] = value;\r\n }\r\n }\r\n\r\n //get a value by key from the store\r\n public getValue = (key: string): string => {\r\n if (this._canStore) {\r\n let val = this._store[key];\r\n return (typeof val === 'undefined') ? null : val;\r\n }\r\n return null;\r\n }\r\n\r\n //get a value by key from the store\r\n public getSessionValue = (key: string): string => {\r\n if (this._canStore) {\r\n let val = this._sessionStore[key];\r\n return (typeof val === 'undefined') ? null : val;\r\n }\r\n return null;\r\n }\r\n\r\n //get value from the store and parse it\r\n public getValueFromJson = (key: string, reviver?: (this: any, key: string, value: any) => any): object => {\r\n if (this._canStore) {\r\n if (this._store[key] !== null && typeof this._store[key] !== \"undefined\") {\r\n if (reviver) {\r\n return JSON.parse(this._store[key], reviver);\r\n } else {\r\n return JSON.parse(this._store[key]);\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public getSessionValueFromJson = (key: string, reviver?: (this: any, key: string, value: any) => any): object => {\r\n if (this._canStore) {\r\n if (this._sessionStore[key] !== null && typeof this._sessionStore[key] !== \"undefined\") {\r\n if (reviver) {\r\n return JSON.parse(this._sessionStore[key], reviver);\r\n } else {\r\n return JSON.parse(this._sessionStore[key]);\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public setArray = (key: string, value: object): void => {\r\n if (this._canStore) {\r\n this._store[key] = JSON.stringify(value);\r\n }\r\n }\r\n\r\n public getArray = (key: string): object => {\r\n if (this._canStore) {\r\n if (this._store[key] != null) {\r\n return JSON.parse(this._store[key]);\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n public clear = (key: string): void => {\r\n if (this._canStore) {\r\n this._store.removeItem(key);\r\n }\r\n }\r\n\r\n public clearFromSession = (key: string): void => {\r\n if (this._canStore) {\r\n this._sessionStore.removeItem(key);\r\n }\r\n }\r\n\r\n}\r\n\r\n","import olMap from 'ol/Map';\r\nimport OLBaseLayer from 'ol/layer/Base'\r\nimport { IBaseLayer } from './IBaseLayer';\r\n\r\nexport class BaseLayer implements IBaseLayer {\r\n\r\n get ref(): string {\r\n return this._ref;\r\n }\r\n\r\n get displayName(): string {\r\n return this._displayName;\r\n }\r\n\r\n public get olLayer(): OLBaseLayer {\r\n return this._layer;\r\n }\r\n\r\n public constructor(\r\n protected _ref: string,\r\n protected _displayName: string,\r\n protected _layer: OLBaseLayer) {\r\n }\r\n\r\n public addLayerToMap(map: olMap, visibility: boolean): void {\r\n this.setVisible(visibility); \r\n map.addLayer(this._layer);\r\n }\r\n\r\n public setVisible(visible: boolean): void {\r\n return this._layer.setVisible(visible);\r\n }\r\n\r\n public getVisible(): boolean {\r\n return this._layer.getVisible();\r\n }\r\n\r\n public setOpacity(opacity: number): void {\r\n this._layer.setOpacity(opacity);\r\n }\r\n\r\n}\r\n","import { BaseLayer } from \"./BaseLayer\";\r\nimport { IBaseLayer } from \"./IBaseLayer\";\r\nimport TileLayer from \"ol/layer/Tile\";\r\nimport { Options } from \"ol/source/BingMaps\";\r\nimport BingMaps from 'ol/source/BingMaps';\r\nimport OSM from 'ol/source/OSM';\r\nimport TileWMS from 'ol/source/TileWMS';\r\nimport TileGrid from 'ol/tilegrid/TileGrid';\r\nimport Attribution from 'ol/control/Attribution';\r\nimport XYZ from 'ol/source/XYZ';\r\nimport * as olProj from 'ol/proj';\r\n\r\n\r\nexport enum BaseLayerType { \r\n BingAerial,\r\n BingAerialWithLabels,\r\n BingRoad,\r\n BingOS,\r\n OSM_ESDM_contours,\r\n OS_Open_Data,\r\n OSProvisional_1937to1961,\r\n OSOneInch_1955To1961,\r\n OSOneInch_Hills1885\r\n}\r\n\r\nexport class BaseLayerFactory {\r\n\r\n public GetBaseLayerByType(\r\n baseLayerType: BaseLayerType,\r\n bingApiKey: string = \"\",\r\n esdmApiKey: string = \"\"\r\n ): IBaseLayer {\r\n let lyr: IBaseLayer = null;\r\n\r\n switch (baseLayerType) { \r\n\r\n case BaseLayerType.BingAerial:\r\n lyr = this.BingAerial(bingApiKey, \"BingAerial\", \"Bing Aerial\");\r\n break;\r\n\r\n case BaseLayerType.BingAerialWithLabels:\r\n lyr = this.BingAerialWithLabels(bingApiKey, \"BingAerialWithLabels\", \"Bing Aerial (with labels)\");\r\n break;\r\n\r\n case BaseLayerType.BingRoad:\r\n lyr = this.BingRoad(bingApiKey, \"RoadOnDemand\", \"Bing Road\");\r\n break;\r\n\r\n case BaseLayerType.BingOS:\r\n lyr = this.BingOS(bingApiKey, \"OrdnanceSurvey\", \"Bing Ordnance Survey\");\r\n break;\r\n\r\n case BaseLayerType.OSM_ESDM_contours:\r\n lyr = this.OSM_ESDM_contours(esdmApiKey, \"OSM_ESDM_contours\", \"OpenStreetMap\");\r\n //lyr = this.OSM(\"OSM_ESDM_contours\", \"OpenStreetMap\"); \r\n break;\r\n\r\n case BaseLayerType.OS_Open_Data:\r\n lyr = this.OSOpenData(\"OSOpenData\", \"Ordnance Survey OpenData\");\r\n break;\r\n\r\n case BaseLayerType.OSProvisional_1937to1961:\r\n lyr = this.OSProvisional_1937to1961();\r\n break;\r\n\r\n case BaseLayerType.OSOneInch_1955To1961:\r\n lyr = this.OSOneInch_1955To1961();\r\n break;\r\n\r\n case BaseLayerType.OSOneInch_Hills1885:\r\n lyr = this.OSOneInch_Hills1885();\r\n break;\r\n\r\n default:\r\n console.warn(`${baseLayerType} layer not configured`);\r\n break;\r\n }\r\n\r\n return lyr;\r\n }\r\n\r\n protected BingAerial(apiKey: string, ref: string, displayName: string): IBaseLayer {\r\n let lyr = this.GetBinglayer(apiKey, \"Aerial\");\r\n lyr.set(\"name\", \"BingAerial\", true);\r\n lyr.setVisible(false);\r\n return new BaseLayer(ref, displayName, lyr);\r\n }\r\n\r\n protected BingAerialWithLabels(apiKey: string, ref: string, displayName: string): IBaseLayer {\r\n let lyr = this.GetBinglayer(apiKey, \"AerialWithLabelsOnDemand\");\r\n lyr.set(\"name\", \"BingAerialWithLabels\", true);\r\n lyr.setVisible(false);\r\n return new BaseLayer(ref, displayName, lyr);\r\n }\r\n\r\n protected BingOS(apiKey: string, ref: string, displayName: string): IBaseLayer {\r\n let lyr = this.GetBinglayer(apiKey, \"OrdnanceSurvey\", 17);\r\n lyr.set(\"name\", \"BingOrdnanceSurvey\", true);\r\n lyr.getSource().setAttributions('© Crown Copyright and database right ' + new Date().getFullYear() + '. All rights reserved.Ordnance Survey Licence number 100023706');\r\n lyr.setVisible(false);\r\n return new BaseLayer(ref, displayName, lyr);\r\n }\r\n\r\n protected BingRoad(apiKey: string, ref: string, displayName: string): IBaseLayer {\r\n let lyr = this.GetBinglayer(apiKey, \"RoadOnDemand\");\r\n lyr.set(\"name\", \"BingRoad\", true);\r\n lyr.setVisible(false);\r\n return new BaseLayer(ref, displayName, lyr);\r\n }\r\n\r\n protected GetBinglayer(apiKey: string, imagerySet: string, maxZoom: number = 0): TileLayer {\r\n let opts: Options = {\r\n key: apiKey,\r\n imagerySet: imagerySet,\r\n culture: 'en-gb'\r\n }\r\n\r\n if (maxZoom > 0) {\r\n opts.maxZoom = maxZoom;\r\n }\r\n\r\n return new TileLayer({\r\n source: new BingMaps(opts)\r\n });\r\n }\r\n\r\n protected OSM_ESDM_contours(apiKey: string, ref: string, displayName: string): IBaseLayer {\r\n let lyr = new TileLayer({\r\n source: new OSM({\r\n url: `//{a-f}.osm.esdm.co.uk/900913/c/{z}/{x}/{y}.png?APIKEY=${apiKey}`,\r\n maxZoom: 18,\r\n attributions: 'Map data from © OpenStreetMap'\r\n })\r\n });\r\n lyr.setVisible(false); \r\n lyr.set(\"name\", \"Contoured\", true);\r\n return new BaseLayer(ref, displayName, lyr);\r\n }\r\n\r\n //protected OSM(ref: string, displayName: string): IBaseLayer {\r\n // let lyr = new TileLayer({\r\n // source: new OSM(),\r\n // });\r\n // lyr.setVisible(false);\r\n // lyr.set(\"name\", \"Contoured\", true);\r\n // return new BaseLayer(ref, displayName, lyr);\r\n //}\r\n\r\n protected OSOpenData(ref: string, displayName: string): IBaseLayer {\r\n let lyr = new TileLayer({\r\n //title: 'Ordnance Survey OpenData',\r\n //name: 'OpenData',\r\n //type: 'base',\r\n visible: false,\r\n source: new TileWMS({\r\n urls: [\"//geoserver9.esdm.co.uk/OrdnanceSurvey/wms\", \"//geoserver9a.esdm.co.uk/OrdnanceSurvey/wms\", \"//geoserver9b.esdm.co.uk/OrdnanceSurvey/wms\"],\r\n params: {\r\n LAYERS: 'OrdnanceSurvey:OSOpenData',\r\n TILED: 'true',\r\n FORMAT: 'image/png8'\r\n },\r\n projection: 'EPSG:3857',\r\n //tileGrid: new TileGrid({\r\n // origin: [0, 0],\r\n // resolutions: [1000, 500, 250, 100, 50, 25, 10, 5, 2.5, 1, 0.5, 0.25],\r\n //}),\r\n attributions: \"Contains Ordnance Survey data © Crown copyright and database right 2021\"\r\n })\r\n });\r\n lyr.set(\"name\", \"OpenData\", true);\r\n return new BaseLayer(ref, displayName, lyr);\r\n }\r\n\r\n protected OSProvisional_1937to1961(): IBaseLayer {\r\n const lyr = new TileLayer({\r\n extent: olProj.transformExtent([-7.68, 49.8, 1.77, 60.4], 'EPSG:4326', 'EPSG:3857'),\r\n preload: Infinity,\r\n //title: \"Great Britain - OS 1:25,000, 1937-61\",\r\n source: new XYZ({\r\n urls: [\r\n 'https://api.maptiler.com/tiles/uk-osgb25k1937/{z}/{x}/{y}.jpg?key=T2ptlwdbXCHbJ9Si1zo8'\r\n ],\r\n minZoom: 1,\r\n maxZoom: 18,\r\n attributions: 'Mapping from National Library of Scotland',\r\n }),\r\n //type: 'overlay',\r\n visible: false,\r\n //keytext: 'View the individual sheets of this OS 1:25,000 mapping by selecting \"Find by place\" above',\r\n //key: 'geo.nls.uk/mapdata2/os/25000/key/openlayers.html'\r\n });\r\n lyr.set(\"name\", \"OS_1_25K_Provisional\", true);\r\n return new BaseLayer(\"OS25k1937\", \"OS 1:25,000 1937-1961\", lyr);\r\n }\r\n\r\n protected OSOneInch_1955To1961(): IBaseLayer {\r\n const lyr = new TileLayer({\r\n extent: olProj.transformExtent([-8.8, 49.8, 1.8, 60.9], 'EPSG:4326', 'EPSG:3857'),\r\n preload: Infinity,\r\n //title: \"Great Britain - OS 1:25,000, 1937-61\",\r\n source: new XYZ({\r\n urls: [\r\n 'https://api.maptiler.com/tiles/uk-osgb63k1955/{z}/{x}/{y}.jpg?key=T2ptlwdbXCHbJ9Si1zo8'\r\n ],\r\n minZoom: 1,\r\n maxZoom: 18,\r\n attributions: 'Mapping from National Library of Scotland',\r\n }),\r\n //type: 'overlay',\r\n visible: false,\r\n //keytext: 'View the individual sheets of this OS 1:25,000 mapping by selecting \"Find by place\" above',\r\n //key: 'geo.nls.uk/mapdata2/os/25000/key/openlayers.html'\r\n });\r\n lyr.set(\"name\", \"OS_One_Inch_7th_Series\", true);\r\n return new BaseLayer(\"OS63k1955\", \"OS One-Inch, 7th series, 1955-61\", lyr);\r\n }\r\n \r\n protected OSOneInch_Hills1885(): IBaseLayer {\r\n const lyr = new TileLayer({\r\n extent: olProj.transformExtent([-8.24274385, 49.76831482, 1.91376739, 61.003313], 'EPSG:4326', 'EPSG:3857'),\r\n preload: Infinity,\r\n //title: \"Great Britain - OS 1:25,000, 1937-61\",\r\n source: new XYZ({\r\n url: 'https://api.maptiler.com/tiles/uk-osgb63k1885/{z}/{x}/{y}.png?key=T2ptlwdbXCHbJ9Si1zo8', \r\n minZoom: 1,\r\n maxZoom: 18,\r\n attributions: 'We are very grateful toDavid Rumsey for supporting the scanning and georeferencing of this overlay',\r\n }),\r\n //type: 'overlay',\r\n visible: false,\r\n //keytext: 'View the individual sheets of this OS 1:25,000 mapping by selecting \"Find by place\" above',\r\n //key: 'geo.nls.uk/mapdata2/os/25000/key/openlayers.html'\r\n });\r\n lyr.set(\"name\", \"OS_One_Inch_GB_Hills\", true);\r\n return new BaseLayer(\"OS63k1955\", \"OS One-Inch, 7th series, 1955-61\", lyr);\r\n }\r\n \r\n}","import BingMaps from 'ol/source/BingMaps';\r\nimport olMap from 'ol/Map';\r\nimport LayerGroup from 'ol/layer/Group';\r\n\r\nexport class BingSession {\r\n\r\n private _bingSessionKey: string = \"\";\r\n private _bingMapControl: any;\r\n\r\n //60 & 30s minutes in miliseconds\r\n private _sessionTimeOut: number = 3630000;\r\n private _olMap: olMap;\r\n\r\n\r\n public constructor() {\r\n\r\n }\r\n\r\n public init = (apiKey: string, successCallback: Function, failureCallback: Function): void => {\r\n let mapContainer = $(\"#mapContainer\");\r\n let bingMapContainer = $(\"
\")\r\n let self = this;\r\n\r\n mapContainer.append(bingMapContainer);\r\n\r\n try { \r\n // @ts-ignore\r\n self._bingMapControl = new Microsoft.Maps.Map(document.getElementById('bingMap'), {\r\n credentials: apiKey,\r\n // @ts-ignore\r\n center: new Microsoft.Maps.Location(51.50632, -0.12714),\r\n // @ts-ignore\r\n mapTypeId: Microsoft.Maps.MapTypeId.aerial,\r\n zoom: 10\r\n });\r\n\r\n self._bingMapControl.getCredentials(function (sessionId) {\r\n if (sessionId) {\r\n self._bingSessionKey = sessionId;\r\n successCallback.call(this, self._bingSessionKey);\r\n //now hide the bing map\r\n bingMapContainer.hide();\r\n\r\n //timeout handler not needed\r\n //session is 1 hour on localhost but 2 days on the actual site\r\n //window.setTimeout(function () {\r\n // handleBingSessionRefresh();\r\n //}, sessionTimeOut);\r\n }\r\n else {\r\n failureCallback.call(this);\r\n }\r\n \r\n });\r\n }\r\n catch {\r\n failureCallback.call(this);\r\n } \r\n }\r\n\r\n public getSessionKey = (): string => {\r\n return this._bingSessionKey;\r\n }\r\n\r\n private handleBingSessionRefresh = (): void => {\r\n let self = this;\r\n\r\n self._bingMapControl.getCredentials(function (sessionId) {\r\n self._bingSessionKey = sessionId;\r\n\r\n function setSource(layer, imagerySet) {\r\n layer.setSource(new BingMaps({\r\n key: self._bingSessionKey,\r\n imagerySet: imagerySet,\r\n culture: 'en-gb',\r\n maxZoom: 17\r\n }));\r\n }\r\n\r\n self._olMap.getLayers().forEach(function (layer, j) {\r\n if (layer instanceof LayerGroup) {\r\n layer.getLayers().forEach(function (baseLayer) {\r\n switch (baseLayer.get(\"name\")) {\r\n case \"BingAerialWithLabels\":\r\n setSource(baseLayer, \"AerialWithLabelsOnDemand\");\r\n break;\r\n\r\n case \"BingAerial\":\r\n setSource(baseLayer, \"Aerial\");\r\n break;\r\n\r\n case \"BingRoad\":\r\n setSource(baseLayer, \"RoadOnDemand\");\r\n break;\r\n\r\n case \"BingOrdnanceSurvey\":\r\n setSource(baseLayer, \"OrdnanceSurvey\");\r\n break;\r\n }\r\n });\r\n }\r\n });\r\n\r\n\r\n window.setTimeout(function () {\r\n self.handleBingSessionRefresh();\r\n }, self._sessionTimeOut);\r\n });\r\n }\r\n\r\n public setMap = (map: olMap): void => {\r\n this._olMap = map;\r\n }\r\n\r\n}","import { Tooltip } from \"bootstrap\";\r\nimport { MapSlidePanel } from \"./MapSidePanel\";\r\nimport { MapViewStore } from \"./MapViewStore\";\r\nimport olMap from 'ol/Map';\r\nimport * as olInteraction from 'ol/interaction';\r\nimport { BaseLayerFactory, BaseLayerType } from \"./BaseLayerFactory\";\r\nimport BaseLayer from \"ol/layer/Base\";\r\nimport { BingSession } from \"./BingSession\";\r\nimport LayerGroup from 'ol/layer/Group';\r\nimport VectorLayer from 'ol/layer/Vector';\r\nimport { Options } from 'ol/layer/BaseVector';\r\nimport { MapStyleFactory } from \"./MapStyleFactory\";\r\nimport VectorSource from \"ol/source/Vector\";\r\nimport Style from \"ol/style/Style\";\r\nimport Feature from \"ol/Feature\";\r\nimport Point from \"ol/geom/Point\";\r\nimport Icon from 'ol/style/Icon';\r\nimport WKT from 'ol/format/WKT';\r\nimport * as olExtent from 'ol/extent';\r\nimport { MapBrowserEvent, Overlay, View } from \"ol\";\r\nimport MousePosition from 'ol/control/MousePosition';\r\nimport ScaleLine from 'ol/control/ScaleLine';\r\nimport FullScreen from 'ol/control/FullScreen';\r\nimport { OSGB, WGS84 } from \"esdm-gridreference\";\r\nimport { Coordinate } from \"ol/coordinate\";\r\nimport Fill from \"ol/style/Fill\";\r\nimport Text from \"ol/style/Text\";\r\nimport Circle from \"ol/style/Circle\";\r\nimport Stroke from \"ol/style/Stroke\";\r\nimport ImageWMS from 'ol/source/ImageWMS';\r\nimport ImageLayer from 'ol/layer/Image';\r\n\r\nimport proj4 from \"proj4\";\r\nimport * as olProj from 'ol/proj';\r\nimport Projection from \"ol/proj/Projection\";\r\nimport { register } from 'ol/proj/proj4'\r\nimport { MapContextMenu } from \"./MapContextMenu\";\r\nimport Layer from \"ol/layer/Layer\";\r\nimport { AppStorage } from \"./AppStorage\";\r\nimport { MapHighlightFeatures } from \"./MapHighlightFeatures\";\r\nimport { MapFeatureInfo } from \"./MapfeatureInfo\";\r\nimport { Draw } from \"ol/interaction\";\r\nimport * as olSphere from 'ol/sphere';\r\nimport Polygon from \"ol/geom/Polygon\";\r\nimport LineString from \"ol/geom/LineString\";\r\nimport { unByKey } from 'ol/Observable';\r\nimport { DrawEvent } from \"ol/interaction/Draw\";\r\nimport GeometryType from \"ol/geom/GeometryType\";\r\nimport OverlayPositioning from \"ol/OverlayPositioning\";\r\nimport { MapGazetteer } from \"./MapGazetteer\";\r\nimport { AppGeoLocation } from \"./AppGeoLocation\";\r\nimport TrailwiseEventBus from './TrailwiseEventBus';\r\nimport { MapGpx } from \"./MapGpx\";\r\nimport { MapGridRef } from \"./MapGridRef\";\r\nimport { debounce } from \"debounce\";\r\n\r\n$(function () {\r\n const mapData = $(\"#mapData\");\r\n\r\n const isAuth: boolean = mapData.data(\"auth\");\r\n const wmsurl: string = mapData.data(\"wmsurl\");\r\n const bingMapsApiKey: string = mapData.data(\"bingMapsApiKey\");\r\n const osmApiKey: string = mapData.data(\"osmApiKey\");\r\n const maxFeatures: number = mapData.data(\"maxFeatures\");\r\n const isMember: boolean = mapData.data(\"isMember\");\r\n const routeType = mapData.data(\"routeType\");\r\n const RouteId = mapData.data(\"RouteId\");\r\n const model = mapData.data(\"model\");\r\n const showProw = mapData.data(\"prow\");\r\n const bingSession = new BingSession();\r\n let map: MainMap = null;\r\n\r\n const resizeMap = function () { \r\n let height = $(window).height() - $(\"#mapContainer\").offset().top - $(\"footer\").height();\r\n if (height <= 400) {\r\n height = 400;\r\n }\r\n $('#mapContainer').height(height);\r\n\r\n if (map) {\r\n map.olMap.updateSize();\r\n }\r\n //$(\"#slide-content\").height(height - 75);\r\n };\r\n\r\n const loadMap = function (bingApiOrSessionKey: string) {\r\n resizeMap();\r\n window.addEventListener('resize', debounce(resizeMap, 250)); \r\n map = new MainMap(wmsurl, osmApiKey, bingApiOrSessionKey, \"login\", \"register\", maxFeatures, isAuth, isMember, bingSession, showProw);\r\n }\r\n\r\n const loadMapWithoutBing = function () {\r\n resizeMap();\r\n window.addEventListener('resize', debounce(resizeMap, 250));\r\n map = new MainMap(wmsurl, osmApiKey, null, \"login\", \"register\", maxFeatures, isAuth, isMember, null, showProw);\r\n }\r\n\r\n if (!isMember) {\r\n //unauth\r\n loadMap(bingMapsApiKey);\r\n } else {\r\n //Called via callback on bing map control js file\r\n const loadMapWithBingSession = function () {\r\n bingSession.init(bingMapsApiKey,\r\n function (bingSessionKey) { loadMap(bingSessionKey); },\r\n function () { loadMapWithoutBing(); }\r\n );\r\n }\r\n window[\"loadMapWithBingSession\"] = loadMapWithBingSession;\r\n \r\n //deal with download failure of Bing Maps js\r\n window[\"loadMapWithoutBing\"] = loadMapWithoutBing;\r\n }\r\n\r\n //resize map when user closes login alert\r\n var loginAlert = $('#content .alert:first-child'); \r\n if (loginAlert[0] != null) {\r\n loginAlert[0].addEventListener('closed.bs.alert', function () {\r\n resizeMap();\r\n })\r\n } \r\n\r\n});\r\n\r\n\r\nproj4.defs([\r\n [\r\n 'EPSG:27700',\r\n '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.999601 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs +towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894'\r\n ]\r\n]);\r\n\r\n\r\n//
\r\nexport class MainMap {\r\n\r\n private _map: olMap;\r\n private _mapId = \"map\";\r\n private _mapStoreID = \"trailwise-map\";\r\n private _mapStore: MapViewStore;\r\n private _mapSlidePanel: MapSlidePanel;\r\n private _initialised = false;\r\n private _loadingCount = 0;\r\n private _OS_extent: olExtent.Extent = [-841259.18, 6405988.48, 404314.68, 8733289.16];\r\n private _baseLayerFactory: BaseLayerFactory;\r\n private _BingOS: BaseLayer;\r\n private _BingRoad: BaseLayer;\r\n private _OSOpen: BaseLayer;\r\n private _OSMContoured: BaseLayer;\r\n private _hasTouch: boolean;\r\n private _contextMenu: MapContextMenu;\r\n private _maxUnauthenticatedZoom: number = 9; //20km\r\n private _hideRoutesOfNoInterest: number = 0; \r\n private _showFavourites: number = 1;\r\n private _overlays: Map;\r\n private _storage: AppStorage;\r\n private _mapHighlight: MapHighlightFeatures;\r\n private _mapFeatureInfo: MapFeatureInfo;\r\n private _sketch: Feature = null;\r\n private _draw: Draw = null;;\r\n private _helpTooltipElement: HTMLDivElement;\r\n private _helpTooltip: Overlay;\r\n private _measureLayer: VectorLayer;\r\n private _measureInKm: boolean = true;\r\n private _measureTooltipElement: HTMLDivElement;\r\n private _measureTooltip: Overlay;\r\n private _mapGazetteer: MapGazetteer;\r\n private _geoLocation: AppGeoLocation;\r\n private _mapGpx: MapGpx;\r\n private _mapGridRef: MapGridRef;\r\n private _selectedBaseLayerRadioId: string = \"\";\r\n get olMap() {\r\n return this._map;\r\n }\r\n\r\n public constructor(\r\n private _wfsUrl: string,\r\n private _osmContouredApiKey: string,\r\n private _bingApiOrSessionKey: string,\r\n private _loginUrl: string,\r\n private _registerUrl: string,\r\n private _maxFeatures: number,\r\n private _isAuthenticated: boolean,\r\n private _isMember: boolean,\r\n private _bingSession: BingSession,\r\n private _showBOATProw: number\r\n ) {\r\n let self = this;\r\n register(proj4);\r\n\r\n this._hasTouch = ('ontouchstart' in window || navigator.msMaxTouchPoints > 0);\r\n //$(\"#slide-content\").height($(\"#mapContainer\").height() - 75);\r\n \r\n //init tooltips\r\n let tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\r\n let tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {\r\n return new Tooltip(tooltipTriggerEl)\r\n });\r\n\r\n this._storage = new AppStorage();\r\n this._mapStore = new MapViewStore(this._mapStoreID); \r\n \r\n //mapStore.clear();\r\n this._mapSlidePanel = new MapSlidePanel(this._mapStore, true, true);\r\n this._map = this.getMap(); \r\n this._mapStore.initMap(this._map, true);\r\n this.initRoutesOfNoInterest();\r\n this.initFavourites(); \r\n this.addMapControls(this._map); \r\n this.addBaseLayers();\r\n this.addOverlays(this._map);\r\n\r\n this._map.on(\"singleclick\", this.handleClick);\r\n this._map.on('pointermove', this.handlePointerMove);\r\n\r\n this._map.getViewport().addEventListener('mouseout', function (this: HTMLElement, ev: MouseEvent) {\r\n if (self._helpTooltipElement) {\r\n self._helpTooltipElement.classList.add('hidden');\r\n }\r\n });\r\n this.setMapView();\r\n this._mapHighlight = new MapHighlightFeatures(this._map, this._wfsUrl);\r\n this._mapFeatureInfo = new MapFeatureInfo(this._mapHighlight, this._showBOATProw === 1);\r\n\r\n this._contextMenu = new MapContextMenu(this._map); \r\n\r\n let toolRadios = document.getElementsByName(\"currentTool\");\r\n for (let i = 0; i < toolRadios.length; i++) {\r\n toolRadios[i].addEventListener(\"click\", function (this: HTMLElement, ev: MouseEvent) {\r\n self.toolRadioClicked(this, ev);\r\n });\r\n }\r\n\r\n let currentMapState = this._mapStore.getMapInfo();\r\n //console.log(currentMapState);\r\n if (currentMapState.currentTool) {\r\n for (let i = 0; i < toolRadios.length; i++) {\r\n if ((toolRadios[i]).value === currentMapState.currentTool) {\r\n toolRadios[i].click();\r\n }\r\n }\r\n }\r\n\r\n if (this._isAuthenticated) {\r\n setInterval(function () {\r\n self.checkAuthStatus();\r\n }, 120000); //every 2 minutes check if user is still authenticated\r\n }\r\n\r\n this._mapGazetteer = new MapGazetteer(this._map);\r\n this._geoLocation = new AppGeoLocation(this._map, this._OSMContoured);\r\n TrailwiseEventBus.trackingStart.on(function () {\r\n self.onTrackingStarted();\r\n });\r\n TrailwiseEventBus.trackingEnd.on(function () {\r\n self.onTrackingEnded();\r\n });\r\n\r\n this.initBookmarks();\r\n this._mapGpx = new MapGpx(this._map);\r\n this._mapGridRef = new MapGridRef(this._map,this._contextMenu);\r\n }\r\n\r\n private initBookmarks = (): void => {\r\n let self = this;\r\n\r\n let processTwuidResult = function (json) {\r\n console.log(json);\r\n $(\"#twuidLoading\").hide();\r\n if (json.wkt) {\r\n let format = new WKT();\r\n let geom = format.readGeometry(json.wkt, {\r\n dataProjection: \"EPSG:27700\",\r\n featureProjection: \"EPSG:3857\"\r\n }); //parse WKT \r\n let extent = geom.getExtent();\r\n self._map.getView().fit(extent, { maxZoom: 17, nearest: false });\r\n } \r\n }\r\n\r\n $(\".showOnMap\").on(\"click\", function () {\r\n let twuid = $(this).data(\"twuid\");\r\n $(\"#twuidLoading\").show();\r\n\r\n $.ajax({\r\n url: \"/api/twuidsearch\",\r\n data: { query: twuid },\r\n dataType: \"json\"\r\n })\r\n .done(function (json) {\r\n $(\"#twuidLoading\").hide();\r\n processTwuidResult(json);\r\n })\r\n .fail(function () {\r\n $(\"#twuidLoading\").hide();\r\n });\r\n });\r\n }\r\n\r\n private getMap = (): olMap => {\r\n return new olMap({\r\n interactions: olInteraction.defaults({\r\n altShiftDragRotate: true,\r\n pinchRotate: true,\r\n mouseWheelZoom: false\r\n }).extend([\r\n new olInteraction.PinchZoom(),\r\n new olInteraction.MouseWheelZoom({\r\n constrainResolution: true\r\n })\r\n ]),\r\n target: this._mapId,\r\n view: this.getView()\r\n });\r\n }\r\n\r\n private getView = (): View => {\r\n let self = this;\r\n\r\n let view = new View({\r\n projection: 'EPSG:3857',\r\n center: [-163269.4924, 6901652],\r\n minZoom: 7,\r\n maxZoom: 19,\r\n extent: this._OS_extent\r\n });\r\n\r\n if (!self._isMember) {\r\n view.setMaxZoom(this._maxUnauthenticatedZoom);\r\n }\r\n\r\n //listener fired whenever view resolution changes\r\n view.on(\"change:resolution\", debounce(\r\n function (e) {\r\n let zoom = e.target.getZoom(); \r\n console.log(\"Zoom level:\" + zoom);\r\n self.setBingOSView(zoom); \r\n\r\n if (!self._isMember) {\r\n // non auth users max zoom allowed is 4\r\n if (zoom > self._maxUnauthenticatedZoom) {\r\n self._map.getView().setZoom(self._maxUnauthenticatedZoom);\r\n }\r\n }\r\n //update the legend graphics?\r\n //let resolution = evt.target.getResolution();\r\n //for (let layer in overlays) {\r\n // if (overlays.hasOwnProperty(layer)) {\r\n // let source = overlays[layer].getSource();\r\n // console.log(\"updating legend: \" + source.getParams().LAYERS);\r\n // updateLegendGraphic(source, source.getParams().LAYERS, resolution);\r\n // }\r\n //} \r\n } \r\n ,100));\r\n\r\n return view;\r\n }\r\n\r\n private setMapView = (): void => {\r\n let mapSettings = this._mapStore.getMapInfo();\r\n\r\n // only move map if there is no data to zoom to \r\n if (mapSettings.centre && mapSettings.zoom) {\r\n this._map.getView().setCenter(mapSettings.centre);\r\n this._map.getView().setZoom(mapSettings.zoom);\r\n } else {\r\n //zoom to defaults if we don't have any on the cookie\r\n this._map.getView().setCenter([-163269.4924, 6901652]);\r\n this._map.getView().setZoom(11);\r\n }\r\n }\r\n\r\n private initFavourites = (): void => {\r\n let self = this;\r\n\r\n //check storage first\r\n self._showFavourites = parseInt(self._storage.getValue(\"ShowFavorites\")) || 0;\r\n\r\n if (self._showFavourites === 1) {\r\n $(\"#chkShowFavourites\").prop(\"checked\", true);\r\n }\r\n\r\n $(\"#chkShowFavourites\").on(\"change\", function () {\r\n self._showFavourites = ($(this).prop(\"checked\")) ? 1 : 0;\r\n self._storage.setValue(\"ShowFavorites\", self._showFavourites.toString());\r\n\r\n //redraw layers\r\n if (self._overlays.get(\"UCRLines\").getVisible()) {\r\n (self._overlays.get(\"UCRLines\").getSource()).updateParams({\r\n \"time\": Date.now(),\r\n \"SHOW_FAVOURITES\": self._showFavourites, \r\n \"HIDE_ROUTES_OF_NO_INTEREST\": self._hideRoutesOfNoInterest\r\n });\r\n }\r\n if (self._overlays.get(\"BOATLines\").getVisible()) {\r\n (self._overlays.get(\"BOATLines\").getSource()).updateParams({\r\n \"time\": Date.now(),\r\n \"SHOW_FAVOURITES\": self._showFavourites, \r\n \"HIDE_ROUTES_OF_NO_INTEREST\": self._hideRoutesOfNoInterest\r\n });\r\n } \r\n if (self._overlays.get(\"PROW-Byway\").getVisible()) {\r\n (self._overlays.get(\"PROW-Byway\").getSource()).updateParams({\r\n \"time\": Date.now(), \r\n \"SHOW_BOAT_PROW\": self._showBOATProw \r\n });\r\n } \r\n });\r\n }\r\n\r\n private initRoutesOfNoInterest = (): void => {\r\n let self = this;\r\n //check storage first\r\n self._hideRoutesOfNoInterest = parseInt(self._storage.getValue(\"HideRoutesOfNoInterest\")) || 0;\r\n\r\n if (self._hideRoutesOfNoInterest === 1) {\r\n $(\"#chkHideRoutesOfNoInterest\").prop(\"checked\", true);\r\n }\r\n\r\n $(\"#chkHideRoutesOfNoInterest\").on(\"change\", function () {\r\n self._hideRoutesOfNoInterest = ($(this).prop(\"checked\")) ? 1 : 0;\r\n self._storage.setValue(\"HideRoutesOfNoInterest\", self._hideRoutesOfNoInterest.toString());\r\n\r\n //redraw layers\r\n if (self._overlays.get(\"UCRLines\").getVisible()) {\r\n (self._overlays.get(\"UCRLines\").getSource()).updateParams({\r\n \"time\": Date.now(),\r\n \"SHOW_FAVOURITES\": self._showFavourites,\r\n \"HIDE_ROUTES_OF_NO_INTEREST\": self._hideRoutesOfNoInterest\r\n });\r\n }\r\n if (self._overlays.get(\"BOATLines\").getVisible()) {\r\n (self._overlays.get(\"BOATLines\").getSource()).updateParams({\r\n \"time\": Date.now(),\r\n \"SHOW_FAVOURITES\": self._showFavourites, \r\n \"HIDE_ROUTES_OF_NO_INTEREST\": self._hideRoutesOfNoInterest\r\n });\r\n } \r\n if (self._overlays.get(\"PROW-Byway\").getVisible()) {\r\n (self._overlays.get(\"PROW-Byway\").getSource()).updateParams({\r\n \"time\": Date.now(), \r\n \"SHOW_BOAT_PROW\": self._showBOATProw\r\n });\r\n } \r\n });\r\n }\r\n\r\n private addMapControls = (map: olMap): void => {\r\n if (!this._hasTouch) {\r\n let mousePositionControl = new MousePosition({\r\n coordinateFormat: function (coordinate: Coordinate) {\r\n\r\n let coord27700: Coordinate = olProj.transform(coordinate, \"EPSG:3857\", \"EPSG:27700\");\r\n let osgb = new OSGB();\r\n osgb.SetGridCoordinates(coord27700[0], coord27700[1]);\r\n return osgb.GetGridRef(4);\r\n\r\n //return coordinate[0].toFixed(0) + \" \" + coordinate[1].toFixed(0);\r\n },\r\n projection: map.getView().getProjection(),\r\n className: \"custom-mouse-position\",\r\n target: document.getElementById(\"mouse-position\")\r\n });\r\n\r\n map.addControl(mousePositionControl);\r\n }\r\n\r\n map.addControl(new ScaleLine());\r\n let fs = document.createElement('i');\r\n fs.setAttribute('class', 'fas fa-expand');\r\n map.addControl(new FullScreen({\r\n label: fs\r\n }));\r\n }\r\n\r\n private addBaseLayers = (): void => {\r\n let self = this;\r\n\r\n this._baseLayerFactory = new BaseLayerFactory();\r\n\r\n let layers = [ \r\n this._OSMContoured = this._baseLayerFactory.GetBaseLayerByType(BaseLayerType.OSM_ESDM_contours, \"\", this._osmContouredApiKey).olLayer,\r\n this._OSOpen = this._baseLayerFactory.GetBaseLayerByType(BaseLayerType.OS_Open_Data).olLayer,\r\n this._baseLayerFactory.GetBaseLayerByType(BaseLayerType.OSOneInch_Hills1885).olLayer,\r\n this._baseLayerFactory.GetBaseLayerByType(BaseLayerType.OSOneInch_1955To1961).olLayer,\r\n this._baseLayerFactory.GetBaseLayerByType(BaseLayerType.OSProvisional_1937to1961).olLayer\r\n ];\r\n\r\n\r\n let mapSettings = this._mapStore.getMapInfo();\r\n\r\n if (this._isMember) {\r\n\r\n if (this._bingSession !== null) {\r\n //add Bing layers for auth users\r\n this._BingOS = this._baseLayerFactory.GetBaseLayerByType(BaseLayerType.BingOS, this._bingApiOrSessionKey).olLayer;\r\n this._BingRoad = this._baseLayerFactory.GetBaseLayerByType(BaseLayerType.BingRoad, this._bingApiOrSessionKey).olLayer;\r\n\r\n layers.push(this._BingOS);\r\n layers.push(this._BingRoad);\r\n layers.push(this._baseLayerFactory.GetBaseLayerByType(BaseLayerType.BingAerial, this._bingApiOrSessionKey).olLayer);\r\n layers.push(this._baseLayerFactory.GetBaseLayerByType(BaseLayerType.BingAerialWithLabels, this._bingApiOrSessionKey).olLayer);\r\n\r\n this._bingSession.setMap(this._map);\r\n }\r\n else {\r\n //hide Bing layer controls\r\n $(\"#liBingOS\").hide();\r\n $(\"#liBingAerial\").hide();\r\n $(\"#liBingAerialWithLabels\").hide();\r\n\r\n mapSettings.baselayer = null;\r\n } \r\n } \r\n\r\n let layerGroup = new LayerGroup({\r\n //'title': 'Base maps',\r\n layers: layers\r\n }); \r\n let baseMapSet = false;\r\n\r\n layerGroup.getLayers().forEach(function (sublayer, j) {\r\n if (mapSettings.baselayer === sublayer.getProperties().name) {\r\n sublayer.setVisible(true);\r\n baseMapSet = true;\r\n }\r\n });\r\n\r\n //if the base isn't set then set the default\r\n if (!baseMapSet) {\r\n layerGroup.getLayers().forEach(function (sublayer, j) {\r\n if (sublayer.get(\"name\") === \"Contoured\") {\r\n sublayer.setVisible(true);\r\n mapSettings.baselayer = \"Contoured\";\r\n }\r\n });\r\n }\r\n\r\n this._map.addLayer(layerGroup);\r\n\r\n let baseLayerRadios = $(\"input[name='baseLayer']\"); \r\n\r\n $(\"input[name='baseLayer']\").each(function (i: number, e: HTMLElement) {\r\n $(this).prop(\"checked\", mapSettings.baselayer === $(this).val());\r\n $(this).on(\"click\", function (e) {\r\n self.baseRadioClicked(e);\r\n });\r\n });\r\n\r\n if (self._mapStore.getMapInfo().closePanelOnBaseLayerChange === true) {\r\n $(\"#ckAutoClose\").prop(\"checked\", true);\r\n }\r\n \r\n $(\"#ckAutoClose\").on(\"click\", function () { \r\n self._mapStore.onAutoCloseBaseLayerChanged($(this).prop(\"checked\"));\r\n });\r\n }\r\n\r\n //Base layer changed handler\r\n private baseRadioClicked = (e: any): void => {\r\n let rdoVal = e.currentTarget.value;\r\n let self = this;\r\n\r\n this._map.getLayers().forEach(function (layer, i) {\r\n if (layer instanceof LayerGroup) {\r\n layer.getLayers().forEach(function (sublayer, j) {\r\n\r\n let properties = sublayer.getProperties();\r\n let visible = properties.name === rdoVal;\r\n sublayer.setVisible(visible);\r\n\r\n if (visible) {\r\n //do this for the visible layer only \r\n self._mapStore.onBaseLayerChanged(rdoVal, true);\r\n\r\n if (self._mapStore.getMapInfo().closePanelOnBaseLayerChange === true) {\r\n $(\"#slide-panel-btn-base-layers\").trigger(\"click\");\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.setBingOSView(this._map.getView().getZoom());\r\n }\r\n\r\n private onTrackingStarted = (): void => {\r\n const self = this;\r\n\r\n $(\"input[name='baseLayer']\").each(function (index, element) { \r\n //remember the currently selected base layer\r\n if ($(this).prop(\"checked\")) {\r\n self._selectedBaseLayerRadioId = element.id;\r\n } \r\n $(this).prop(\"disabled\", element.id !== \"rdoOpenContours\"); \r\n });\r\n $('#rdoOpenContours').trigger(\"click\");\r\n }\r\n\r\n private onTrackingEnded = (): void => {\r\n const self = this;\r\n\r\n $(\"input[name='baseLayer']\").each(function (index, element) { \r\n if (element.id !== \"rdoOpenContours\") {\r\n $(this).prop(\"disabled\", false);\r\n }\r\n });\r\n\r\n if (self._selectedBaseLayerRadioId) {\r\n $(`#${self._selectedBaseLayerRadioId}`).trigger(\"click\");\r\n self._selectedBaseLayerRadioId = \"\";\r\n } \r\n }\r\n\r\n private setBingOSView = (zoom: number): void => {\r\n const zoomInt: number = parseInt(zoom.toString());\r\n console.log(\"zoom:\" + zoomInt);\r\n\r\n if (this._isMember && this._bingSession !== null && $('#rdoBingOS').prop(\"checked\")) {\r\n //when minified we're not get whole number for the zoom level\r\n if (zoomInt <= 11 && this._BingOS.getVisible()) {\r\n //if current layer is BingOS then show BingRoad\r\n this._BingOS.setVisible(false);\r\n this._BingRoad.setVisible(true);\r\n this._OSOpen.setVisible(false);\r\n\r\n } else if (zoomInt > 11 && zoomInt < 17 && (this._BingRoad.getVisible() || this._OSOpen.getVisible() )) {\r\n //if current layer is BingRoad then show BingOS\r\n this._BingOS.setVisible(true);\r\n this._BingRoad.setVisible(false);\r\n this._OSOpen.setVisible(false);\r\n\r\n } else if (zoomInt >= 17 && this._BingOS.getVisible()) {\r\n this._BingOS.setVisible(false);\r\n this._BingRoad.setVisible(false);\r\n this._OSOpen.setVisible(true);\r\n }\r\n }\r\n }\r\n\r\n private addOverlays = (map: olMap): void => {\r\n let self = this;\r\n self._overlays = new Map();\r\n\r\n let landRegistryAttr = \"This information is subject to Crown copyright and database rights 2021 and is reproduced with the permission of HM Land Registry.
The polygons (including the associated geometry, namely x, y co-ordinates) are subject to Crown copyright and database rights 2021 Ordnance Survey 100026316.\"\r\n self.addOverlay(map, \"LandRegistry\", true);\r\n self._overlays.get(\"LandRegistry\").getSource().setAttributions(landRegistryAttr);\r\n\r\n self.addOverlay(map, \"HighwaysAuthorities\", false);\r\n self.addOverlay(map, \"LEGACYLines\", true); \r\n self.addOverlay(map, \"UCRLines\", true, true); \r\n self.addOverlay(map, \"BOATLines\", true, true); \r\n\r\n if(this._showBOATProw) {\r\n self.addOverlay(map, \"PROW-Byway\", true, false); \r\n self._overlays.get(\"PROW-Byway\").setVisible(true);\r\n }\r\n \r\n this.addOverlay(map, \"RoutesWithoutComments\", true, true);\r\n this.addOverlay(map, \"OpenUSRN\", true); \r\n this.addOverlay(map, \"RepAreas\", false); \r\n\r\n //set inital map layers visibility\r\n $(\"input.mapLayer\").each(function () {\r\n let ck = $(this);\r\n let layerName = ck.val();\r\n let defaultChecked = (ck.data(\"checked\") == true);\r\n let isVisible = self._mapStore.isLayerVisible(layerName, defaultChecked);\r\n\r\n if (isVisible) {\r\n ck.prop(\"checked\", isVisible);\r\n self._overlays.get(layerName).setVisible(true);\r\n }\r\n }); \r\n\r\n //now add the change handlers\r\n $(\"input.mapLayer\").each(function () {\r\n let ck = $(this);\r\n ck.on(\"change\", function () {\r\n let checked = $(this).is(\":checked\");\r\n let layerName = $(this).val();\r\n self._overlays.get(layerName).setVisible(checked);\r\n self._mapStore.onLayerVisibiltyChanged(layerName, checked);\r\n\r\n if (layerName === \"BOATLines\" && !checked) { \r\n (self._overlays.get(\"BOATLines\").getSource()).updateParams({\r\n \"time\": Date.now(),\r\n \"SHOW_FAVOURITES\": self._showFavourites, \r\n \"HIDE_ROUTES_OF_NO_INTEREST\": self._hideRoutesOfNoInterest\r\n });\r\n }\r\n if (self._showBOATProw) {\r\n (self._overlays.get(\"PROW-Byway\").getSource()).updateParams({\r\n \"time\": Date.now(),\r\n \"SHOW_BOAT_PROW\": self._showBOATProw\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n private addOverlay = (\r\n map: olMap,\r\n layerName: string,\r\n queryable: boolean,\r\n useHideRoutesOfNoInterest: boolean = false\r\n ): void => {\r\n let layer = this.getWmsImageLayer(layerName, queryable, useHideRoutesOfNoInterest);\r\n layer.setVisible(false);\r\n this._overlays.set(layerName, layer);\r\n map.addLayer(this._overlays.get(layerName));\r\n\r\n let resolution = map.getView().getResolution();\r\n this.updateLegendGraphic(layer.getSource(), layerName, resolution);\r\n }\r\n\r\n private getWmsImageLayer = (\r\n layerName: string,\r\n queryable: boolean,\r\n useHideRoutesOfNoInterest: boolean\r\n ): Layer => {\r\n let self = this;\r\n let params = {\r\n LAYERS: layerName,\r\n VERSION: \"1.3.0\"\r\n };\r\n \r\n if (layerName === \"PROW-Byway\") {\r\n params[\"SHOW_BOAT_PROW\"] = self._showBOATProw;\r\n }\r\n\r\n if (useHideRoutesOfNoInterest) {\r\n params[\"HIDE_ROUTES_OF_NO_INTEREST\"] = self._hideRoutesOfNoInterest;\r\n }\r\n\r\n if (layerName === \"UCRLines\" || layerName === \"BOATLines\") {\r\n params[\"SHOW_FAVOURITES\"] = self._showFavourites;\r\n } \r\n\r\n let source = new ImageWMS({\r\n projection: self._map.getView().getProjection(),\r\n url: self._wfsUrl,\r\n params: params,\r\n serverType: \"mapserver\",\r\n ratio: 1.5\r\n });\r\n\r\n source.on('imageloadstart', function () {\r\n self.onLayerLoading();\r\n });\r\n source.on('imageloadend', function () {\r\n self.onLayerLoaded();\r\n });\r\n source.on('imageloaderror', function () {\r\n self.onLayerLoaded();\r\n });\r\n\r\n let lyr = new ImageLayer({\r\n source: source\r\n });\r\n\r\n lyr.set(\"queryable\", queryable, true);\r\n\r\n return lyr\r\n }\r\n\r\n private updateLegendGraphic = (wmsSource, layerName: string, resolution: number): void => {\r\n let img = document.getElementById('legend_' + layerName);\r\n if (img) {\r\n let graphicUrl = wmsSource.getUrl(resolution) + \"?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetLegendGraphic&FORMAT=image%2Fpng&LAYER=\" + layerName;\r\n //console.log(graphicUrl);\r\n img.src = graphicUrl;\r\n }\r\n }\r\n\r\n private onLayerLoading = (): void => {\r\n this._loadingCount += 1\r\n $(\"#mapLoader\").show();\r\n }\r\n\r\n private onLayerLoaded = (): void => {\r\n this._loadingCount -= 1;\r\n if (this._loadingCount === 0) {\r\n $(\"#mapLoader\").hide(\"slow\");\r\n }\r\n }\r\n\r\n private toolRadioClicked = (ele: HTMLElement, ev: MouseEvent): void => {\r\n let rdoVal = (ele).value;\r\n\r\n switch (rdoVal) {\r\n case \"measureKm\":\r\n this._contextMenu.deactivate();\r\n this._measureInKm = true;\r\n this.addMeasureInteraction();\r\n break;\r\n\r\n case \"measureMiles\":\r\n this._contextMenu.deactivate();\r\n this._measureInKm = false;\r\n this.addMeasureInteraction();\r\n break;\r\n\r\n default:\r\n this.removeMeasureInteraction();\r\n //enable context menu\r\n this._contextMenu.activate();\r\n }\r\n this._mapStore.onCurrentToolChanged(rdoVal);\r\n }\r\n\r\n private addMeasureInteraction = (): void => {\r\n if (this._draw !== null) {\r\n //already initiated\r\n return;\r\n }\r\n let self = this;\r\n let source = new VectorSource();\r\n\r\n this._measureLayer = new VectorLayer({\r\n source: source,\r\n //id: 'measure-tool',\r\n style: new Style({\r\n fill: new Fill({\r\n color: 'rgba(255, 0, 0, 1)'\r\n }),\r\n stroke: new Stroke({\r\n color: '#ffcc33',\r\n width: 2\r\n }),\r\n image: new Circle({\r\n radius: 7,\r\n fill: new Fill({\r\n color: '#ffcc33'\r\n })\r\n })\r\n })\r\n });\r\n\r\n this._measureLayer.set(\"id\", \"measure-tool\", true);\r\n this._map.addLayer(this._measureLayer);\r\n this._measureLayer.setVisible(true);\r\n\r\n let formatLength = function (line) {\r\n let length = olSphere.getLength(line);\r\n let output;\r\n\r\n if (self._measureInKm) {\r\n if (length > 100) {\r\n output = (Math.round(length / 1000 * 100) / 100) +\r\n ' ' + 'km';\r\n } else {\r\n output = (Math.round(length * 100) / 100) +\r\n ' ' + 'm';\r\n }\r\n } else {\r\n //miles\r\n output = (Math.round((length * 0.0006213712) * 100) / 100) + ' mile(s)';\r\n }\r\n\r\n return output;\r\n };\r\n\r\n this._draw = new Draw({\r\n source: source,\r\n type: GeometryType.LINE_STRING,\r\n style: new Style({\r\n fill: new Fill({\r\n color: 'rgba(255, 255, 255, 0.2)'\r\n }),\r\n stroke: new Stroke({\r\n color: 'rgba(0, 0, 0, 0.5)',\r\n lineDash: [10, 10],\r\n width: 2\r\n }),\r\n image: new Circle({\r\n radius: 5,\r\n stroke: new Stroke({\r\n color: 'rgba(0, 0, 0, 0.7)'\r\n }),\r\n fill: new Fill({\r\n color: 'rgba(255, 255, 255, 0.2)'\r\n })\r\n })\r\n })\r\n });\r\n\r\n this._map.addInteraction(this._draw);\r\n this.createMeasureTooltip();\r\n this.createHelpTooltip();\r\n\r\n let listener;\r\n this._draw.on('drawstart',\r\n function (evt: DrawEvent) {\r\n\r\n let measureRdo = $(\"#rdoToolMeasureKm\").is(':checked') || $(\"#rdoToolMeasureMiles\").is(':checked');\r\n if (!measureRdo) {\r\n //nothing to do \r\n return;\r\n }\r\n \r\n // set sketch\r\n self._sketch = evt.feature;\r\n\r\n /** @type {ol.Coordinate|undefined} */\r\n //let tooltipCoord = evt.coordinate;\r\n let tooltipCoord;\r\n\r\n listener = self._sketch.getGeometry().on('change', function (evt) {\r\n let geom = evt.target;\r\n let output;\r\n if (geom instanceof LineString) {\r\n output = formatLength(geom);\r\n tooltipCoord = geom.getLastCoordinate();\r\n }\r\n self._measureTooltipElement.innerHTML = output;\r\n self._measureTooltip.setPosition(tooltipCoord);\r\n });\r\n });\r\n\r\n this._draw.on('drawend',\r\n function () {\r\n self._measureTooltipElement.className = 'tooltip tooltip-static';\r\n self._measureTooltip.setOffset([0, -7]);\r\n // unset sketch\r\n self._sketch = null;\r\n // unset tooltip so that a new one can be created\r\n self._measureTooltipElement = null;\r\n self.createMeasureTooltip();\r\n unByKey(listener);\r\n });\r\n }\r\n\r\n private removeMeasureInteraction = (): void => {\r\n if (this._measureLayer) {\r\n this._measureLayer.setVisible(false);\r\n }\r\n\r\n if (this._draw) {\r\n this._map.removeInteraction(this._draw);\r\n }\r\n\r\n this._draw = null;\r\n\r\n $('.tooltip-static').remove();\r\n\r\n if (this._measureTooltip) {\r\n this._map.removeOverlay(this._measureTooltip);\r\n }\r\n\r\n if (this._measureTooltipElement) {\r\n this._measureTooltipElement.className = 'tooltip tooltip-measure hidden';\r\n this._measureTooltipElement.parentNode.removeChild(this._measureTooltipElement);\r\n }\r\n\r\n if (this._helpTooltipElement) {\r\n this._helpTooltipElement.parentNode.removeChild(this._helpTooltipElement);\r\n }\r\n }\r\n\r\n private handleClick = (evt: MapBrowserEvent): void => {\r\n\r\n //let gridRefRdo = document.getElementById(\"rdoToolGridRef\");\r\n //if (gridRefRdo.checked === true) {\r\n // $(\"#txtGridRef\").val(mapGridRef.getGridRef(evt.coordinate));\r\n // return;\r\n //}\r\n let self = this;\r\n let html: string = \"\";\r\n let measureRdo = $(\"#rdoToolMeasureKm\").is(':checked') || $(\"#rdoToolMeasureMiles\").is(':checked');\r\n if (measureRdo) {\r\n //nothing to do \r\n return;\r\n }\r\n\r\n //show message for unauthenticated users\r\n if (self._isMember === false) {\r\n if (self._isAuthenticated === false) {\r\n html = self.htmlForLoginRegisterPrompt();\r\n }\r\n else {\r\n html = self.htmlForNonMemberPrompt();\r\n }\r\n return;\r\n }\r\n\r\n let callback = function () {\r\n self._mapHighlight.highlightFeaturesAtEvent(evt, window[\"routeids\"], window[\"legacyrouteids\"], window[\"landregistryids\"]);\r\n }\r\n\r\n window[\"routeids\"] = [];\r\n window[\"legacyrouteids\"] = [];\r\n window[\"landregistryids\"] = []; \r\n self._mapFeatureInfo.showFeaturesAtEvent(self._map, evt, callback);\r\n }\r\n\r\n private handlePointerMove = (evt: MapBrowserEvent): void => {\r\n if (evt.dragging) {\r\n return;\r\n }\r\n\r\n let measureRdo = $(\"#rdoToolMeasureKm\").is(':checked') || $(\"#rdoToolMeasureMiles\").is(':checked');\r\n if (!measureRdo) {\r\n //nothing to do \r\n return;\r\n }\r\n\r\n let helpMsg = 'Click to start drawing';\r\n if (this._sketch !== null) {\r\n helpMsg = \"Double click to finish drawing\";\r\n }\r\n\r\n this._helpTooltipElement.innerHTML = helpMsg;\r\n this._helpTooltip.setPosition(evt.coordinate);\r\n this._helpTooltipElement.classList.remove('hidden');\r\n }\r\n\r\n private htmlForLoginRegisterPrompt = (): string => {\r\n let htmlContent = `
\r\n Please Login or Register to see route details. Find out more...\r\n
`;\r\n\r\n return htmlContent;\r\n }\r\n\r\n private htmlForNonMemberPrompt = (): string => {\r\n let htmlContent = `
\r\n If you have lost the ability to use all features of TW2 your GLASS membership has likely expired.\r\n
`;\r\n\r\n return htmlContent;\r\n }\r\n\r\n private createHelpTooltip = (): void => {\r\n if (this._helpTooltipElement && this._helpTooltipElement.parentNode) {\r\n this._helpTooltipElement.parentNode.removeChild(this._helpTooltipElement);\r\n }\r\n this._helpTooltipElement = document.createElement('div');\r\n this._helpTooltipElement.className = 'tooltip hidden';\r\n this._helpTooltipElement.innerHTML = 'Shift click to start drawing';\r\n this._helpTooltip = new Overlay({\r\n element: this._helpTooltipElement,\r\n offset: [15, 0],\r\n positioning: OverlayPositioning.CENTER_LEFT,\r\n //autoPan: true,\r\n //autoPanMargin: 150\r\n });\r\n this._map.addOverlay(this._helpTooltip);\r\n }\r\n\r\n private createMeasureTooltip = (): void => {\r\n if (this._measureTooltipElement && this._measureTooltipElement.parentNode) {\r\n this._measureTooltipElement.parentNode.removeChild(this._measureTooltipElement);\r\n }\r\n this._measureTooltipElement = document.createElement('div');\r\n this._measureTooltipElement.className = 'tooltip tooltip-measure hidden';\r\n this._measureTooltip = new Overlay({\r\n element: this._measureTooltipElement,\r\n offset: [0, -15], \r\n positioning: OverlayPositioning.BOTTOM_CENTER,\r\n autoPan: true,\r\n autoPanMargin: 150\r\n });\r\n this._map.addOverlay(this._measureTooltip);\r\n }\r\n\r\n private checkAuthStatus = (): void => {\r\n $.ajax({\r\n url: '/api/isauthenticated',\r\n dataType: \"json\"\r\n })\r\n .done(function (response) {\r\n if (response === false) {\r\n //refresh the page so map enforces rule for anonymous\r\n location.reload();\r\n }\r\n })\r\n .fail(function (err) {\r\n //alert(err);\r\n });\r\n }\r\n\r\n}","import * as ContextMenu from \"ol-contextmenu\";\r\nimport * as olProj from 'ol/proj';\r\nimport VectorLayer from \"ol/layer/Vector\";\r\nimport VectorSource from \"ol/source/Vector\";\r\nimport Feature from \"ol/Feature\";\r\nimport RenderFeature from \"ol/render/Feature\";\r\nimport Style from \"ol/style/Style\";\r\nimport Fill from \"ol/style/Fill\";\r\nimport Point from \"ol/geom/Point\";\r\nimport Stroke from \"ol/style/Stroke\";\r\nimport Icon from 'ol/style/Icon';\r\nimport Text from 'ol/style/Text';\r\nimport olMap from 'ol/Map';\r\nimport { Coordinate } from \"ol/coordinate\";\r\n\r\nexport class MapContextMenu {\r\n \r\n protected _contextMenu: ContextMenu;\r\n protected _vectorLayer: VectorLayer;\r\n \r\n protected _removeMarkerItem: any;\r\n protected _items: Array;\r\n\r\n public constructor(\r\n private _map: olMap,\r\n private iconUrl: string = \"/images/pin_drop.png\"\r\n ) {\r\n this._vectorLayer = new VectorLayer({ source: new VectorSource() });\r\n this.init();\r\n }\r\n\r\n private init = (): void => { \r\n let self = this;\r\n \r\n self._map.addLayer(self._vectorLayer);\r\n self._items = [\r\n '-', // this is a separator\r\n {\r\n text: 'Center map here',\r\n callback: function (obj) {\r\n self.centerMap([obj.coordinate[0], obj.coordinate[1]]);\r\n }\r\n },\r\n '-', // this is a separator\r\n {\r\n text: 'Google Maps',\r\n callback: function (obj) {\r\n self.openGoogleMaps([obj.coordinate[0], obj.coordinate[1]]);\r\n }\r\n }\r\n //{\r\n // text: 'Add a marker}',\r\n // callback: function (obj) {\r\n // self.addMarker([obj.coordinate[0], obj.coordinate[1]]);\r\n // }\r\n //}\r\n ];\r\n\r\n //self._removeMarkerItem = {\r\n // text: ' {\r\n let element = self._map.getTargetElement();\r\n let { top, left } = element.getBoundingClientRect();\r\n\r\n //EDGE does not support document.elementsFromPoint\r\n if (document.elementsFromPoint && document.elementsFromPoint(evt.pixel[0] + left, evt.pixel[1] + top).some(e => e.id === 'popup')) {\r\n self._contextMenu.disable();\r\n return;\r\n }\r\n });\r\n\r\n self._contextMenu.getDefaultItems()[0].text = \"Zoom in\";\r\n self._contextMenu.getDefaultItems()[1].text = \"Zoom out\";\r\n\r\n self._contextMenu.on('open', function (evt) {\r\n let feature: Feature | RenderFeature = self._map.forEachFeatureAtPixel(evt.pixel, function (ft, l) {\r\n return ft;\r\n });\r\n if (feature && feature.get('type') === 'removable') {\r\n self._contextMenu.clear();\r\n self._removeMarkerItem.data = {\r\n marker: feature\r\n };\r\n self._contextMenu.push(self._removeMarkerItem);\r\n } else {\r\n self._contextMenu.clear();\r\n self._contextMenu.extend(self._contextMenu.getDefaultItems());\r\n self._contextMenu.extend(self._items);\r\n }\r\n });\r\n \r\n self._map.addControl(self._contextMenu); \r\n }\r\n\r\n public addItems = (items: Array): void => {\r\n this._contextMenu.extend(items);\r\n this._items = this._items.concat(items);\r\n }\r\n\r\n private centerMap = (coordinate: [number, number]): void => {\r\n this._map.getView().animate({ center: coordinate });\r\n }\r\n\r\n private openGoogleMaps = (coordinate: [number, number]): void => {\r\n let coord4326: Coordinate = olProj.transform(coordinate, \"EPSG:3857\", \"EPSG:4326\");\r\n let url = encodeURI(`https://www.google.com/maps/search/?api=1&query=${coord4326[1]},${coord4326[0]}`);\r\n window.open(url, '_blank'); \r\n }\r\n\r\n public activate = ():void => {\r\n this._contextMenu.enable();\r\n } \r\n\r\n public deactivate = (): void => {\r\n this._contextMenu.disable();\r\n }\r\n\r\n //public addMarker = (coordinate: [number, number]): void => {\r\n // let template = 'Coordinate is ({x} | {y})',\r\n // iconStyle = new Style({\r\n // image: new Icon({ scale: .6, src: this.iconUrl }),\r\n // text: new Text({\r\n // offsetY: 25,\r\n // text: this.getGridRef(coordinate),\r\n // font: '15px Open Sans,sans-serif',\r\n // fill: new Fill({ color: '#111' }),\r\n // stroke: new Stroke({ color: '#eee', width: 2 })\r\n // })\r\n // }),\r\n // feature = new Feature({\r\n // type: 'removable',\r\n // geometry: new Point(coordinate)\r\n // });\r\n\r\n // feature.setStyle(iconStyle);\r\n // this._vectorLayer.getSource().addFeature(feature);\r\n //}\r\n\r\n //private getGridRef = (coordinate: [number, number]): string => {\r\n // //transform from display projection to data projection\r\n // let coords = olProj.transform(coordinate, this._map.options.displayProjection, this._map.options.dataProjection);\r\n // return `${coords[0].toFixed(0)} ${coords[1].toFixed(0)}`;\r\n //}\r\n\r\n //private removeMarker = (marker: Feature): void => {\r\n // this._vectorLayer.getSource().removeFeature(marker);\r\n //}\r\n}","import { Feature } from 'ol';\r\nimport { Units } from 'ol/control/ScaleLine';\r\nimport WKT from 'ol/format/WKT';\r\nimport Point from 'ol/geom/Point';\r\nimport VectorLayer from 'ol/layer/Vector';\r\nimport olMap from 'ol/Map';\r\nimport VectorSource from 'ol/source/Vector';\r\nimport Icon from 'ol/style/Icon';\r\nimport IconAnchorUnits from 'ol/style/IconAnchorUnits';\r\nimport Style from 'ol/style/Style';\r\nimport * as olProj from 'ol/proj';\r\n\r\n\r\nexport class MapGazetteer {\r\n\r\n private baseUrl: string = \"/api/mapsearch\";\r\n private twuuidApiUrl: string = \"/api/twuidsearch\";\r\n\r\n //array of points - used when user selects an option from the search results dropdown\r\n private searchResults = new Array();\r\n\r\n //hard coded id of dropdownlist, this could be passed in\r\n private resultsSelectId: string = \"#gazetterSelect\";\r\n private searchBoxId: string = \"#txtSearch\";\r\n private searchBtnId: string = \"#btnSearch\";\r\n private searchTwuidBoxId: string = \"#txtTwuidSearch\";\r\n private searchTwuidBtnId: string = \"#btnTwuidSearch\";\r\n\r\n private vectorLayer: VectorLayer;\r\n private vectorSource: VectorSource;\r\n\r\n public constructor(private map: olMap) {\r\n map = this.map;\r\n this.addHandlers();\r\n this.addVectorLayer();\r\n }\r\n\r\n private addVectorLayer = (): void => {\r\n this.vectorSource = new VectorSource({});\r\n this.vectorLayer = new VectorLayer({\r\n source: this.vectorSource\r\n });\r\n this.map.addLayer(this.vectorLayer);\r\n }\r\n\r\n private hideSearchResultBox = (): void => {\r\n let resultsSelect = $(this.resultsSelectId);\r\n resultsSelect.empty();\r\n resultsSelect.hide();\r\n }\r\n\r\n private addHandlers = (): void => {\r\n let self = this;\r\n\r\n $(\".hasclear\").keyup(function () {\r\n let t = $(this);\r\n t.next('span').toggle(Boolean(t.val()));\r\n });\r\n\r\n $(\".clearer\").hide({\r\n complete: function () {\r\n $(this).prev('input').val();\r\n }\r\n } \r\n );\r\n\r\n $(\".clearer\").click(function (e) {\r\n $(this).prev('input').val('').focus();\r\n $(this).hide();\r\n let resultsSelect = $(self.resultsSelectId);\r\n resultsSelect.empty();\r\n resultsSelect.hide();\r\n $(\"#noResults\").hide();\r\n self.clearMarker();\r\n });\r\n\r\n $(this.resultsSelectId).change(function (event) {\r\n self.showOnMap($(this));\r\n });\r\n\r\n //Location/Postcode\r\n $(this.searchBtnId).click(function (event) {\r\n self.search();\r\n });\r\n $(this.searchBoxId).keypress(function (event) {\r\n if (event.which || event.keyCode) {\r\n if ((event.which == 13) || (event.keyCode == 13)) {\r\n self.search();\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n\r\n //Twuid\r\n $(this.searchTwuidBtnId).click(function (event) {\r\n self.searchTwuid();\r\n });\r\n $(this.searchTwuidBoxId).keypress(function (event) {\r\n if (event.which || event.keyCode) {\r\n if ((event.which == 13) || (event.keyCode == 13)) {\r\n self.searchTwuid();\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n private search = (): void => {\r\n this.clearMarker();\r\n\r\n //trim it\r\n $(this.searchBoxId).val(($(this.searchBoxId).val()).trim());\r\n\r\n let searchTerm:string = $(this.searchBoxId).val();\r\n if (searchTerm.length === 0) {\r\n return;\r\n }\r\n else if (/\\d/.test(searchTerm)) {\r\n //test for any digits in the search term - if so we do a Postcode search\r\n this.findPostcode(searchTerm);\r\n } else {\r\n this.findLocation(searchTerm);\r\n }\r\n }\r\n\r\n private searchTwuid = (): void => {\r\n this.clearMarker();\r\n\r\n //trim it\r\n $(this.searchTwuidBoxId).val(($(this.searchTwuidBoxId).val()).trim()); \r\n\r\n let searchTerm: string = $(this.searchTwuidBoxId).val();\r\n if (searchTerm.length === 0) {\r\n return;\r\n }\r\n this.findTwuid(searchTerm);\r\n }\r\n\r\n private findPostcode = (searchTerm: string): void => {\r\n searchTerm = searchTerm.trim();\r\n // this caused issue #11\r\n //searchTerm = searchTerm.replace(/\\s/g, \"\"); \r\n $(\"#gazLoading\").show();\r\n this.find({\r\n //searchType: 1,\r\n query: searchTerm\r\n }, this.baseUrl, 14, this.processSearchResult);\r\n }\r\n\r\n private findLocation = (searchTerm: string): void => {\r\n $(\"#gazLoading\").show();\r\n this.find(\r\n {\r\n //searchType: 2,\r\n query: searchTerm\r\n },\r\n this.baseUrl, 14, this.processSearchResult);\r\n }\r\n\r\n private findTwuid = (searchTerm: string): void => {\r\n let self = this;\r\n $(\"#twuidLoading\").show();\r\n this.find({ query: searchTerm }, this.twuuidApiUrl, 14, processTwuidResult, this.showNoResultsOnTwuidFail);\r\n\r\n\r\n function processTwuidResult(json:any, zoomLevel: number) {\r\n console.log(json);\r\n $(\"#twuidLoading\").hide();\r\n if (json.wkt) {\r\n let format = new WKT();\r\n let geom = format.readGeometry(json.wkt, {\r\n dataProjection: \"EPSG:27700\",\r\n featureProjection: \"EPSG:3857\"\r\n }); //parse WKT \r\n let extent = geom.getExtent();\r\n self.map.getView().fit(extent, { maxZoom: 17, nearest: false });\r\n\r\n //let center = ol.extent.getCenter(extent);\r\n //map.getView().setCenter(center);\r\n //map.getView().setZoom(zoomLevel);\r\n }\r\n else {\r\n this.showTwuidNoResults();\r\n }\r\n }\r\n }\r\n\r\n private showNoResultsOnTwuidFail = (jqXHR, textStatus, errorThrown): void => {\r\n this.showTwuidNoResults();\r\n }\r\n private showTwuidNoResults = (): void => {\r\n $(\"#twuidLoading\").hide();\r\n $(\"#twuidNoResults\").show();\r\n setTimeout(function () {\r\n $(\"#twuidNoResults\").hide();\r\n }, 3000);\r\n }\r\n\r\n private showNoResults = (): void => {\r\n $(\"#noResults\").show();\r\n setTimeout(function () {\r\n $(\"#noResults\").hide();\r\n }, 3000);\r\n }\r\n\r\n private alertOnFail = (jqXHR, textStatus, errorThrown): void => {\r\n $(\"#gazLoading\").hide();\r\n alert(\"error\");\r\n }\r\n private showNoResultsOnFail = (jqXHR, textStatus, errorThrown): void => {\r\n $(\"#gazLoading\").hide();\r\n this.showNoResults();\r\n }\r\n\r\n private find = (dataObj, seachUrl: string, zoomLevel: Number, successFunction: Function, failFunction: any = null): void =>{\r\n $.ajax({\r\n url: seachUrl,\r\n data: dataObj,\r\n dataType: \"json\"\r\n })\r\n .done(function (json) {\r\n successFunction(json, zoomLevel);\r\n })\r\n .fail(\r\n function () {\r\n if (failFunction !== null) {\r\n failFunction.call(this);\r\n } \r\n } \r\n ); \r\n }\r\n\r\n //used to process location and postcode search results\r\n private processSearchResult = (json: any, zoomLevel: number): void => {\r\n let points = new Array(),\r\n location, point,\r\n resultsSelect;\r\n\r\n //remove all existing entries\r\n resultsSelect = $(this.resultsSelectId);\r\n resultsSelect.empty();\r\n resultsSelect.hide();\r\n $(\"#noResults\").hide();\r\n $(\"#gazLoading\").hide();\r\n\r\n //alert(json);\r\n //console.log(json.results);\r\n\r\n let queryFromHeader = null;\r\n if (json.header) {\r\n queryFromHeader = json.header.query.toLowerCase();\r\n }\r\n\r\n //keep track of ids so we can dedup\r\n let resultIds = {};\r\n\r\n if (json.results) {\r\n $.each(json.results, function (index, item) {\r\n\r\n // console.log(item);\r\n\r\n if (item.GAZETTEER_ENTRY.LOCAL_TYPE === \"Postcode\") {\r\n console.log('postcode');\r\n let location = {\r\n Name: item.GAZETTEER_ENTRY.POPULATED_PLACE,\r\n PostalCode: item.GAZETTEER_ENTRY.NAME1,\r\n County: item.GAZETTEER_ENTRY.COUNTY_UNITARY,\r\n Longitude: item.GAZETTEER_ENTRY.GEOMETRY_X,\r\n Latitude: item.GAZETTEER_ENTRY.GEOMETRY_Y,\r\n Region: item.GAZETTEER_ENTRY.REGION,\r\n ZoomLevel: zoomLevel\r\n };\r\n\r\n //getting non-matching results, make sure NAME1 contains the search postcode\r\n //remove all whitespace and force to LC for comparison\r\n if (queryFromHeader && location.PostalCode.replace(/\\s/g, \"\").toLowerCase().indexOf(queryFromHeader.replace(/\\s/g, \"\")) > -1) {\r\n points.push(location);\r\n }\r\n\r\n\r\n } else {\r\n\r\n //need to deduplicate, OS is returning multiple result, e.g. for cardiff\r\n let id = item.GAZETTEER_ENTRY.ID;\r\n\r\n if (!resultIds[id]) {\r\n resultIds[id] = 1;\r\n\r\n let location = {\r\n Name: item.GAZETTEER_ENTRY.NAME1,\r\n Name2: item.GAZETTEER_ENTRY.NAME2 || \"\",\r\n County: item.GAZETTEER_ENTRY.COUNTY_UNITARY,\r\n Longitude: item.GAZETTEER_ENTRY.GEOMETRY_X,\r\n Latitude: item.GAZETTEER_ENTRY.GEOMETRY_Y,\r\n ZoomLevel: zoomLevel\r\n };\r\n\r\n //If \"REGION\":\"Wales\" then use name2\r\n if (item.GAZETTEER_ENTRY.REGION === \"Wales\" && item.GAZETTEER_ENTRY.NAME2) {\r\n location.Name = item.GAZETTEER_ENTRY.NAME2;\r\n location.Name2 = item.GAZETTEER_ENTRY.NAME1\r\n }\r\n\r\n //console.log(location);\r\n\r\n //getting non-matching results, make sure NAME1 contains the search string\r\n if (queryFromHeader &&\r\n (location.Name.toLowerCase().indexOf(queryFromHeader) > -1 || location.Name2.toLowerCase().indexOf(queryFromHeader) > -1)) {\r\n points.push(location);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function sortGaz(a, b) {\r\n let namea = a.Name + (a.County || \"aa\");\r\n let nameb = b.Name + (b.County || \"aa\");\r\n if (namea > nameb) return 1;\r\n if (nameb > namea) return -1;\r\n\r\n return 0;\r\n }\r\n points.sort(sortGaz);\r\n\r\n this.searchResults = new Array();\r\n\r\n if (points.length === 0) {\r\n //resultsSelect.append(\"\");\r\n this.showNoResults();\r\n\r\n } else if (points.length > 1) {\r\n for (let i = 0; i < points.length; i++) {\r\n point = points[i];\r\n if (point.PostalCode) {\r\n if (point.Name) {\r\n resultsSelect.append(\"\");\r\n } else {\r\n resultsSelect.append(\"\");\r\n }\r\n\r\n }\r\n else {\r\n if (point.County) {\r\n resultsSelect.append(\"\");\r\n } else {\r\n resultsSelect.append(\"\");\r\n }\r\n\r\n }\r\n\r\n this.searchResults.push(point);\r\n }\r\n resultsSelect.show();\r\n\r\n } else if (points.length == 1) {\r\n //transform fails if there are only a few decimal places in the result coords, force value to a float\r\n //let coord = [parseFloat(points[0].Easting), parseFloat(points[0].Northing)];\r\n //let coord3857 = ol.proj.transform(coord, 'EPSG:27700', 'EPSG:3857');\r\n //zoomLevel = 5;\r\n let coord = [parseFloat(points[0].Longitude), parseFloat(points[0].Latitude)];\r\n let coord3857 = olProj.transform(coord, 'EPSG:27700', 'EPSG:3857');\r\n\r\n //let coord27700 = ol.proj.transform(coord, 'EPSG:4326', 'EPSG:27700');\r\n //console.log('coord was ' + coord);\r\n //console.log('coord27700 was ' + coord27700);\r\n //console.log('zoomLevel was ' + zoomLevel);\r\n //map.getView().setCenter(coord27700);\r\n\r\n //map.getView().setCenter(coord); \r\n //map.getView().setZoom(zoomLevel);\r\n this.map.getView().animate({ center: coord3857 }, { zoom: zoomLevel });\r\n\r\n //addMarker(coord27700);\r\n }\r\n }\r\n\r\n private showOnMap = (ddl): void => {\r\n let i = ddl.prop('selectedIndex');\r\n\r\n if (this.searchResults.length > 0 && (this.searchResults.length >= i)) {\r\n //transform fails if there are only a few decimal places in the result coords, force value to a float\r\n //let coord = [parseFloat(searchResults[i].Easting), parseFloat(searchResults[i].Northing)];\r\n //let coord3857 = ol.proj.transform(coord, 'EPSG:27700', 'EPSG:3857');\r\n\r\n let coord = [parseFloat(this.searchResults[i].Longitude), parseFloat(this.searchResults[i].Latitude)];\r\n let coord3857 = olProj.transform(coord, 'EPSG:27700', 'EPSG:3857');\r\n\r\n //map.getView().setCenter(coord27700);\r\n ////map.getView().setCenter(coord);\r\n //map.getView().setZoom(searchResults[i].ZoomLevel);\r\n this.map.getView().animate({ center: coord3857 }, { zoom: this.searchResults[i].ZoomLevel });\r\n\r\n //addMarker(coord3857);\r\n this.hideSearchResultBox();\r\n }\r\n }\r\n\r\n private clearMarker = (): void => {\r\n this.vectorSource.clear(true);\r\n }\r\n\r\n private addMarker = (coords): void => {\r\n this.vectorSource.clear(true);\r\n\r\n let iconStyle = new Style({\r\n image: new Icon(({\r\n anchor: [0.5, 1],\r\n anchorXUnits: IconAnchorUnits.FRACTION,\r\n anchorYUnits: IconAnchorUnits.FRACTION,\r\n opacity: 0.95,\r\n src: '/iGIGL/Content/Images/marker-icon-blue.png'\r\n }))\r\n });\r\n\r\n let feature = new Feature({\r\n geometry: new Point(coords)\r\n });\r\n feature.setStyle(iconStyle);\r\n this.vectorSource.addFeature(feature);\r\n }\r\n\r\n}","import { DragAndDrop } from 'ol/interaction';\r\nimport VectorLayer from 'ol/layer/Vector';\r\nimport olMap from 'ol/Map';\r\nimport VectorSource from 'ol/source/Vector';\r\nimport Stroke from 'ol/style/Stroke';\r\nimport Style, { StyleLike } from 'ol/style/Style';\r\nimport { AppStorage } from './AppStorage';\r\nimport GPX from 'ol/format/GPX';\r\nimport GeoJSON from 'ol/format/GeoJSON';\r\nimport * as olExtent from 'ol/extent';\r\nimport { Popover } from \"bootstrap\"\r\nimport FeatureFormat from 'ol/format/Feature';\r\n\r\nexport interface IGpxFiles { \r\n filename: string;\r\n colour: string; \r\n}\r\n\r\nexport interface IGpxFile {\r\n extent: olExtent.Extent;\r\n geoJson: string;\r\n}\r\n\r\nexport class MapGpx {\r\n\r\n private dragAndDropInteraction: DragAndDrop;\r\n private featureLayer: VectorLayer;\r\n private layerSource: VectorSource;\r\n private appStorage: AppStorage;\r\n private defaultColour: string = \"#646463\";\r\n\r\n public constructor(private map: olMap) {\r\n this.appStorage = new AppStorage();\r\n this.addFeatureLayer();\r\n this.addGpxFileInputHandler();\r\n this.addDragDropInteraction();\r\n this.addRemoveAllHandler();\r\n this.loadFromStorage();\r\n }\r\n\r\n private addFeatureLayer = (): void => {\r\n this.layerSource = new VectorSource();\r\n this.featureLayer = new VectorLayer({\r\n source: this.layerSource,\r\n style: this.getFeatureStyle(this.defaultColour)\r\n });\r\n\r\n this.map.addLayer(this.featureLayer);\r\n }\r\n\r\n private getFeatureStyle = (darkStrokeColour: string): StyleLike => {\r\n let lightStroke = new Style({\r\n stroke: new Stroke({\r\n color: [255, 255, 255, 0.7],\r\n width: 4,\r\n lineDash: [4, 8],\r\n lineDashOffset: 6\r\n })\r\n });\r\n\r\n let darkStroke = new Style({\r\n stroke: new Stroke({\r\n //color: [0, 0, 0, 0.6],\r\n color: darkStrokeColour,\r\n width: 4,\r\n lineDash: [4, 8]\r\n })\r\n });\r\n\r\n return [lightStroke, darkStroke]\r\n }\r\n\r\n private addGpxFileInputHandler = (): void => {\r\n let self = this;\r\n\r\n //gpxFile\r\n $(\"#gpxFile\").on(\"change\", function (e) {\r\n let files = (e.target).files;\r\n for (let i = 0, f; f = files[i]; i++) {\r\n let file = f;\r\n self.getFeaturesFromGpxFile(f, function (features) {\r\n self.loadGpx(file, features);\r\n });\r\n }\r\n });\r\n }\r\n\r\n private addDragDropInteraction = (): void => {\r\n this.dragAndDropInteraction = new DragAndDrop({\r\n formatConstructors: [ \r\n GPX\r\n //FeatureFormat.\r\n //ol.format.GPX\r\n //ol.format.GeoJSON,\r\n //ol.format.IGC,\r\n //ol.format.KML,\r\n //ol.format.TopoJSON\r\n ]\r\n });\r\n this.dragAndDropInteraction.on('addfeatures', this.onDragDropAddFeatures);\r\n this.map.addInteraction(this.dragAndDropInteraction);\r\n }\r\n\r\n private addRemoveAllHandler = (): void => {\r\n let self = this;\r\n $(\"#btnGpxClear\").on(\"click\", function () {\r\n let fileNames = self.getStoredFileNames();\r\n fileNames.forEach(function (val) {\r\n self.appStorage.clearFromSession(val.filename);\r\n });\r\n self.appStorage.clearFromSession(\"GpxFiles\");\r\n self.layerSource.clear();\r\n self.buildGpxUi();\r\n });\r\n }\r\n\r\n private loadFromStorage = (): void => {\r\n let self = this;\r\n let geoJsonformat = new GeoJSON();\r\n let fileNamesAndColours = this.getStoredFileNames();\r\n\r\n fileNamesAndColours.forEach(function (val) {\r\n let geoJsonStr = self.appStorage.getSessionValueFromJson(val.filename);\r\n if (geoJsonStr) {\r\n let features = geoJsonformat.readFeatures(geoJsonStr.geoJson);\r\n\r\n features.forEach(function (feature) {\r\n feature.setStyle(self.getFeatureStyle(val.colour));\r\n feature.set(\"filename\", val.filename, true);\r\n });\r\n\r\n self.layerSource.addFeatures(features);\r\n }\r\n });\r\n this.buildGpxUi();\r\n }\r\n\r\n private onDragDropAddFeatures = (event): void => {\r\n if (!$(\"#slide-panel-tools\").is(':visible')) {\r\n $(\"#slide-panel-btn-tools\").click();\r\n }\r\n this.loadGpx(event.file, event.features);\r\n }\r\n\r\n private getFeaturesFromGpxFile = (file, callback): void => {\r\n let gpxFeatures = null,\r\n gpxFormat = new GPX(),\r\n reader = new FileReader();\r\n\r\n reader.readAsText(file, \"UTF-8\");\r\n reader.onload = function (fileReader) {\r\n gpxFeatures = gpxFormat.readFeatures(fileReader.target.result, {\r\n dataProjection: 'EPSG:4326',\r\n featureProjection: 'EPSG:3857'\r\n });\r\n\r\n callback.call(file, gpxFeatures);\r\n }\r\n }\r\n\r\n private loadGpx = (file, features): void => {\r\n this.layerSource.addFeatures(features);\r\n\r\n let filename = file.name.replace(/\\.gpx/gi, \"\").replace(/\\s/g, \"_\").replace(/[^\\w]/g, \"\");\r\n let extent = olExtent.createEmpty();\r\n\r\n for (let i = 0; i < features.length; i++) {\r\n olExtent.extend(extent, features[i].getGeometry().getExtent());\r\n }\r\n\r\n this.storeFeaturesAsGeoJson(filename, { features: features, extent: extent });\r\n this.zoomToGpx(filename);\r\n }\r\n\r\n private zoomToGpx = (fileName:string): void => {\r\n let gpxFile: IGpxFile = this.appStorage.getSessionValueFromJson(fileName);\r\n\r\n if (gpxFile) {\r\n this.map.getView().fit(gpxFile.extent, { nearest: false });\r\n }\r\n }\r\n\r\n private storeFeaturesAsGeoJson = (fileName, gpx): void => {\r\n let writer = new GeoJSON();\r\n\r\n //add the file name to each feature\r\n if (gpx.features) {\r\n gpx.features.forEach(function (feature) {\r\n let p = feature.getProperties();\r\n p.filename = fileName;\r\n feature.setProperties(p, true);\r\n });\r\n }\r\n\r\n let geojsonStr = writer.writeFeatures(gpx.features);\r\n let storedFiles = this.appStorage.getSessionValueFromJson(\"GpxFiles\");\r\n if (!storedFiles) {\r\n storedFiles = {};\r\n }\r\n storedFiles[fileName] = this.defaultColour;\r\n //add the file name\r\n this.appStorage.setSessionValue(\"GpxFiles\", JSON.stringify(storedFiles));\r\n //add the geojson & extent\r\n this.appStorage.setSessionValue(fileName, JSON.stringify({ geoJson: geojsonStr, extent: gpx.extent }));\r\n\r\n this.buildGpxUi();\r\n }\r\n\r\n\r\n private buildGpxUi = (): void => {\r\n let self = this;\r\n let container = $(\"#gpxFiles\");\r\n //clear any existing ui\r\n container.empty();\r\n\r\n let fileNames: Array = this.getStoredFileNames();\r\n fileNames.forEach(function (gpx) {\r\n\r\n let dataFileName = \"data-file-name='\" + gpx.filename + \"'\";\r\n\r\n container.append(\"\" +\r\n \"
\" +\r\n \" \" +\r\n \" \" +\r\n \" \" +\r\n \" \" +\r\n \"
\"\r\n );\r\n\r\n $(\"#gpxColour_\" + gpx.filename).on(\"change\", function () {\r\n let colour = $(this).val();\r\n let filename = $(this).data(\"fileName\")\r\n\r\n //console.log(colour + \",\" + filename); \r\n\r\n self.updateGpxColour(filename, colour);\r\n });\r\n });\r\n \r\n const popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"popover\"]'))\r\n const popoverList = popoverTriggerList.map(function (popoverTriggerEl) {\r\n return new Popover(popoverTriggerEl)\r\n })\r\n\r\n $('[data-gpx-action]').on(\"click\", function () {\r\n let action = $(this).data(\"gpxAction\");\r\n if (action === \"delete\") {\r\n self.removeGpxFile($(this).data(\"fileName\"));\r\n }\r\n else if (action === \"zoom\") {\r\n self.zoomToGpx($(this).data(\"fileName\"));\r\n }\r\n });\r\n }\r\n\r\n private updateGpxColour = (filename, colour): void => {\r\n let self = this;\r\n let storedFiles = this.appStorage.getSessionValueFromJson(\"GpxFiles\");\r\n storedFiles[filename] = colour;\r\n\r\n this.layerSource.getFeatures().forEach(function (feature) {\r\n if (feature.get(\"filename\") === filename) {\r\n feature.setStyle(self.getFeatureStyle(colour));\r\n }\r\n });\r\n\r\n //add the file name\r\n this.appStorage.setSessionValue(\"GpxFiles\", JSON.stringify(storedFiles));\r\n }\r\n\r\n private removeGpxFile = (fileName): void => {\r\n //remove geojson from storage\r\n this.appStorage.clearFromSession(fileName);\r\n\r\n let storedFiles = this.appStorage.getSessionValueFromJson(\"GpxFiles\");\r\n delete storedFiles[fileName];\r\n this.appStorage.setSessionValue(\"GpxFiles\", JSON.stringify(storedFiles));\r\n\r\n //now remove all features from that gpx file from the map\r\n let allFeatures = this.layerSource.getFeatures();\r\n allFeatures.forEach(function (feature) {\r\n if (feature.getProperties().fileName === fileName) {\r\n this.layerSource.removeFeature(feature);\r\n }\r\n });\r\n\r\n //rebuild the ui\r\n this.buildGpxUi();\r\n }\r\n\r\n private getStoredFileNames = (): Array => {\r\n let storedFiles = this.appStorage.getSessionValueFromJson(\"GpxFiles\");\r\n if (!storedFiles) {\r\n return new Array();\r\n }\r\n\r\n let fileNames = new Array();\r\n for (let file in storedFiles) {\r\n if (storedFiles.hasOwnProperty(file)) {\r\n fileNames.push({\r\n filename: file,\r\n colour: storedFiles[file]\r\n });\r\n }\r\n }\r\n return fileNames;\r\n }\r\n\r\n}","import olMap from 'ol/Map';\r\nimport { MapContextMenu } from './MapContextMenu';\r\nimport * as olProj from 'ol/proj';\r\nimport * as olExtent from 'ol/extent';\r\nimport { MapBrowserEvent } from 'ol';\r\nimport { Coordinate } from 'ol/coordinate';\r\nimport { OSGB, WGS84 } from 'esdm-gridreference';\r\n\r\n\r\nexport interface ILonLat {\r\n valid: boolean,\r\n lat: number,\r\n lon: number\r\n}\r\n\r\n\r\nexport class MapGridRef {\r\n\r\n private invalidGridRef: HTMLElement; \r\n\r\n public constructor(private map: olMap, private mapContextMenu: MapContextMenu) {\r\n let self = this;\r\n this.invalidGridRef = document.getElementById(\"invalidGridRef\");\r\n\r\n //grid ref\r\n $('#btnGoToGridReference').click(function (event) { \r\n let searchTerm = ($(\"#txtGridRef\").val()).trim();\r\n self.goToGridReference(searchTerm);\r\n });\r\n $(\"#txtGridRef\").on(\"keyup\", function (event) {\r\n event.preventDefault();\r\n if (event.keyCode === 13) {\r\n let searchTerm = ($(\"#txtGridRef\").val()).trim();\r\n self.goToGridReference(searchTerm);\r\n }\r\n });\r\n\r\n //lonlat\r\n $('#btnGoToLonLat').click(function (event) {\r\n let searchTerm = ($(\"#txtLonLat\").val()).trim();\r\n self.goToLonLat(searchTerm);\r\n });\r\n $(\"#txtLonLat\").on(\"keyup\", function (event) {\r\n event.preventDefault();\r\n if (event.keyCode === 13) {\r\n let searchTerm = ($(\"#txtLonLat\").val()).trim();\r\n self.goToLonLat(searchTerm);\r\n }\r\n });\r\n\r\n this.initContextMenu();\r\n }\r\n\r\n\r\n private initContextMenu = (): void => {\r\n let items = [\r\n '-', // this is a separator\r\n {\r\n text: `Get grid reference`,\r\n callback: this.onGetGridReferenceClick\r\n }\r\n ];\r\n\r\n this.mapContextMenu.addItems(items);\r\n }\r\n\r\n private onGetGridReferenceClick = (event: MapBrowserEvent, map: olMap): void => {\r\n //Logger.log(\"onGetGridReferenceClick\");\r\n\r\n if (!$(\"#slide-panel-search\").is(':visible')) {\r\n $(\"#slide-panel-btn-search\").click();\r\n }\r\n $(\"#txtGridRef\").focus();\r\n\r\n let coord27700 = olProj.transform(event.coordinate, 'EPSG:3857', 'EPSG:27700');\r\n $(\"#txtGridRef\").val(this.getGridRef(coord27700));\r\n\r\n let coord4326 = olProj.transform(event.coordinate, 'EPSG:3857', 'EPSG:4326');\r\n $(\"#txtLonLat\").val(`${coord4326[1].toFixed(6)} ${coord4326[0].toFixed(6)}`);\r\n }\r\n\r\n private getLonLat = (searchTerm: string): ILonLat => {\r\n let returnVal: ILonLat = null;\r\n\r\n let parse = function (seperator: string, latLonString: string): ILonLat {\r\n let latlon = latLonString.split(seperator).filter(function (el) {\r\n return el != null;\r\n });\r\n if (latlon.length === 2 && !isNaN((latlon[0])) && !isNaN((latlon[1]))) {\r\n //we have two numbers\r\n return {\r\n valid: true,\r\n lat: (parseFloat(latlon[0])),\r\n lon: (parseFloat(latlon[1]))\r\n\r\n }\r\n } else {\r\n return {\r\n valid: false,\r\n lat: null,\r\n lon: null\r\n }\r\n }\r\n };\r\n\r\n //try splitting by space first\r\n returnVal = parse(\" \", searchTerm);\r\n\r\n if (!returnVal.valid) {\r\n //try comma\r\n returnVal = parse(\",\", searchTerm)\r\n }\r\n\r\n return returnVal\r\n }\r\n\r\n private goToLonLat = (searchTerm: string): void => {\r\n let lonlat: ILonLat = this.getLonLat(searchTerm);\r\n\r\n $(\"#invalidLonlat\").hide();\r\n\r\n let coords27700:Coordinate = olProj.transform([lonlat.lon, lonlat.lat], 'EPSG:4326', 'EPSG:27700');\r\n\r\n if (lonlat.valid) {\r\n //check in uk bounds\r\n let ukBounds:olExtent.Extent = [0, 0, 700000, 1300000];\r\n\r\n if (!olExtent.containsCoordinate(ukBounds, coords27700)) {\r\n lonlat.valid = false;\r\n }\r\n }\r\n\r\n if (!lonlat.valid) {\r\n $(\"#invalidLonlat\").show();\r\n return;\r\n }\r\n\r\n let coords3857:Coordinate = olProj.transform(coords27700, 'EPSG:27700', 'EPSG:3857');\r\n this.map.getView().animate({ center: coords3857 }, { zoom: 14 });\r\n }\r\n\r\n private goToGridReference = (searchTerm: string): void => {\r\n //if (searchTerm.length < 8) {\r\n // invalidGridRef.style.display = 'block';\r\n // return;\r\n //}\r\n\r\n let char: string,\r\n sheet: string,\r\n easting: number = null,\r\n northing: number = null,\r\n eastingStr: string = \"\",\r\n northingStr: string = \"\",\r\n processNorthing: boolean, \r\n coordLen: number,\r\n coords: string,\r\n isValid: boolean = true;\r\n\r\n // use first two chars as sheet\r\n sheet = searchTerm.substring(0, 2);\r\n let patternCheckForTwoLetters: RegExp = new RegExp(\"[A-Za-z]{2}\");\r\n\r\n if (patternCheckForTwoLetters.test(sheet)) {\r\n sheet = sheet.toUpperCase();\r\n //we have a sheet number, so the x/y coords must have the same number of digits\r\n //remove all spaces\r\n coords = searchTerm.replace(/\\s/g, '').substring(2);\r\n\r\n if (coords.length >= 4 && (coords.length % 2 === 0)) {\r\n //we have an even number\r\n coordLen = coords.length / 2;\r\n easting = parseFloat(coords.substring(0, coordLen));\r\n northing = parseFloat(coords.substring(coordLen));\r\n\r\n if (isNaN(easting) || isNaN(northing)) {\r\n //not both numbers\r\n isValid = false;\r\n this.invalidGridRef.style.display = 'block';\r\n return;\r\n }\r\n //all ok we sholud have a sheet number and two coords\r\n eastingStr = coords.substring(0, coordLen);\r\n northingStr = coords.substring(coordLen);\r\n }\r\n else {\r\n //not an even number\r\n isValid = false;\r\n this.invalidGridRef.style.display = 'block';\r\n return;\r\n }\r\n\r\n } else {\r\n //no sheet number, parse the string one character at time use the first non numeric as the seperator\r\n sheet = null;\r\n coords = searchTerm;\r\n\r\n for (let i = 0; i < coords.length; i++) {\r\n char = String.fromCharCode(coords.charCodeAt(i));\r\n\r\n if (!isNaN(parseInt(char))) {\r\n //char is a number\r\n if (!processNorthing) {\r\n eastingStr += char;\r\n\r\n } else {\r\n northingStr += char;\r\n }\r\n\r\n } else {\r\n //char is not a number, so we treat as a seperator, unless we already have a value in the northing in which case this is an error\r\n if (northing !== null) {\r\n isValid = false;\r\n this.invalidGridRef.style.display = 'block';\r\n return;\r\n\r\n } else {\r\n processNorthing = true;\r\n }\r\n }\r\n }\r\n if (isValid && eastingStr.length !== northingStr.length) {\r\n isValid = false;\r\n this.invalidGridRef.style.display = 'block';\r\n return;\r\n }\r\n }\r\n\r\n if (isValid) {\r\n this.centreOnGridRef(sheet, eastingStr, northingStr);\r\n\r\n } else {\r\n this.invalidGridRef.style.display = 'block';\r\n }\r\n }\r\n\r\n private centreOnGridRef = (sheet_number: string, easting: string, northing: string): string => {\r\n let gridRef:string;\r\n\r\n if (sheet_number && easting && northing) {\r\n let E: string = easting;\r\n let N: string = northing;\r\n //E & N must have same no. of chars\r\n let ELen: number = easting.length;\r\n let NLen: number = northing.length;\r\n if (ELen !== NLen) {\r\n //error\r\n this.invalidGridRef.style.display = 'block';\r\n return;\r\n }\r\n else {\r\n //pad to five char with zeros on right\r\n for (let i = 0; i < 5 - ELen; i++) {\r\n E = E + '0';\r\n N = N + '0';\r\n }\r\n let osgb: OSGB = new OSGB();\r\n gridRef = sheet_number + easting + northing;\r\n if (osgb.ParseGridRef(gridRef) === true) {\r\n //console.log('parsed ok');\r\n //console.log(self.map.options.dataProjection);\r\n let center: Coordinate = [osgb.Eastings, osgb.Northings];\r\n\r\n let coords3857: Coordinate = olProj.transform(center, 'EPSG:27700', 'EPSG:3857');\r\n this.map.getView().animate({ center: coords3857 }, { zoom: 14 });\r\n }\r\n else {\r\n this.invalidGridRef.style.display = 'block';\r\n return;\r\n }\r\n }\r\n } else if (!sheet_number && easting && northing) {\r\n //no sheet number just a coordinate pair\r\n let coords: Coordinate = [parseFloat(easting), parseFloat(northing)];\r\n let coords3857: Coordinate = olProj.transform(coords, 'EPSG:27700', 'EPSG:3857');\r\n this.map.getView().animate({ center: coords3857 }, { zoom: 14 });\r\n }\r\n\r\n }\r\n\r\n //function moveTo(easting, northing){\r\n // if (map.getView().getProjection().getCode() !== map.options.dataProjection) {\r\n // let coord = ol.proj.transform([easting, northing], map.options.dataProjection, map.getView().getProjection().getCode());\r\n // easting = coord[0];\r\n // northing = coord[1];\r\n // }\r\n\r\n // map.getView().animate({ center: [easting, northing] });\r\n\r\n // map.contextMenu.addMarker([easting, northing]);\r\n //}\r\n\r\n public getGridRef = (coordinate: Coordinate): string => {\r\n //console.log(coordinate);\r\n let osgb = new OSGB();\r\n osgb.SetGridCoordinates(coordinate[0], coordinate[1]);\r\n return osgb.GetGridRef(4);\r\n }\r\n\r\n public centreMapOnGridRef = (gridRef: string, zoomLevel: number): void =>{\r\n let osgb: OSGB = new OSGB();\r\n if (osgb.ParseGridRef(gridRef)) {\r\n let wgs84:WGS84 = osgb.GetWGS84();\r\n let coord: Coordinate = olProj.transform([wgs84.Longitude, wgs84.Latitude], 'EPSG:4326', 'EPSG:900913');\r\n\r\n this.map.getView().setCenter(coord);\r\n if (zoomLevel) {\r\n this.map.getView().setZoom(zoomLevel);\r\n }\r\n }\r\n }\r\n\r\n public get4326CoordinatesFromGridRef = (gridRef: string): Coordinate => {\r\n let coord4326: Coordinate;\r\n let osgb: OSGB= new OSGB();\r\n\r\n if (osgb.ParseGridRef(gridRef)) {\r\n let wgs84: WGS84 = osgb.GetWGS84();\r\n coord4326 = olProj.transform([wgs84.Longitude, wgs84.Latitude], 'EPSG:4326', 'EPSG:900913');\r\n }\r\n\r\n return coord4326;\r\n }\r\n\r\n public isValidGridRef = (gridRef: string): boolean => {\r\n let osgb:OSGB = new OSGB();\r\n return osgb.ParseGridRef(gridRef);\r\n }\r\n\r\n\r\n\r\n}","import olMap from 'ol/Map';\r\nimport VectorSource from \"ol/source/Vector\";\r\nimport VectorLayer from 'ol/layer/Vector';\r\nimport Style from \"ol/style/Style\";\r\nimport Stroke from \"ol/style/Stroke\";\r\nimport GeoJSON from 'ol/format/GeoJSON';\r\nimport * as olLoadingstrategy from 'ol/loadingstrategy';\r\nimport WKT from 'ol/format/WKT';\r\nimport Projection from \"ol/proj/Projection\";\r\nimport { Extent } from 'ol/extent';\r\nimport { bbox, equalTo, or, and } from 'ol/format/filter';\r\nimport Filter from \"ol/format/filter/Filter\";\r\nimport WFS from 'ol/format/WFS';\r\nimport { Feature } from 'ol';\r\n\r\n\r\n\r\n\r\nexport class MapHighlightFeatures {\r\n\r\n private _highlightOverlay: VectorLayer;\r\n private _parser: GeoJSON;\r\n private _legacyrouteids: Array = [];\r\n private _routeids: Array = [];\r\n private _landregistryids: Array = [];\r\n private _prowcodes: Array = [];\r\n\r\n\r\n public constructor(private _theMap: olMap, private _WfsUrl: string) {\r\n let self = this;\r\n let vectorSource = new VectorSource({\r\n format: new GeoJSON(),\r\n loader: function (extent, resolution, projection) {\r\n self.loader(extent, resolution, projection);\r\n },\r\n strategy: olLoadingstrategy.bbox\r\n });\r\n\r\n this._highlightOverlay = new VectorLayer({\r\n style: new Style({\r\n stroke: new Stroke({\r\n color: 'rgba(26, 255, 22, 1.0)',\r\n width: 4\r\n })\r\n }),\r\n source: vectorSource,\r\n map: this._theMap\r\n });\r\n }\r\n\r\n private loader = (\r\n extent: Extent,\r\n resolution: number,\r\n displayProjection: Projection): void =>\r\n {\r\n this._highlightOverlay.getSource().clear(true);\r\n\r\n if (this._landregistryids.length > 0) {\r\n //loadFeatures(\"LandRegistry\", getFilterString(landregistryids, \"gml_id\", \"LandRegistry\"));\r\n\r\n this._landregistryids.forEach(parcel => {\r\n let wktFormat = new WKT();\r\n let feature = wktFormat.readFeature(parcel.getProperties()[\"wkt\"], {\r\n dataProjection: \"EPSG:27700\",\r\n featureProjection: \"EPSG:3857\"\r\n })\r\n this._highlightOverlay.getSource().addFeature(feature);\r\n });\r\n }\r\n\r\n if (this._routeids.length > 0) {\r\n this.loadFeatures(\"HighlightRoutes\", this.getFilterString(this._routeids, \"RouteID\", \"HighlightRoutes\"));\r\n }\r\n\r\n if (this._legacyrouteids.length > 0) {\r\n this.loadFeatures(\"HighlightLegacyRoutes\", this.getFilterString(this._legacyrouteids, \"LegacyRouteID\", \"HighlightLegacyRoutes\"));\r\n }\r\n\r\n if (this._prowcodes.length > 0) {\r\n this.loadFeatures(\"PROW-Byway\", this.getFilterString(this._prowcodes, \"PROW_Code\", \"PROW-Byway\"));\r\n }\r\n }\r\n\r\n private loadFeatures = (typename: string, filterString: string): void => {\r\n let self = this;\r\n let url: string = `${this._WfsUrl}?VERSION=2.0.0&outputFormat=geojson&SERVICE=WFS&REQUEST=GetFeature&SRSNAME=EPSG:3857&TYPENAME=${typename}&Filter=${filterString}`;\r\n\r\n $.ajax({\r\n url: url,\r\n method: \"GET\"\r\n })\r\n .done(function (response) {\r\n self._parser = new GeoJSON();\r\n let features = self._parser.readFeatures(response);\r\n self._highlightOverlay.getSource().addFeatures(features);\r\n });\r\n }\r\n\r\n\r\n private getFilterString = (ids: Array, paramname: string, typename: string): string => {\r\n let filters: Filter;\r\n\r\n if (ids.length === 1) {\r\n filters = equalTo(paramname, ids[0]);\r\n\r\n } else if (ids.length > 1) {\r\n let t1 = [];\r\n for (let i = 0; i < ids.length; i++) {\r\n t1.push(equalTo(paramname, ids[i] + \" \"));\r\n }\r\n filters = or.apply(this, t1);\r\n }\r\n\r\n let featureRequest: Node = new WFS().writeGetFeature({\r\n srsName: 'EPSG:3857',\r\n featureNS: '',\r\n featurePrefix: '',\r\n featureTypes: [typename],\r\n outputFormat: 'geojson',\r\n filter: filters\r\n });\r\n\r\n let filterStr: string = new XMLSerializer().serializeToString(featureRequest.firstChild.firstChild);\r\n\r\n return encodeURIComponent(filterStr.replace(' xmlns=\"http://www.opengis.net/ogc\"', \"\"));\r\n }\r\n\r\n public clear = () : void => {\r\n this._routeids = [];\r\n this._legacyrouteids = [];\r\n this._landregistryids = [];\r\n this._prowcodes = [];\r\n this._highlightOverlay.getSource().clear(true);\r\n }\r\n\r\n public highlightFeaturesAtEvent = (\r\n evt,\r\n rids: Array,\r\n legacyrids: Array,\r\n landregistrylabels: Array): void =>\r\n {\r\n this._routeids = rids;\r\n this._legacyrouteids = legacyrids;\r\n this._landregistryids = landregistrylabels; \r\n this._highlightOverlay.getSource().refresh(); \r\n }\r\n\r\n}","import { MapViewStore } from \"./MapViewStore\";\r\n\r\nexport class MapSlidePanel {\r\n\r\n private _lastSlidePanelAction: string = \"\";\r\n\r\n public constructor(\r\n private _mapStore: MapViewStore,\r\n private _showOpenPanelByDefault: boolean,\r\n private _rememberActivePanel: boolean,\r\n ) {\r\n this.addSlidingPanelsHandlers();\r\n }\r\n\r\n private addSlidingPanelsHandlers = (): void => {\r\n let self = this;\r\n let lastSlidePanelAction_forScope = self._lastSlidePanelAction;\r\n\r\n let onCloseSlidePanel = function () {\r\n let panel = $('#slide-panel');\r\n $('#slide-panel .content-panel').hide();\r\n\r\n panel.removeClass('visible').animate({\r\n 'margin-left': '-315px'\r\n });\r\n\r\n setTimeout(function () {\r\n $('#slide-content').css(\"opacity\", \"0\");\r\n }, 350);\r\n\r\n lastSlidePanelAction_forScope = null;\r\n self._mapStore.onActivePanelChanged(\"none\");\r\n };\r\n\r\n let onSlidePanelClick = function () {\r\n let panel = $('#slide-panel');\r\n let action = $(this).data(\"action\");\r\n let activeContentPanelId = \"#slide-panel-\" + action;\r\n\r\n if (self._rememberActivePanel === true) {\r\n self._mapStore.onActivePanelChanged(action);\r\n }\r\n\r\n //any action other than 'help'\r\n if (panel.hasClass(\"visible\") && lastSlidePanelAction_forScope === action) {\r\n onCloseSlidePanel();\r\n $(this).blur();\r\n\r\n } else if (!panel.hasClass(\"visible\")) {\r\n //main panel closed\r\n\r\n //close any tooltips open\r\n $(\"[data-bs-toggle='tooltip']\").tooltip('hide');\r\n\r\n panel.addClass('visible').animate({\r\n 'margin-left': '0px'\r\n });\r\n $('#slide-content').css(\"opacity\", \"1\");\r\n }\r\n\r\n if (panel.hasClass(\"visible\")) {\r\n //hide all the content panels and show the correct one\r\n $('#slide-panel .content-panel').hide();\r\n $(activeContentPanelId).show();\r\n\r\n lastSlidePanelAction_forScope = action;\r\n\r\n //we need to initialise the legend maps when the panel is first shown\r\n //if (action === \"overlays\") {\r\n // self.addOverlays();\r\n //}\r\n }\r\n\r\n return false;\r\n };\r\n\r\n $('.slide-panel-button').on('click', onSlidePanelClick);\r\n\r\n //handle close button on sliding panel\r\n $('#slide-panel .fa-times').on('click', () => {\r\n onCloseSlidePanel();\r\n });\r\n\r\n //set initial state for panel\r\n if (self._showOpenPanelByDefault) {\r\n let activePanel = self._mapStore.getMapInfo().activePanel;\r\n if (!activePanel && activePanel != \"none\") {\r\n //show the panel and default to layers\r\n $(\"#slide-panel-btn-overlays\").click();\r\n } else if (activePanel != \"none\") {\r\n $(`#slide-panel-btn-${activePanel}`).click();\r\n }\r\n }\r\n }\r\n}","export class MapViewSettings {\r\n public centre: [number, number];\r\n public zoom: number;\r\n public baselayer: string;\r\n public overlays: Map; \r\n public opacity: number;\r\n public activePanel: string;\r\n public currentTool: string;\r\n public baseLayerSliderPosition: number;\r\n public closePanelOnBaseLayerChange: boolean;\r\n\r\n constructor() {\r\n this.centre = [-163269.4924, 6901652];\r\n this.zoom = 11;\r\n this.baselayer = \"Contoured\";\r\n this.overlays = new Map(); \r\n this.opacity = 1.0;\r\n this.activePanel = null;\r\n this.currentTool = null;\r\n this.baseLayerSliderPosition = null;\r\n this.closePanelOnBaseLayerChange = false;\r\n }\r\n}","import { IAppStorage } from \"./IAppStorage\";\r\nimport OLMap from 'ol/Map';\r\nimport MapEvent from \"ol/MapEvent\";\r\nimport { MapViewSettings } from \"./MapViewSettings\";\r\nimport { AppStorage } from \"./AppStorage\";\r\n\r\n//stores JSON serialised MapInfo object, used to maintain map state across sessions\r\nexport class MapViewStore {\r\n\r\n private initialised: boolean = false;\r\n private storage: IAppStorage;\r\n\r\n constructor(\r\n private storeKey: string\r\n ) {\r\n this.storage = new AppStorage(); \r\n }\r\n\r\n public initMap = (map: OLMap, enableBoundsTracking: boolean): void => {\r\n if (!this.initialised) {\r\n if (enableBoundsTracking) {\r\n\r\n let onMapMoveEnd = (e: MapEvent): void => {\r\n let map: OLMap = e.map;\r\n let contreCoord = map.getView().getCenter();\r\n let m: MapViewSettings = this.getMapInfo();\r\n m.centre = [contreCoord[0], contreCoord[1]];\r\n m.zoom = map.getView().getZoom();\r\n this.saveMapStorage(m);\r\n }\r\n\r\n //remember map extent \r\n map.on('moveend', function (e: MapEvent) {\r\n onMapMoveEnd(e);\r\n });\r\n }\r\n this.initialised = true;\r\n }\r\n }\r\n\r\n public getMapInfo(): MapViewSettings {\r\n let m: MapViewSettings = (this.storage.getValueFromJson(this.storeKey, this.reviver) as MapViewSettings) || new MapViewSettings();\r\n if (!m.baselayer) {\r\n m.baselayer = \"Contoured\";\r\n }\r\n return m;\r\n }\r\n\r\n public isLayerVisible = (name: string, defaultValue: boolean): boolean => {\r\n let m: MapViewSettings = this.getMapInfo();\r\n if (!m.overlays.has(name)) {\r\n m.overlays.set(name, defaultValue);\r\n this.saveMapStorage(m);\r\n }\r\n return m.overlays.get(name);\r\n }\r\n\r\n public onLayerVisibiltyChanged = (name: string, visible: boolean): void => {\r\n let m: MapViewSettings = this.getMapInfo();\r\n m.overlays.set(name, visible);\r\n this.saveMapStorage(m);\r\n }\r\n\r\n public onBaseLayerChanged = (name: string, visible: boolean): void => {\r\n let m: MapViewSettings = this.getMapInfo();\r\n m.baselayer = name;\r\n this.saveMapStorage(m);\r\n }\r\n\r\n public onAutoCloseBaseLayerChanged = (autoclose: boolean): void => {\r\n let m: MapViewSettings = this.getMapInfo();\r\n m.closePanelOnBaseLayerChange = autoclose;\r\n this.saveMapStorage(m);\r\n }\r\n\r\n private saveMapStorage = (mapInfo: MapViewSettings): void => {\r\n this.storage.setValue(this.storeKey, JSON.stringify(mapInfo, this.replacer));\r\n }\r\n\r\n public onOpacityChanged = (opacity: number): void => {\r\n let m: MapViewSettings = this.getMapInfo();\r\n m.opacity = opacity;\r\n this.saveMapStorage(m);\r\n }\r\n\r\n public onActivePanelChanged = (name: string): void => {\r\n let m: MapViewSettings = this.getMapInfo();\r\n m.activePanel = name;\r\n this.saveMapStorage(m);\r\n }\r\n\r\n public onCurrentToolChanged = (name: string): void => {\r\n let m: MapViewSettings = this.getMapInfo();\r\n m.currentTool = name;\r\n this.saveMapStorage(m);\r\n }\r\n\r\n private replacer(key, value): object {\r\n if (value instanceof Map) {\r\n return {\r\n dataType: 'Map',\r\n value: Array.from(value.entries()), // or with spread: value: [...value]\r\n };\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n private reviver(key, value): object {\r\n if (typeof value === 'object' && value !== null) {\r\n //if (value.dataType === 'Map') {\r\n if (key === 'baselayers' || key === 'overlays') {\r\n return new Map(value.value);\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n}","import { MapBrowserEvent, Overlay } from 'ol';\r\nimport { Coordinate } from 'ol/coordinate';\r\nimport ImageLayer from 'ol/layer/Image';\r\nimport Layer from 'ol/layer/Layer';\r\nimport olMap from 'ol/Map';\r\nimport ImageWMS from 'ol/source/ImageWMS';\r\nimport { MapHighlightFeatures } from './MapHighlightFeatures';\r\n\r\n\r\n\r\n\r\nexport class MapFeatureInfo {\r\n\r\n private _overlay: Overlay = null;\r\n private _popupContainer: JQuery = null;\r\n private _popupContent: JQuery = null;\r\n private _popupCloser: JQuery = null;\r\n\r\n public constructor(private _mapHighlightFeatures: MapHighlightFeatures, private _bufferGetFeatureInfo: boolean) {\r\n\r\n }\r\n\r\n public showFeaturesAtEvent = (\r\n map: olMap,\r\n evt: MapBrowserEvent,\r\n callback: Function): void => {\r\n let self = this;\r\n let layerNames: Array = [];\r\n let viewResolution: number = map.getView().getResolution();\r\n let wmsLayer: ImageLayer;\r\n\r\n map.getLayers().forEach(function (lyr: Layer) {\r\n //ignore non visible layers & baselayer\r\n if (lyr instanceof ImageLayer) {\r\n if (lyr.getVisible() && lyr.getProperties().queryable !== false) {\r\n\r\n //lyr.getVisible() is returning true for layers that are not currently visible because of min/max resolution settings \r\n let minRes = lyr.getMaxResolution()\r\n let maxRes = lyr.getMinResolution()\r\n\r\n if (minRes > viewResolution && maxRes <= viewResolution) {\r\n let sourceParams = (lyr.getSource()).getParams();\r\n layerNames.push(sourceParams.LAYERS);\r\n wmsLayer = lyr;\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (layerNames.length > 0) {\r\n\r\n if (this._bufferGetFeatureInfo && viewResolution < 4.804877096575387) {\r\n //constrain the view resolution to get a bigger bbox on the getFeatureInfo call, i.e. act as a buffer so we can get the prow codes\r\n //but only do this for users who have premissions\r\n viewResolution = 4.804877096575387;\r\n }\r\n\r\n let wmsUrl = (wmsLayer.getSource()).getFeatureInfoUrl(\r\n evt.coordinate,\r\n viewResolution,\r\n map.getView().getProjection().getCode(),\r\n {\r\n //'INFO_FORMAT': 'gml'\r\n 'INFO_FORMAT': 'text/html'\r\n }\r\n );\r\n\r\n //https://trailwisetest.esdm.co.uk/wwwroot/mapserver/scripts/mapserv.exe?map=D:\\Websites\\TrailwiseTest\\wwwroot\\MapServer\\map\\trailwise.map&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&FORMAT=image%2Fpng&TRANSPARENT=true&QUERY_LAYERS=BOATLines&LAYERS=BOATLines&INFO_FORMAT=text%2Fhtml&I=113&J=252&WIDTH=256&HEIGHT=256&CRS=EPSG%3A27700&STYLES=&BBOX=360546.875%2C279296.875%2C365625%2C284375\r\n //http://stackoverflow.com/questions/5413899/search-and-replace-specific-query-string-parameter-value-in-javascript\r\n let updateUrlParameter = function (infoUrl, param, value) {\r\n let regex = new RegExp('(&' + param + '=)[^\\&]+');\r\n return infoUrl.replace(regex, '$1' + value);\r\n }\r\n\r\n wmsUrl = updateUrlParameter(wmsUrl, \"QUERY_LAYERS\", layerNames.join());\r\n wmsUrl = updateUrlParameter(wmsUrl, \"LAYERS\", layerNames.join());\r\n\r\n $(\"#mapLoader\").show();\r\n $.get(wmsUrl, function (html) {\r\n //debugger;\r\n //let format = new ol.format.WMSGetFeatureInfo();\r\n //let features = format.readFeatures(html,{ dataProjection: 'EPSG:3857', featureProjection: 'EPSG:3857' });\r\n //let c = 2;\r\n self.showPopup(map, html, evt.coordinate);\r\n }).always(function () {\r\n $(\"#mapLoader\").hide(\"slow\");\r\n callback.call(self);\r\n });\r\n }\r\n }\r\n\r\n private showPopup = (map: olMap, html: string, coordinates: Coordinate): void => {\r\n let self = this;\r\n let mapDiv = $(\"#map\");\r\n\r\n if (self._popupContainer === null) {\r\n self._popupContainer = $(\"
\", { id: \"popup\", class: \"ol-popup\" });\r\n self._popupCloser = $(\"
\", { id: \"popup-closer\", class: \"ol-popup-closer\", href: \"#\" });\r\n self._popupContent = $(\"
\", { id: \"popup-content\", class: \"ol-popup-content\" });\r\n\r\n mapDiv.append(self._popupContainer);\r\n self._popupContainer.append(self._popupCloser);\r\n self._popupContainer.append(self._popupContent);\r\n //Add a click handler to hide the popup.\r\n self._popupCloser.on(\"click\", function () {\r\n //console.log('close clicked');\r\n self._overlay.setPosition(undefined);\r\n self._popupContainer.css(\"display\", \"none\");\r\n self._popupCloser.blur();\r\n self._mapHighlightFeatures.clear();\r\n return false;\r\n });\r\n\r\n }\r\n if (self._overlay === null) {\r\n\r\n self._overlay = new Overlay({\r\n autoPan: true,\r\n element: self._popupContainer[0]\r\n });\r\n map.addOverlay(self._overlay);\r\n }\r\n\r\n if (html) {\r\n self._popupContent.html(html);\r\n\r\n //look for duplicate data-route-id\r\n let ids = new Array();\r\n self._popupContent.find(\"[data-route-id]\").each(function (index, element) {\r\n const id = $(this).data(\"routeId\");\r\n\r\n if (ids.includes(id)) {\r\n $(this).css(\"display\", \"none\");\r\n } else {\r\n ids.push(id);\r\n } \r\n });\r\n\r\n self._popupContainer.css(\"display\", \"block\");\r\n if (coordinates) {\r\n self._overlay.setPosition(coordinates);\r\n }\r\n }\r\n }\r\n\r\n}","import { createEventBus } from \"ts-event-bus\";\r\nimport TrailwiseEvents from \"./TrailwiseEvents\";\r\n\r\nconst TrailwiseEventBus = createEventBus({\r\n events: TrailwiseEvents\r\n});\r\n\r\nexport default TrailwiseEventBus;","import { slot, Slot } from \"ts-event-bus\";\r\nimport Geolocation from 'ol/Geolocation';\r\n\r\nconst TrailwiseEvents = {\r\n trackingStart: slot(),\r\n trackingEnd: slot(),\r\n trackingGeolocationChange: slot()\r\n};\r\n\r\nexport default TrailwiseEvents;","module.exports = bootstrap;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.j = 854;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t854: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk_name_\"] = self[\"webpackChunk_name_\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [216], () => (__webpack_require__(8792)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","AppGeoLocation","map","baseLayer","trackingLocation","previousM","deltaMean","updateViewTriggered","previousPosition","orientateWhilstTracking","didCenterOnLocation","positions","XYZM","init","self","geolocationModal","Modal","document","getElementById","trackingModal","hasTouch","window","navigator","msMaxTouchPoints","addLocationLayer","appStorage","AppStorage","recordGeoLocation","AppRecordGeoLocation","geolocation","tracking","projection","getView","getProjection","trackingOptions","enableHighAccuracy","maximumAge","timeout","markerEl","style","display","marker","Overlay","positioning","CENTER_CENTER","element","stopEvent","on","position","getPosition","heading","getAccuracy","getHeading","speed","getSpeed","m","Date","now","getLength","trackingGeolocationChange","addPosition","coords","getCoordinates","len","length","animate","center","zoom","setCenter","setPosition","removeEventListener","onStartTracking","$","show","hide","removeAttr","onTrackLocation","parent","addClass","event","toggleOptionsDialogue","onModalClose","addEventListener","onLocateMe","attr","prop","setTimeout","adjustCenter","x","y","fCoords","previous","prevHeading","headingDiff","mod","Math","abs","PI","appendCoordinate","setCoordinates","slice","src","updateView","max","c","getCoordinateAtM","getCenterWithHeading","getResolution","setRotation","render","rotation","resolution","height","getSize","sin","cos","showTrackingModal","getValue","trackingStart","setZoom","addOverlay","setTracking","locationLayer","getSource","getFeatures","removeFeature","locateMeFeature","un","trackingEnd","removeOverlay","removeClass","delayInMilliseconds","width","opacity","getCurrentPosition","postitionFeature","error","addFeature","callback","olProj","fromLonLat","longitude","latitude","setGeometry","console","log","code","message","getTrackingOptions","Feature","id","name","setStyle","image","radius","fill","color","stroke","set","setSource","features","setVisible","addLayer","initSimulate","simulationData","simulatePositionChange","accuracy","degToRad","changed","client","XMLHttpRequest","open","onload","JSON","parse","responseText","data","send","coordinates","first","shift","geolocate","radToDeg","rad","deg","n","this","add","prevLoc","location","LocationData","prevCord","currentCord","ls","distanceFromPrevious","push","Array","GeoData","timestamp","getTime","time","getMinutes","toString","getSeconds","getMilliseconds","LocationCoords","altitudeAccuracy","getAltitudeAccuracy","altitude","getAltitude","onTrackingStarted","clearGeoData","onTrackingGeolocationChange","geoLocation","addGeoData","onTrackingEnded","obj","d","setValue","stringify","clear","key","value","_canStore","_store","setSessionValue","_sessionStore","val","getSessionValue","getValueFromJson","reviver","getSessionValueFromJson","setArray","getArray","removeItem","clearFromSession","localStorage","sessionStorage","_ref","_displayName","_layer","addLayerToMap","visibility","visible","getVisible","setOpacity","BaseLayer","BaseLayerType","GetBaseLayerByType","baseLayerType","bingApiKey","esdmApiKey","lyr","BingAerial","BingAerialWithLabels","BingRoad","BingOS","OSM_ESDM_contours","OS_Open_Data","OSOpenData","OSProvisional_1937to1961","OSOneInch_1955To1961","OSOneInch_Hills1885","warn","apiKey","ref","displayName","GetBinglayer","setAttributions","getFullYear","imagerySet","maxZoom","opts","culture","source","url","attributions","urls","params","LAYERS","TILED","FORMAT","extent","transformExtent","preload","Infinity","minZoom","BaseLayerFactory","BingSession","_bingSessionKey","_sessionTimeOut","successCallback","failureCallback","mapContainer","bingMapContainer","append","_bingMapControl","Microsoft","Maps","Map","credentials","Location","mapTypeId","MapTypeId","aerial","getCredentials","sessionId","call","getSessionKey","handleBingSessionRefresh","layer","_olMap","getLayers","forEach","j","get","setMap","mapData","isAuth","wmsurl","bingMapsApiKey","osmApiKey","maxFeatures","isMember","showProw","bingSession","resizeMap","offset","top","olMap","updateSize","loadMap","bingApiOrSessionKey","debounce","MainMap","loadMapWithoutBing","bingSessionKey","loginAlert","defs","_wfsUrl","_osmContouredApiKey","_bingApiOrSessionKey","_loginUrl","_registerUrl","_maxFeatures","_isAuthenticated","_isMember","_bingSession","_showBOATProw","_mapId","_mapStoreID","_initialised","_loadingCount","_OS_extent","_maxUnauthenticatedZoom","_hideRoutesOfNoInterest","_showFavourites","_sketch","_draw","_measureInKm","_selectedBaseLayerRadioId","initBookmarks","twuid","ajax","query","dataType","done","json","wkt","readGeometry","dataProjection","featureProjection","getExtent","_map","fit","nearest","processTwuidResult","fail","getMap","interactions","olInteraction","defaults","altShiftDragRotate","pinchRotate","mouseWheelZoom","extend","PinchZoom","MouseWheelZoom","constrainResolution","target","view","View","setMaxZoom","e","getZoom","setBingOSView","setMapView","mapSettings","_mapStore","getMapInfo","centre","initFavourites","parseInt","_storage","_overlays","updateParams","initRoutesOfNoInterest","addMapControls","_hasTouch","mousePositionControl","coordinateFormat","coordinate","coord27700","transform","osgb","OSGB","SetGridCoordinates","GetGridRef","className","addControl","fs","createElement","setAttribute","label","addBaseLayers","_baseLayerFactory","layers","_OSMContoured","olLayer","_OSOpen","_BingOS","_BingRoad","baselayer","layerGroup","baseMapSet","sublayer","getProperties","each","i","baseRadioClicked","closePanelOnBaseLayerChange","onAutoCloseBaseLayerChanged","rdoVal","currentTarget","onBaseLayerChanged","trigger","index","zoomInt","addOverlays","ck","layerName","defaultChecked","isVisible","isLayerVisible","checked","is","onLayerVisibiltyChanged","queryable","useHideRoutesOfNoInterest","getWmsImageLayer","updateLegendGraphic","VERSION","serverType","ratio","onLayerLoading","onLayerLoaded","wmsSource","img","graphicUrl","getUrl","toolRadioClicked","ele","ev","_contextMenu","deactivate","addMeasureInteraction","removeMeasureInteraction","activate","onCurrentToolChanged","listener","_measureLayer","Draw","type","LINE_STRING","lineDash","addInteraction","createMeasureTooltip","createHelpTooltip","evt","tooltipCoord","feature","getGeometry","output","line","geom","olSphere","round","getLastCoordinate","_measureTooltipElement","innerHTML","_measureTooltip","setOffset","unByKey","removeInteraction","remove","parentNode","removeChild","_helpTooltipElement","handleClick","_mapFeatureInfo","showFeaturesAtEvent","_mapHighlight","highlightFeaturesAtEvent","htmlForLoginRegisterPrompt","htmlForNonMemberPrompt","handlePointerMove","dragging","helpMsg","_helpTooltip","classList","CENTER_LEFT","BOTTOM_CENTER","autoPan","autoPanMargin","checkAuthStatus","response","reload","err","register","querySelectorAll","tooltipTriggerEl","Tooltip","MapViewStore","_mapSlidePanel","MapSlidePanel","initMap","getViewport","MapHighlightFeatures","MapFeatureInfo","MapContextMenu","toolRadios","getElementsByName","currentMapState","currentTool","click","setInterval","_mapGazetteer","MapGazetteer","_geoLocation","_mapGpx","MapGpx","_mapGridRef","MapGridRef","iconUrl","_vectorLayer","_items","text","centerMap","openGoogleMaps","ContextMenu","defaultItems","items","getTargetElement","getBoundingClientRect","left","elementsFromPoint","pixel","some","disable","getDefaultItems","forEachFeatureAtPixel","ft","l","_removeMarkerItem","addItems","concat","coord4326","encodeURI","enable","baseUrl","twuuidApiUrl","searchResults","resultsSelectId","searchBoxId","searchBtnId","searchTwuidBoxId","searchTwuidBtnId","addVectorLayer","vectorSource","vectorLayer","hideSearchResultBox","resultsSelect","empty","addHandlers","keyup","t","next","toggle","Boolean","complete","prev","focus","clearMarker","change","showOnMap","search","keypress","which","keyCode","searchTwuid","trim","searchTerm","test","findPostcode","findLocation","findTwuid","find","processSearchResult","zoomLevel","showTwuidNoResults","showNoResultsOnTwuidFail","jqXHR","textStatus","errorThrown","showNoResults","alertOnFail","alert","showNoResultsOnFail","dataObj","seachUrl","successFunction","failFunction","point","points","queryFromHeader","header","toLowerCase","resultIds","results","item","GAZETTEER_ENTRY","LOCAL_TYPE","Name","POPULATED_PLACE","PostalCode","NAME1","County","COUNTY_UNITARY","Longitude","GEOMETRY_X","Latitude","GEOMETRY_Y","Region","REGION","ZoomLevel","replace","indexOf","ID","Name2","NAME2","sort","a","b","namea","nameb","coord","parseFloat","coord3857","ddl","addMarker","iconStyle","anchor","anchorXUnits","FRACTION","anchorYUnits","geometry","defaultColour","addFeatureLayer","layerSource","featureLayer","getFeatureStyle","darkStrokeColour","lineDashOffset","addGpxFileInputHandler","files","f","file","getFeaturesFromGpxFile","loadGpx","addDragDropInteraction","dragAndDropInteraction","DragAndDrop","formatConstructors","onDragDropAddFeatures","addRemoveAllHandler","getStoredFileNames","filename","buildGpxUi","loadFromStorage","geoJsonformat","geoJsonStr","readFeatures","geoJson","colour","addFeatures","gpxFeatures","gpxFormat","reader","FileReader","readAsText","fileReader","result","olExtent","createEmpty","storeFeaturesAsGeoJson","zoomToGpx","fileName","gpxFile","gpx","writer","p","setProperties","geojsonStr","writeFeatures","storedFiles","container","dataFileName","updateGpxColour","popoverTriggerEl","Popover","action","removeGpxFile","fileNames","hasOwnProperty","mapContextMenu","initContextMenu","onGetGridReferenceClick","getGridRef","toFixed","getLonLat","returnVal","seperator","latLonString","latlon","split","filter","el","isNaN","valid","lat","lon","goToLonLat","lonlat","coords27700","containsCoordinate","coords3857","goToGridReference","char","sheet","processNorthing","coordLen","easting","northing","eastingStr","northingStr","isValid","substring","RegExp","toUpperCase","invalidGridRef","String","fromCharCode","charCodeAt","centreOnGridRef","sheet_number","gridRef","ELen","ParseGridRef","Eastings","Northings","centreMapOnGridRef","wgs84","GetWGS84","get4326CoordinatesFromGridRef","isValidGridRef","preventDefault","_theMap","_WfsUrl","_legacyrouteids","_routeids","_landregistryids","_prowcodes","loader","displayProjection","_highlightOverlay","parcel","readFeature","loadFeatures","getFilterString","typename","filterString","method","_parser","ids","paramname","filters","equalTo","t1","or","apply","featureRequest","writeGetFeature","srsName","featureNS","featurePrefix","featureTypes","outputFormat","filterStr","XMLSerializer","serializeToString","firstChild","encodeURIComponent","rids","legacyrids","landregistrylabels","refresh","format","strategy","olLoadingstrategy","bbox","_showOpenPanelByDefault","_rememberActivePanel","_lastSlidePanelAction","addSlidingPanelsHandlers","lastSlidePanelAction_forScope","onCloseSlidePanel","panel","css","onActivePanelChanged","activeContentPanelId","hasClass","blur","tooltip","activePanel","MapViewSettings","overlays","baseLayerSliderPosition","storeKey","initialised","enableBoundsTracking","contreCoord","getCenter","saveMapStorage","defaultValue","has","autoclose","mapInfo","storage","replacer","onOpacityChanged","from","entries","_mapHighlightFeatures","_bufferGetFeatureInfo","_overlay","_popupContainer","_popupContent","_popupCloser","wmsLayer","layerNames","viewResolution","minRes","getMaxResolution","maxRes","getMinResolution","sourceParams","getParams","wmsUrl","getFeatureInfoUrl","getCode","updateUrlParameter","infoUrl","param","regex","join","html","showPopup","always","mapDiv","class","href","undefined","includes","TrailwiseEventBus","createEventBus","events","TrailwiseEvents","slot","module","exports","bootstrap","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","fulfilled","Object","keys","every","splice","r","getter","__esModule","definition","o","defineProperty","enumerable","prototype","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","bind","__webpack_exports__"],"sourceRoot":""}