如何将地图区域限制为仅限iOS中的一个国家/地区?

时间:2012-09-13 05:39:45

标签: ios cocoa-touch mapkit limit

我正在使用mapkit为iOS制作应用。我想将地图的边界限制在特定的地区/国家。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

没有办法告诉地图不要滚出某个区域。我能想到的唯一方法就是当你碰到一个围栏时阻止用户滚动。下面的例子是在没有测试或编译的情况下编写的,所以你可能需要自己调整它,但希望它能让你开始......

ViewController.h

CLLocationCoordinate2D myNorthEast, mySouthWest;

ViewController.m

-(void)viewDidLoad{
    myNorthEast = CLLocationCoordinate2DMake(lat1,lon1);
    mySouthWest = CLLocationCoordinate2DMake(lat2,lon2);
    [super viewDidLoad];
}

-(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated{
    /*
    / Check if the map region is going to change outside your fence.
    / If so, programmatically set it back to the edge of your fence.
    */

    if(!animated){
        return; // Don't want to get stuck in a loop after you set your region below.
    }

    MKCoordinateRegion region = [mapView region];

    // You will need to get the NE and SW points of the new region to compare
    // First we need to calculate the corners of the map so we get the points
    CGPoint nePoint = CGPointMake(mapView.bounds.origin.x + mapView.bounds.size.width, mapView.bounds.origin.y);
    CGPoint swPoint = CGPointMake(mapView.bounds.origin.x, bounds.origin.y + mapView.bounds.size.height);

    // Then transform those point into lat,lng values
    CLLocationCoordinate2D neCoord;
    neCoord = [mapView convertPoint:nePoint toCoordinateFromView:mapView];

    CLLocationCoordinate2D swCoord;
    swCoord = [mapView convertPoint:swPoint toCoordinateFromView:mapView];

    /*
        You will need to mess around with the lat/lon & sign of the new center calculation for the other cases.
    */
    if(neCoord.latitude > myNorthEast.latitude){
        MKCoordinateRegion newRegion;
        newRegion.span = region.span;
        CLLocationCoordinate2D newCenter;
        newCenter.longitude = region.center.longitude;
        newCenter.latitude = myNorthEast.latitude - region.span.latitudeDelta;
        newRegion.center = newCenter;
        [mapView setRegion:newRegion animated:NO];
    }else if(neCoord.longitude < myNorthEast.longitude){

    }else if(swCoord.latitude < mySouthWest.latitude){

    }else if(swCoord.longitude > mySouthWest.longitude){

    }
}

部分原因来自这个答案: Getting the bounds of an MKMapvIew

答案 1 :(得分:1)

这是前一个答案的进一步说明。请注意,对于世界上不同的地方,情况会有所不同:

    if(neCoord.latitude > myNorthEast.latitude){
        MKCoordinateRegion newRegion;
        newRegion.span = region.span;
        CLLocationCoordinate2D newCenter;
        newCenter.longitude = region.center.longitude;
        newCenter.latitude = myNorthEast.latitude - region.span.latitudeDelta / 2;
        newRegion.center = newCenter;
        [mapView setRegion:newRegion animated:NO];

    } else if(swCoord.latitude < mySouthWest.latitude){
        MKCoordinateRegion newRegion;
        newRegion.span = region.span;
        CLLocationCoordinate2D newCenter;
        newCenter.longitude = region.center.longitude;
        newCenter.latitude = mySouthWest.latitude + region.span.latitudeDelta / 2;
        newRegion.center = newCenter;
        [mapView setRegion:newRegion animated:NO];

    } else if(neCoord.longitude > myNorthEast.longitude){
        MKCoordinateRegion newRegion;
        newRegion.span = region.span;
        CLLocationCoordinate2D newCenter;
        newCenter.longitude = myNorthEast.longitude - region.span.longitudeDelta / 2;
        newCenter.latitude = region.center.latitude;
        newRegion.center = newCenter;
        [mapView setRegion:newRegion animated:NO];

    } else if(swCoord.longitude < mySouthWest.longitude){
        MKCoordinateRegion newRegion;
        newRegion.span = region.span;
        CLLocationCoordinate2D newCenter;
        newCenter.longitude = mySouthWest.longitude + region.span.longitudeDelta / 2;
        newCenter.latitude = region.center.latitude;
        newRegion.center = newCenter;
        [mapView setRegion:newRegion animated:NO];
    }