2011-12-30 218 views
4

我想知道是否可以仅使用Map Kit在地图上显示特定区域而不是全部世界地图。 如果我想在我的应用程序中显示亚洲地图,那么地图工具包隐藏地图的其余部分。使用MapKit显示特定区域

回答

9

处理“地图包隐藏地图剩余部分”的要求,有一两件事你可以做的是创造一个黑色多边形叠加与切口亚洲各地(或你喜欢的地方)覆盖了整个世界。

例如,当你初始化地图(在viewDidLoad中如):

CLLocationCoordinate2D asiaCoords[4] 
    = { {55,60}, {55,150}, {0,150}, {0,60} }; 
     //change or add coordinates (and update count below) as needed 
self.asiaOverlay = [MKPolygon polygonWithCoordinates:asiaCoords count:4]; 

CLLocationCoordinate2D worldCoords[4] 
    = { {90,-180}, {90,180}, {-90,180}, {-90,-180} }; 
MKPolygon *worldOverlay 
    = [MKPolygon polygonWithCoordinates:worldCoords 
       count:4 
       interiorPolygons:[NSArray arrayWithObject:asiaOverlay]]; 
        //the array can have more than one "cutout" if needed 

[myMapView addOverlay:worldOverlay]; 

并实现viewForOverlay委托方法:

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolygon class]]) 
    { 
     MKPolygonView *pv = [[[MKPolygonView alloc] initWithPolygon:overlay] autorelease]; 
     pv.fillColor = [UIColor blackColor]; 
     pv.alpha = 1.0; 
     return pv; 
    } 

    return nil; 
} 

这看起来是这样的:

enter image description here

如果你还想要r限制用户滚动到亚洲以外或缩小太远,那么您也需要手动执行此操作。在Restrict MKMapView scrolling中描述了一种可能的方式。用asiaOverlay代替theOverlay

+8

创建包含世界的'MKPolygon'的代码需要iOS 7的调整。如果您尝试创建一个跨越180°以上经度的4点多边形,它将自身反转为180模式:一个200°多边形为了解决这个问题,我们需要在两者之间增加2个额外的点:CLLocationCoordinate2D worldCoords [6] = {{90,0},{90,180},等等。 {-90,180},{-90,0},{-90,-180},{90,-180}};' – SaltyNuts 2013-11-05 19:38:48

+0

@SaltyNuts,Anna我可以通过使用你们提出的世界坐标来达到预期的行为,谢谢你:),但是我面临着一个问题 - 当我试图向左或向右平移地图时,我可以观察到填充颜色没有覆盖范围 - http://i.stack.imgur.com /QSDQc.png,有什么办法可以增加填充颜色范围?请建议。 – Devarshi 2015-08-14 07:29:19

0

您可以将区域指定为MKCoordinateRegion,然后告诉MKMapView实例仅使用setRegion和regionThatFits消息显示该区域。

或者,您可以使用visibleMapRect属性而不是区域。这可能会更好地满足您的需求。

简而言之,请阅读Apple提供的MKMapView类参考文档。

从我过去做过的假设mapView和名为locationToShow的给定位置取代我使用了MKCoordinateRegion。

- (void) goToLocation { 

    MKCoordinateRegion region; 
    MKCoordinateSpan span; 
    span.latitudeDelta=0.01; 
    span.longitudeDelta=0.01; 

    region.span=span; 
    region.center=locationToShow; 
    [mapView setRegion:region animated:TRUE]; 
    [mapView regionThatFits:region]; 
}