Ejemplo n.º 1
0
		public PositionEventArgs (Position position)
		{
			if (position == null)
				throw new ArgumentNullException ("position");

			Position = position;
		}
Ejemplo n.º 2
0
		/// <summary>
		/// Calculates bearing between start and stop.
		/// </summary>
		/// <returns>The <see cref="System.Double"/>.</returns>
		/// <param name="start">Start coordinates.</param>
		/// <param name="stop">Stop coordinates.</param>
		public static double BearingFrom(this Position start, Position stop)
		{
			var deltaLon = stop.Longitude - start.Longitude;
			var cosStop = Math.Cos(stop.Latitude);
			return Math.Atan2(
				(Math.Cos(start.Latitude) * Math.Sin(stop.Latitude)) -
				(Math.Sin(start.Latitude) * cosStop * Math.Cos(deltaLon)),
				Math.Sin(deltaLon) * cosStop);
		}
Ejemplo n.º 3
0
		/// <summary>
		/// Calculates distance between two locations.
		/// </summary>
		/// <returns>The <see cref="System.Double"/>The distance in meters</returns>
		/// <param name="a">Location a</param>
		/// <param name="b">Location b</param>
		public static double DistanceFrom(this Position a, Position b)
		{
			double distance = Math.Acos(
				(Math.Sin(a.Latitude) * Math.Sin(b.Latitude)) +
				(Math.Cos(a.Latitude) * Math.Cos(b.Latitude))
				* Math.Cos(b.Longitude - a.Longitude));

			return EquatorRadius * distance;
		}
Ejemplo n.º 4
0
		public void StartRouting(string name, Position pos) 
		{
			// TODO: Conversion from lat/lon to string should be on all devices with point "." instead of ","
			string uri = String.Format("google.navigation:q={0},{1}({2})", pos.Latitude.ToString().Replace(",", "."), pos.Longitude.ToString().Replace(",", "."), name);

			Intent intent = new Intent(Intent.ActionView, global::Android.Net.Uri.Parse("google.navigation:q=0,0"));

			// Do we have a navigation app?
			if (intent.ResolveActivity(Forms.Context.PackageManager) == null)
				return;

			Forms.Context.StartActivity(intent);
		}
Ejemplo n.º 5
0
		public Position (Position position)
		{
			if (position == null)
				throw new ArgumentNullException ("position");

			Timestamp = position.Timestamp;
			Latitude = position.Latitude;
			Longitude = position.Longitude;
			Altitude = position.Altitude;
			AltitudeAccuracy = position.AltitudeAccuracy;
			Accuracy = position.Accuracy;
			Heading = position.Heading;
			Speed = position.Speed;
		}
Ejemplo n.º 6
0
		public void StartRouting(string name, Position pos) 
		{
			CLLocationCoordinate2D coordinate = new CLLocationCoordinate2D(pos.Latitude, pos.Longitude);
			MKMapItem mapItemCartridgeLocation = new MKMapItem (new MKPlacemark (coordinate, (NSDictionary)null)) {
				Name = name,
			};

			// Current location
			MKMapItem mapItemCurrentLocation = MKMapItem.MapItemForCurrentLocation ();

			// Set coordinates from/to
			var mapItems = new MKMapItem[] { mapItemCurrentLocation, mapItemCartridgeLocation };

			// Call map to open with mode driving. Could also be Walking
			MKMapItem.OpenMaps (mapItems, new MKLaunchOptions () { DirectionsMode = MKDirectionsMode.Driving, });
		}
Ejemplo n.º 7
0
		private void UpdatePosition (CLLocation location)
		{
			Position p = (this._position == null) ? new Position () : new Position (this._position);

			if (location.HorizontalAccuracy > -1)
			{
				p.Accuracy = location.HorizontalAccuracy;
				p.Latitude = location.Coordinate.Latitude;
				p.Longitude = location.Coordinate.Longitude;
			}

			if (location.VerticalAccuracy > -1)
			{
				p.Altitude = location.Altitude;
				p.AltitudeAccuracy = location.VerticalAccuracy;
			}

			if (location.Speed > -1)
				p.Speed = location.Speed;

			p.Timestamp = new DateTimeOffset (location.Timestamp.ToDateTime());

			this._position = p;

			OnPositionChanged (new PositionEventArgs (p));

			location.Dispose();
		}
