Подтвердить что ты не робот

MKCoordinateSpan в метрах?

Мне нужно создать MKCoordinateSpan, что составляет около 500 метров.

Как мне рассчитать значения, которые нужно передать в конструктор MKCoordinateSpan?

Ответы на любом языке программирования (Obj-C,.Net) в порядке.

4b9b3361

Ответ 1

Другой альтернативой является использование функции MapKit MKCoordinateRegionMakeWithDistance:

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

MKCoordinateSpan будет находиться в rgn.span.

Ответ 2

Если вам не нужна большая точность, вы можете сделать это намного проще с приближением. Первая проблема заключается в том, чтобы найти долю степени широты, составляющую 500 метров. Легко, так как степень широты постоянна в любом месте, примерно 111 км. Таким образом, 500 метров составляет .0045 градусов.

Тогда это становится сложнее, потому что длина градуса долготы изменяется в зависимости от того, где вы находитесь. Его можно аппроксимировать с помощью

enter image description here

где альфа - экваториальный радиус Земли, 6,378,137 км, b/a - 0,99664719 (постоянная, используемая для сфероидной модели WGC84, используемой всеми устройствами GPS) и enter image description here, где phi - степень широты.

Представьте себе, что вам посчастливилось оказаться в Мельбурне с долготой 37.783 градуса S. Север или Юг здесь неважно. бета составляет 37,6899, а остальная часть решает увеличить длину в 88 км. Так что 500 метров - 0,0057 градуса.

Результат для Мельбурна - MKCoordinateSpan melbourne500MeterSpan = MKCoordinateSpanMake(.0045, .0057);

Вы можете проверить свои ответы и свой код с помощью этого онлайн-калькулятора

статья wiki о долготе имеет намного больше информации об этом (и это источник изображений здесь)

код:

#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 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;
}

Ответ 3

В MonoTouch, используя это решение, вы можете использовать этот вспомогательный метод:

    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);      
    }