2017-03-10 6 views
1

몇 가지 다른 라벨과 작은 MKMapView가 포함 된보기가있는 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

+0

DEGREES_TO_RADIANS에 위도를 전달한 이유가 무엇인가요? –

답변

0

을 나는 당신의 문제에서 일하고 있었다, 나 이것에 대한

내가하고 싶은 모든

이를 변경하는 것입니다 방법 [[self.map camera] setHeading:90.f];은 의도 한대로 작동하므로 문제는 라디안과 후자의 과정에서 계산됩니다.하지만 문제는 카메라의 복사본과 관련이 있습니다. 나는이 방법을지도의 카메라에서 직접 사용하고 훌륭하게 작동합니다. 이 도움이 되었기를 바랍니다

+0

그 코드가 작동하는 것을 알고, 내 문제는지도가 너무 회전되어야한다는 적절한 정도를 다시 계산하는 것입니다. – Supertecnoboff

+1

Ahh ok @Supertecnoboff 만약 내가 도움이되는 것을 찾으면 나는 더 연구 할 것이다. –