Исключение: "Недопустимая область <center: + inf, +0.00000000 span: +1.00000000, +0.50000000>" при попытке отобразить карту
когда я пытаюсь отобразить карту, я получил это исключение:
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];
}
Я не могу понять, как решить эту проблему, спасибо заранее:)
EDIT:
Привет, снова, я пытаюсь сделать то, что вы сказали, исключение решается, однако, когда я пытаюсь отобразить долготу/широту пользователя в консоли, я ничего не получил, это мой код, который является довольно правильным:
-(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];
[email protected]"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 (устройство), и я заметил, что когда я пытаюсь выполнить поиск, приложение судилось отслеживать мою позицию и находить меня станциями, которые соответствуют моему поиску (фиолетовая аннотация) однако карта не отображается, и процесс поиска по-прежнему загружается и никогда не останавливается.
[email protected]"Recherche en cours..";// this never stop loading
вот скриншот, который может объяснить лучше:
![enter image description here]()
Ответы
Ответ 1
После вызова startUpdatingLocation
может потребоваться несколько секунд для обновления местоположения, чтобы вы не могли сразу же получить его. Пока он не будет обновлен, в местоположении будут указаны недопустимые значения, о которых сообщает вам ошибка.
Вместо этого внедрите метод делегата locationManager:didUpdateToLocation:fromLocation:
и прочитайте там место.
Переместите весь код после startUpdatingLocation
к этому методу:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
CLLocation *location = [locationManager location];
//etc...
}
Примечание: метод выше:
![Apple Doc]()
Ответ 2
В некоторых ситуациях (когда приложение становится активным из фона) метод doUpdateUserLocation запущен, но без обновленного местоположения. В этих случаях нет допустимой области, а метод setRegion: может вызывать исключение.
Глупо, простое решение может проверять, действителен ли его регион до его установки:
if(region.center.longitude == -180.00000000){
NSLog(@"Invalid region!");
}else{
[aMapView setRegion:region animated:YES];
}
Ответ 3
Исключено исключение "Недопустимый регион", потому что регион, который вы установили mapView, недействителен. Как я знаю сейчас, есть две причины, которые могут вызвать это исключение: центральная точка региона недействительна, или диапазон области недействителен.
Чтобы избежать этого исключения:
1) Проверьте значение центральной точки: широта находится в диапазоне [-90; 90], долгота находится в диапазоне [-180; 180]
2) Используйте [mapView regionThatFits: region], чтобы получить область с допустимым диапазоном, а затем установить mapview:
[mapView setRegion: [mapView regionThatFits: region]]
Ответ 4
[mapView setRegion:[mapView regionThatFits:region] animated:TRUE];
Ответ 5
Не может быть больше 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);