Масштаб MKMapView, чтобы соответствовать полилинии и аннотации булавки - Горизонтальная ориентация

У меня есть приложение для iOS с представлением, которое содержит несколько разных меток плюс небольшой MKMapView.

На виде карты я нарисовал маршрут поездки (используя ломаную линию) и добавил два булавки для комментариев: один в начале маршрута, а другой в конце маршрута.

Все, что я пытаюсь сделать, это изменить масштаб карты / поворот, чтобы ломаная линия и два штифта аннотации соответствовали размеру вида карты. Однако все, что я попробовал, провалилось.

Мой подход

1) Добавьте полилинию к виду карты.

2) Использование setVisibleMapRect настроить вид карты так, чтобы полилиния вписалась в карту. (Я также добавил некоторые отступы, используя параметр Edge Ints).

3) Использование MKMapCamera изменить поворот карты, чтобы полилинии + штифты были представлены в горизонтальном направлении.

Вот мой код:

// Convert the preview string to a
// MKPolyline map direction object.
MKPolyline *map_data = [self polyline_with_encoded_string:[trip preview]];

// Add the polyline to the map view.
[main_map addOverlay:map_data];

// Set the display area around the polyline.
[main_map setVisibleMapRect:[map_data boundingMapRect] edgePadding:UIEdgeInsetsMake(28.0, 28.0, 28.0, 28.0) animated:YES];

// Calculate the current clockwise degree.
double degree = [self calculate_bearing_angle:[trip.startPoint latitude] :[trip.startPoint longitude] :[trip.stopPoint latitude] :[trip.stopPoint longitude]];

// Change the degree to the approriate
// trip polyline degree (anti-clockwise).

if ((degree >= 0) && (degree <= 90)) {
    degree = (270 + degree);
}

else if ((degree > 90) && (degree <= 180)) {
    degree = (270 - (degree - 90));
}

else if ((degree > 180) && (degree <= 270)) {
    degree = (360 - (degree - 180));
}

else if ((degree > 270) && (degree <= 360)) {
    degree = (90 + degree);
}

// Rotate the map so that the trip polyline
// fits horizontally rather than vertically.
MKMapCamera *map_camera = [[main_map camera] copy];
[map_camera setHeading:degree];
[main_map setCamera:map_camera animated:YES];

Я использую следующий метод, чтобы выяснить угол полилинии:

-(double)calculate_bearing_angle:(double)start_lat :(double)start_lon :(double)end_lat :(double)end_lon {

    // Get the seperate latitude/longitude values.
    double from_lat = DEGREES_TO_RADIANS(start_lat);
    double from_lon = DEGREES_TO_RADIANS(start_lon);
    double to_lat = DEGREES_TO_RADIANS(end_lat);
    double to_lon = DEGREES_TO_RADIANS(end_lon);

    // Calculate the bearing angle.
    double degree = RADIANS_TO_DEGREES(atan2(sin(to_lon - from_lon) * cos(to_lat), cos(from_lat) * sin(to_lat) - sin(from_lat) * cos(to_lat) * cos(to_lon - from_lon)));

    if (degree >= 0) {
        return degree;
    }

    else {
        return (360 + degree);
    }
}

Я перепробовал все, но в любом случае конечный результат заключается в том, что некоторые полилинии под определенными углами повернуты на правильный горизонтальный угол, а другие нет... Что, черт возьми, я делаю неправильно? Или есть лучший встроенный подход к этой проблеме?

Все, что я хочу сделать, это изменить это:

... к этому:

1 ответ

Решение

Я работал над вашей проблемой, для меня этот метод [[self.map camera] setHeading:90.f]; работает как задумано, поэтому, возможно, ваша проблема заключается в расчете радиан и последнем процессе, но, возможно, ваша проблема также связана с копией камеры. Я использую этот метод прямо на камеру карты и прекрасно работает. Я надеюсь, это поможет вам

Другие вопросы по тегам