| 
									
										
										
										
											2020-06-28 02:42:22 +02:00
										 |  |  |  | /** | 
					
						
							|  |  |  |  |  * Leaflet.AccuratePosition aims to provide an accurate device location when simply calling map.locate() doesn’t. | 
					
						
							|  |  |  |  |  * https://github.com/m165437/Leaflet.AccuratePosition
 | 
					
						
							|  |  |  |  |  * | 
					
						
							|  |  |  |  |  * Greg Wilson's getAccurateCurrentPosition() forked to be a Leaflet plugin | 
					
						
							|  |  |  |  |  * https://github.com/gwilson/getAccurateCurrentPosition
 | 
					
						
							|  |  |  |  |  * | 
					
						
							|  |  |  |  |  * Copyright (C) 2013 Greg Wilson, 2014 Michael Schmidt-Voigt | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | L.Map.include({ | 
					
						
							|  |  |  |  |     _defaultAccuratePositionOptions: { | 
					
						
							|  |  |  |  |         maxWait: 10000, | 
					
						
							|  |  |  |  |         desiredAccuracy: 20 | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     findAccuratePosition: function (options) { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         if (!navigator.geolocation) { | 
					
						
							|  |  |  |  |             this._handleAccuratePositionError({ | 
					
						
							|  |  |  |  |                 code: 0, | 
					
						
							|  |  |  |  |                 message: 'Geolocation not supported.' | 
					
						
							|  |  |  |  |             }); | 
					
						
							|  |  |  |  |             return this; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         this._accuratePositionEventCount = 0; | 
					
						
							|  |  |  |  |         this._accuratePositionOptions = L.extend(this._defaultAccuratePositionOptions, options); | 
					
						
							|  |  |  |  |         this._accuratePositionOptions.enableHighAccuracy = true; | 
					
						
							|  |  |  |  |         this._accuratePositionOptions.maximumAge = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         if (!this._accuratePositionOptions.timeout) | 
					
						
							|  |  |  |  |             this._accuratePositionOptions.timeout = this._accuratePositionOptions.maxWait; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         var onResponse = L.bind(this._checkAccuratePosition, this), | 
					
						
							|  |  |  |  |             onError = L.bind(this._handleAccuratePositionError, this), | 
					
						
							|  |  |  |  |             onTimeout = L.bind(this._handleAccuratePositionTimeout, this); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         this._accuratePositionWatchId = navigator.geolocation.watchPosition( | 
					
						
							|  |  |  |  |             onResponse, | 
					
						
							|  |  |  |  |             onError, | 
					
						
							|  |  |  |  |             this._accuratePositionOptions); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         this._accuratePositionTimerId = setTimeout( | 
					
						
							|  |  |  |  |             onTimeout, | 
					
						
							|  |  |  |  |             this._accuratePositionOptions.maxWait); | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     _handleAccuratePositionTimeout: function() { | 
					
						
							|  |  |  |  |         navigator.geolocation.clearWatch(this._accuratePositionWatchId); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         if (typeof this._lastCheckedAccuratePosition !== 'undefined') { | 
					
						
							|  |  |  |  |             this._handleAccuratePositionResponse(this._lastCheckedAccuratePosition); | 
					
						
							|  |  |  |  |         } else { | 
					
						
							|  |  |  |  |             this._handleAccuratePositionError({ | 
					
						
							|  |  |  |  |                 code: 3, | 
					
						
							|  |  |  |  |                 message: 'Timeout expired' | 
					
						
							|  |  |  |  |             }); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         return this; | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     _cleanUpAccuratePositioning: function () { | 
					
						
							|  |  |  |  |         clearTimeout(this._accuratePositionTimerId); | 
					
						
							|  |  |  |  |         navigator.geolocation.clearWatch(this._accuratePositionWatchId); | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     _checkAccuratePosition: function (pos) { | 
					
						
							|  |  |  |  |         var accuracyReached = pos.coords.accuracy <= this._accuratePositionOptions.desiredAccuracy; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         this._lastCheckedAccuratePosition = pos; | 
					
						
							|  |  |  |  |         this._accuratePositionEventCount = this._accuratePositionEventCount + 1; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         if (accuracyReached && (this._accuratePositionEventCount > 1)) { | 
					
						
							|  |  |  |  |             this._cleanUpAccuratePositioning(); | 
					
						
							|  |  |  |  |             this._handleAccuratePositionResponse(pos); | 
					
						
							|  |  |  |  |         } else { | 
					
						
							|  |  |  |  |             this._handleAccuratePositionProgress(pos); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     _prepareAccuratePositionData: function (pos) { | 
					
						
							|  |  |  |  |         var lat = pos.coords.latitude, | 
					
						
							|  |  |  |  |             lng = pos.coords.longitude, | 
					
						
							|  |  |  |  |             latlng = new L.LatLng(lat, lng), | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             latAccuracy = 180 * pos.coords.accuracy / 40075017, | 
					
						
							|  |  |  |  |             lngAccuracy = latAccuracy / Math.cos(Math.PI / 180 * lat), | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             bounds = L.latLngBounds( | 
					
						
							|  |  |  |  |                 [lat - latAccuracy, lng - lngAccuracy], | 
					
						
							|  |  |  |  |                 [lat + latAccuracy, lng + lngAccuracy]); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         var data = { | 
					
						
							|  |  |  |  |             latlng: latlng, | 
					
						
							|  |  |  |  |             bounds: bounds, | 
					
						
							|  |  |  |  |             timestamp: pos.timestamp | 
					
						
							|  |  |  |  |         }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         for (var i in pos.coords) { | 
					
						
							|  |  |  |  |             if (typeof pos.coords[i] === 'number') { | 
					
						
							|  |  |  |  |                 data[i] = pos.coords[i]; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         return data; | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     _handleAccuratePositionProgress: function (pos) { | 
					
						
							|  |  |  |  |         var data = this._prepareAccuratePositionData(pos); | 
					
						
							|  |  |  |  |         this.fire('accuratepositionprogress', data); | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     _handleAccuratePositionResponse: function (pos) { | 
					
						
							|  |  |  |  |         var data = this._prepareAccuratePositionData(pos); | 
					
						
							|  |  |  |  |         this.fire('accuratepositionfound', data); | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     _handleAccuratePositionError: function (error) { | 
					
						
							|  |  |  |  |         var c = error.code, | 
					
						
							|  |  |  |  |             message = error.message || | 
					
						
							|  |  |  |  |                 (c === 1 ? 'permission denied' : | 
					
						
							|  |  |  |  |                     (c === 2 ? 'position unavailable' : 'timeout')); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         this._cleanUpAccuratePositioning(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         this.fire('accuratepositionerror', { | 
					
						
							|  |  |  |  |             code: c, | 
					
						
							|  |  |  |  |             message: 'Geolocation error: ' + message + '.' | 
					
						
							|  |  |  |  |         }); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | }); | 
					
						
							| 
									
										
										
										
											2020-06-28 23:33:48 +02:00
										 |  |  |  | console.log("Find accurate position script loaded"); |