and activar iphone ios geolocation xamarin.ios mkcoordinatespan

iphone - activar - ¿MKCoordinateSpan en metros?



nfc iphone 8 (3)

A menos que necesite una gran precisión, puede hacerlo mucho más fácil con la aproximación. El primer problema es encontrar la fracción de un grado de latitud que representa 500 metros. Fácil ya que un grado de latitud es una constante en cualquier ubicación, aproximadamente 111 km. Entonces 500 metros es latitud .0045 grados.

Entonces se vuelve más difícil porque la longitud de un grado de longitud varía dependiendo de dónde se encuentre. Se puede aproximar con

donde alfa es el radio ecuatorial de la Tierra, 6,378,137 km, b / a es 0.99664719 (una constante en uso para el modelo esferoide WGC84 en uso por todos los dispositivos GPS) y donde phi es el grado de latitud.

Imagina por un segundo que tienes la suerte de estar en Melbourne con una longitud de 37.783 grados S. El Norte o el Sur no importa aquí. La versión beta es de 37.6899 y el resto se resuelve para dar un grado longitudinal de 88 km. Entonces 500 metros es .0057 de un grado.

Resultado para Melbourne - MKCoordinateSpan melbourne500MeterSpan = MKCoordinateSpanMake(.0045, .0057);

Puede verificar sus respuestas y su código con esta calculadora en línea

El artículo de wiki sobre la longitud tiene muchos más detalles sobre esto (y es la fuente de las imágenes aquí)

Código:

#define EARTH_EQUATORIAL_RADIUS (6378137.0) #define WGS84_CONSTANT (0.99664719) #define degreesToRadians(x) (M_PI * (x) / 180.0) // accepts decimal degrees. Convert from HMS first if that''s what you have double spanOfMetersAtDegreeLongitude(double degrees, double meters) { double tanDegrees = tanf(degreesToRadians(degrees)); double beta = tanDegrees * WGS84_CONSTANT; double lengthOfDegree = cos(atan(beta)) * EARTH_EQUATORIAL_RADIUS * M_PI / 180.0; double measuresInDegreeLength = lengthOfDegree / meters; return 1.0 / measuresInDegreeLength; }

Necesito crear un MKCoordinateSpan que esté a unos 500 metros.

¿Cómo calculo los valores para pasar al constructor MKCoordinateSpan ?

Las respuestas en cualquier lenguaje de programación (Obj-C, .Net) están bien.


En MonoTouch, luego, utilizando esta solución, puede usar este método auxiliar:

public static void ZoomToCoordinateAndCenter (MKMapView mapView, CLLocationCoordinate2D coordinate, double meters, bool showUserLocationToo, bool animate) { if (!coordinate.IsValid ()) return; mapView.SetCenterCoordinate (coordinate, animate); mapView.SetRegion (MKCoordinateRegion.FromDistance (coordinate, meters, meters), animate); }


Otra alternativa es usar la función MKCoordinateRegionMakeWithDistance de MKCoordinateRegionMakeWithDistance :

MKCoordinateRegion rgn = MKCoordinateRegionMakeWithDistance( CLLocationCoordinate2DMake(someLatitude, someLongitude), 500, 500);

El MKCoordinateSpan estará en rgn.span .