public PositionEventArgs (Position position) { if (position == null) throw new ArgumentNullException ("position"); Position = position; }
/// <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); }
/// <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; }
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); }
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; }
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, }); }
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(); }
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)); }
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)); }
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); } }
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); } }