Увеличить MKMapView, чтобы он соответствовал полилинии и аннотационным булавкам — горизонтальная ориентация

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

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

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

Мой подход

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

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

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

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

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

введите здесь описание изображения

... к этому:

введите здесь описание изображения


person Supertecnoboff    schedule 10.03.2017    source источник
comment
почему вы передаете широту DEGREES_TO_RADIANS?   -  person Reinier Melian    schedule 10.03.2017


Ответы (1)


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

person Reinier Melian    schedule 10.03.2017
comment
Я знаю, что код работает, моя проблема заключается в пересчете соответствующей степени поворота карты. - person Supertecnoboff; 10.03.2017
comment
Ааа, хорошо @Supertecnoboff Я буду продолжать исследования, если найду что-то полезное, я опубликую как обновление - person Reinier Melian; 10.03.2017