2011-04-30 5 views
4

MKMapView에서 MKPolylineView를 그리는 데 문제가 있습니다. 이 선은 전 세계를 여행하며 뉴욕에서 시작하여 끝나며 항상 동쪽으로 여행합니다. 일본에서 샌프란시스코로가는 여행의 한 구간은 태평양을 가로 지르고 따라서 경도는 +/- 180입니다. MKPolylineView는이 두 점을 연결하지만 잘못 된 방향으로 이동합니다. 즉, 태평양에서 동쪽이 아닌 일본에서 서쪽으로 샌프란시스코로 이동합니다. 선분이 두 점을 연결하기 위해 어느 방향으로 이동해야 하는지를 지정할 수있는 옵션이 없습니다.경도를 가로 지르는 MKPolylineView를 그릴 수 없습니다. +/- 180

간단히 말하면 MKMapView는 세상이 둥글다는 것을 이해하지 못하는 것 같습니다. 일본에서 샌프란시스코로 동쪽으로 여행하면서 의도대로 선을 그릴 수있는 방법이 있습니까?
The Polyline http://www.builtlight.org/pub/MKPolylineView.png

답변

1

이것은 MKMapView의 제한 될 것으로 보인다 :

나는 문제를 명확하게 표시하는 스크린 샷을 가지고있다.

해결 방법은 +/- 180 교차를 "동쪽"및 "서쪽"부분으로 나누는 것입니다.

세계 일주 여행 (마감 == 시작)의 경우 교차점의 "서쪽"부분을 폴리선의 정면에 놓을 수 있습니다. 예를 들어
: (! 마감 = 시작)

CLLocationCoordinate2D newYorkCoord = CLLocationCoordinate2DMake(40.7141667, -74.0063889); 
CLLocationCoordinate2D londonCoord = CLLocationCoordinate2DMake(51.5, -0.116667); 
CLLocationCoordinate2D japanCoord = CLLocationCoordinate2DMake(36, 138); 
CLLocationCoordinate2D sanFranciscoCoord = CLLocationCoordinate2DMake(37.775, -122.4183333); 

CLLocationCoordinate2D japanToSFMidpointEast; 
//use average calc as crude way to find midpoint... 
japanToSFMidpointEast.latitude = (japanCoord.latitude + sanFranciscoCoord.latitude)/2.0; 
japanToSFMidpointEast.longitude = 180; 

CLLocationCoordinate2D japanToSFMidpointWest; 
japanToSFMidpointWest.latitude = japanToSFMidpointEast.latitude; 
japanToSFMidpointWest.longitude = -180; 

int pointsCount = 6; 
CLLocationCoordinate2D *points = malloc(pointsCount * sizeof(CLLocationCoordinate2D)); 
points[0] = japanToSFMidpointWest; 
points[1] = sanFranciscoCoord; 
points[2] = newYorkCoord; 
points[3] = londonCoord; 
points[4] = japanCoord; 
points[5] = japanToSFMidpointEast; 
MKPolyline *polyline = [MKPolyline polylineWithCoordinates:points count:pointsCount]; 
[mapView addOverlay:polyline]; 
free(points); 
points = NULL; 


여행이 아닌 세계 일주, 두 개의 폴리 라인을 사용해야됩니다.
이 예는 일본에서 SF로 이동합니다.

CLLocationCoordinate2D japanCoord = CLLocationCoordinate2DMake(36, 138); 
CLLocationCoordinate2D sanFranciscoCoord = CLLocationCoordinate2DMake(37.775, -122.4183333); 

CLLocationCoordinate2D japanToSFMidpointEast; 
japanToSFMidpointEast.latitude = (japanCoord.latitude + sanFranciscoCoord.latitude)/2.0; 
japanToSFMidpointEast.longitude = 180; 

CLLocationCoordinate2D japanToSFMidpointWest; 
japanToSFMidpointWest.latitude = japanToSFMidpointEast.latitude; 
japanToSFMidpointWest.longitude = -180; 

int eastPointsCount = 2; 
CLLocationCoordinate2D *eastPoints = malloc(eastPointsCount * sizeof(CLLocationCoordinate2D)); 
eastPoints[0] = japanCoord; 
eastPoints[1] = japanToSFMidpointEast; 
MKPolyline *eastPolyline = [MKPolyline polylineWithCoordinates:eastPoints count:eastPointsCount]; 
[mapView addOverlay:eastPolyline]; 
free(eastPoints); 
eastPoints = NULL; 

int westPointsCount = 2; 
CLLocationCoordinate2D *westPoints = malloc(westPointsCount * sizeof(CLLocationCoordinate2D)); 
westPoints[0] = japanToSFMidpointWest; 
westPoints[1] = sanFranciscoCoord; 
MKPolyline *westPolyline = [MKPolyline polylineWithCoordinates:westPoints count:westPointsCount]; 
[mapView addOverlay:westPolyline]; 
free(westPoints); 
westPoints = NULL; 
+0

감사합니다. 유사한 해결 방법을 생각하고 있었지만, 내가 놓친 MapKit의 기능이 있었으면 좋겠다. –