缩放MKMapView以适合折线和注释引脚 - 水平方向

时间:2017-03-10 14:00:52

标签: ios objective-c mkmapview mkpolyline mkmapcamera

我有一个iOS应用,其视图包含一些不同的标签和一个小型MKMapView。

在地图视图中,我绘制了一条行程路线(使用折线)并添加了两个注释引脚,一个位于路径的起点,另一个位于路径的末尾。

我要做的就是更改地图缩放/旋转,使折线和两个注释引脚适合地图视图的大小。但是我尝试过的一切都失败了。

我的方法

1)将折线添加到地图视图中。

2)使用setVisibleMapRect调整地图视图,以便折线适合地图。 (我还通过使用edge insets参数添加了一些填充。)

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

我已经尝试了所有的东西,但无论哪种方式,最终结果是某些角度的某些折线被旋转到正确的水平角度而其他角度不是......我做错了什么地球?或者是否有更好的内置方法解决这个问题?

我想做的就是改变这一点:

enter image description here

......对此:

enter image description here

1 个答案:

答案 0 :(得分:0)

我一直在处理你的问题,对我来说这个方法[[self.map camera] setHeading:90.f];按预期工作,所以也许你的问题在于计算弧度和后一个过程,但也许你的问题也与你的副本有关。相机。我直接在地图相机上使用这种方法,效果很好。我希望这可以帮助你