Ejemplo n.º 8
0
		private void OnUpdatedHeading (object sender, CLHeadingUpdatedEventArgs e)
		{
			if (e.NewHeading.MagneticHeading == -1)
				return;

			Position p = (this._position == null) ? new Position () : new Position (this._position);

			// If HeadingAccuracy is below 0, than the heading is invalid
			if (e.NewHeading.HeadingAccuracy < 0)
				return;

			var newHeading = e.NewHeading.MagneticHeading;

			p.Heading = CheckDeviceOrientationForHeading(newHeading);

			this._position = p;

			OnHeadingChanged (new PositionEventArgs (p));
		}
Ejemplo n.º 9
0
		public void OnLocationChanged (Location location)
		{
			if (location.Provider != this._activeProvider)
			{
				if (this._activeProvider != null && this._locManager.IsProviderEnabled (this._activeProvider))
				{
					LocationProvider pr = this._locManager.GetProvider (location.Provider);
					TimeSpan lapsed = GetTimeSpan (location.Time) - GetTimeSpan (this._lastLocation.Time);
					if (pr.Accuracy > this._locManager.GetProvider (this._activeProvider).Accuracy
						&& lapsed < _timePeriod.Add (_timePeriod))
					{
						location.Dispose();
						return;
					}
				}
				this._activeProvider = location.Provider;
			}
			var previous = Interlocked.Exchange (ref this._lastLocation, location);

			if (previous != null)
				previous.Dispose();

			var p = new Position();

			if (location.HasAccuracy)
				p.Accuracy = location.Accuracy;

			if (location.HasAltitude)
				p.Altitude = location.Altitude;

			if (location.HasBearing) {
				p.Heading = location.Bearing;
				_lastGPSAzimuth = location.Bearing;
			}

			if (location.HasSpeed)
				p.Speed = location.Speed;

			p.Longitude = location.Longitude;
			p.Latitude = location.Latitude;
			p.Timestamp = Geolocator.GetTimestamp (location);

			var changed = PositionChanged;

			if (changed != null)
				changed (this, new PositionEventArgs (p));
		}
Ejemplo n.º 10
0
		private void OnPositionChanged(object sender, PositionEventArgs e)
		{
			// Ignore anything that might come in afterwards
			if (!IsListening)
				return;

			lock (_positionSync)
			{
				_lastPosition = e.Position;

				EventHandler<PositionEventArgs> changed = PositionChanged;

				if (changed != null)
					changed(this, e);
			}
		}
Ejemplo n.º 11
0
		public void StartListening(uint minTime, double minDistance, bool includeHeading)
		{
			// Get last known position from settings
			_lastPosition = _lastPosition ?? new Position();

			_lastPosition.Latitude = Settings.Current.GetValueOrDefault<double>(Settings.LastKnownPositionLatitudeKey);
			_lastPosition.Longitude = Settings.Current.GetValueOrDefault<double>(Settings.LastKnownPositionLongitudeKey);
			_lastPosition.Altitude = Settings.Current.GetValueOrDefault<double>(Settings.LastKnownPositionAltitudeKey);

			if (minTime < 0)
				throw new ArgumentOutOfRangeException("minTime");
			if (minDistance < 0)
				throw new ArgumentOutOfRangeException("minDistance");

			if (IsListening)
			{
				return;
			}

			_listener = new GeolocationListener(_locManager, TimeSpan.FromMilliseconds(minTime), _providers);
			_listener.PositionChanged += OnPositionChanged;
			_listener.PositionError += OnPositionError;
			Looper looper = Looper.MyLooper() ?? Looper.MainLooper;
			for (int i = 0; i < _providers.Length; ++i)
				_locManager.RequestLocationUpdates(_providers[i], minTime, (float) minDistance, _listener, looper);

			// Add orientation event listener
			if (includeHeading) {
				_listener.OrientationChanged += OnHeadingChanged;

				_orientationSensor = _sensorManager.GetDefaultSensor(SensorType.Orientation);
				_accelerometerSensor = _sensorManager.GetDefaultSensor(SensorType.Accelerometer);

				_sensorManager.RegisterListener(_listener, _orientationSensor, SensorDelay.Ui);
				_sensorManager.RegisterListener(_listener, _accelerometerSensor, SensorDelay.Ui);
			}
		}