Исключение: «Недопустимый регион <центр: + инф, +0,00000000 промежуток: +1,00000000, +0,50000000>» при попытке отобразить карту - PullRequest
14 голосов
/ 13 мая 2011

когда я пытаюсь отобразить карту, я получаю это исключение:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid Region <center:+inf, +0.00000000 span:+1.00000000, +0.50000000>'

мой соответствующий код такой:

-(void)viewWillAppear:(BOOL)animated
{   
    [mapView removeAnnotations:mapView.annotations];

    // locationManager update as location
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    [locationManager startUpdatingLocation];
    CLLocation *location = [locationManager location];
    //Configure the new event with information from the location
    CLLocationCoordinate2D coordinate = [location coordinate];

    latitudeOfUserLocation=coordinate.latitude;
    longitudeOfUserLocation=coordinate.longitude;


    location2D = (CLLocationCoordinate2D){ .latitude = latitudeOfUserLocation, .longitude = longitudeOfUserLocation };
    MyLocation *annotation=[[[MyLocation alloc]initWithName:@"You are here" distanceVersLaStation:@"" coordinate:location2D]autorelease];
    annotation.pinColor = MKPinAnnotationColorRed;  
    [mapView addAnnotation:annotation];

    MKCoordinateSpan span={latitudeDelta:1,longitudeDelta:0.5};
    MKCoordinateRegion region={location2D,span};
    [mapView setRegion:region];

}

я не могу понять, как решить эту проблему, спасибо заранее:)

РЕДАКТИРОВАТЬ:

Привет еще раз, я пытаюсь сделать, как вы сказали, исключение разрешается, однако, когда я пытаюсь отобразитьдолгота / широта пользователя в консоли я ничего не получил, это мой код, который довольно корректен:

    -(void)viewWillAppear:(BOOL)animated
    {  

        [mapView removeAnnotations:mapView.annotations];

        // locationManager update as location
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self; 
        locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
        locationManager.distanceFilter = kCLDistanceFilterNone; 
        [locationManager startUpdatingLocation];
        NSURL *url=[NSURL         URLWithString:@"http://ipho.franceteam.org/ad_V1/stations/"];
    ASIFormDataRequest * request=[ASIFormDataRequest requestWithURL:url];
[request setPostValue:[NSNumber numberWithFloat:longitudeOfUserLocation] forKey:@"longitude"];
    [request setDelegate:self];
    [request startAsynchronous];
    MBProgressHUD *hud=[MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.labelText=@"Recherche en cours..";// this never stop loading

    }

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    CLLocation *location = [locationManager location];
    //Configure the new event with information from the location
    CLLocationCoordinate2D coordinate = [location coordinate];
    latitudeOfUserLocation=coordinate.latitude;
    longitudeOfUserLocation=coordinate.longitude;
    NSLog(@"your latitude :%f",latitudeOfUserLocation);//here nothing is shown
    NSLog(@"your longitude :%f",longitudeOfUserLocation);// and here too
    location2D = (CLLocationCoordinate2D){ .latitude = latitudeOfUserLocation, .longitude = longitudeOfUserLocation };
    MyLocation *annotation=[[[MyLocation alloc]initWithName:@"Vous êtes ici" distanceVersLaStation:@"" coordinate:location2D]autorelease];
    annotation.pinColor = MKPinAnnotationColorRed;  //or red or whatever
    [mapView addAnnotation:annotation];
    //
    MKCoordinateSpan span={latitudeDelta:1,longitudeDelta:0.5};
    MKCoordinateRegion region={location2D,span};
    [mapView setRegion:region];

}//End function

даже я работаю на симуляторе, я должен получить что-то на консоли, верно?

РЕДАКТИРОВАТЬ: Привет еще раз, у меня была возможность проверить свой код на iPhone (устройстве), и я заметил, что когда я пытаюсь выполнить поиск, приложение успешно отслеживает мою позицию и находит менястанций, которые соответствуют моему поиску (фиолетовая аннотация), однако карта не отображается, и процесс поиска все еще загружается и никогда не останавливается.

hud.labelText=@"Recherche en cours..";// this never stop loading

вот скриншот, который может объяснить лучше:

enter image description here

Ответы [ 5 ]

12 голосов
/ 27 ноября 2012

Исключение «Недопустимый регион» завершено, поскольку регион, заданный для mapView, недопустим. Как я теперь знаю, это исключение может быть вызвано двумя причинами: недопустимая центральная точка региона или недопустимый диапазон региона.

Чтобы избежать этого исключения:
1) Проверьте значение центральной точки: широта в диапазоне [-90; 90], долгота в диапазоне [-180; 180]
2) Используйте [mapView regionThatFits: region], чтобы получить регион с допустимым диапазоном, затем установите mapview:
[mapView setRegion: [mapView regionThatFits: region]]

12 голосов
/ 07 ноября 2011

В некоторых ситуациях (когда приложение становится активным из фона) метод didUpdateUserLocation запускается, но без обновленного местоположения.В этих случаях нет допустимого региона, и setRegion: метод может выдать исключение.Глупо, простое решение может быть проверено, если его регион действителен, прежде чем установить его:

 if(region.center.longitude == -180.00000000){
    NSLog(@"Invalid region!");
}else{
    [aMapView setRegion:region animated:YES];
}
4 голосов
/ 13 мая 2011

После вызова startUpdatingLocation обновление местоположения может занять несколько секунд, поэтому вы не сможете сразу же получить его.Пока он не обновлен, location содержит недопустимые значения, о чем говорит ошибка.

Вместо этого реализуйте метод делегата locationManager:didUpdateToLocation:fromLocation: и прочитайте местоположение в нем.

Переместите весь код после startUpdatingLocation к этому методу:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    CLLocation *location = [locationManager location];
    //etc...
}

Примечание: вышеуказанный метод исключен: Apple Doc

1 голос
/ 11 января 2012
[mapView setRegion:[mapView regionThatFits:region] animated:TRUE];
0 голосов
/ 10 марта 2017

Не может быть больше 180

CLLocationDegrees delta = MAX(maxLatitude - minLatitude, maxLongitude - minLongitude) * 1.1;

delta = points.count < 2 ? 0.5 : delta;
delta = MIN(delta, 180);

CLLocationDegrees centerX = (maxLatitude-minLatitude)/2.0 + minLatitude;
CLLocationDegrees centerY = (maxLongitude-minLongitude)/2.0 + minLongitude;

CLLocationCoordinate2D theCoordinate = {centerX,centerY};
MKCoordinateSpan span = MKCoordinateSpanMake(delta, delta);
self.mapView.region = MKCoordinateRegionMake(theCoordinate, span);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...