MKCoordinateSpan en Metros?

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

¿Cómo puedo calcular los valores de pasar a la MKCoordinateSpan constructor?

Respuestas en cualquier tipo de programación (Obj-C, .Net) idioma están bien.

InformationsquelleAutor Ian Vink | 2011-09-11

3 Kommentare

  1. 95

    Otra alternativa es el uso de MapKit del MKCoordinateRegionMakeWithDistance función:

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

    La MKCoordinateSpan será en rgn.span.

    • +1, que es la manera más fácil – no sabía acerca de que uno!
  2. 39

    A menos que usted necesita gran precisión que puede hacer que sea mucho más fácil con la aproximación. El primer problema es encontrar la fracción de un grado de latitud que representan a 500 metros. Fácil, ya que un grado de latitud es una constante en cualquier ubicación, aproximadamente a 111 km. Así que a 500 metros es .0045 grados de latitud.

    A continuación, se hace más difícil debido a la longitud de un grado de longitud varía dependiendo de donde usted está. Puede ser aproximada con

    MKCoordinateSpan en Metros?

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

    Imagine por un segundo que usted tiene la suerte de estar en Melbourne con una longitud de 37.783 grados S. Norte o Sur, no importa aquí. beta funciona a ser 37.6899 y el resto de los que resuelve dar longitudinal grado una longitud de 88km. Así que a 500 metros es .0057 de un grado.

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

    Usted puede comprobar sus respuestas y su código con esta calculadora en línea

    La artículo de wiki en la longitud tiene mucho más detalle 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;
    }
    • Por favor, no use esta respuesta. Como gratificante como lo es para conseguir los puntos, MKCoordinateRegionMakeWithDistance es el camino correcto.
  3. -2

    De MonoTouch, entonces el uso de esta solución se puede utilizar 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);      
        }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea