マップ ビューの緯度/経度を Google に問い合わせています。マップにはすべての住所が表示されるため、ユーザーがアプリに入力した住所の数によっては、時間がかかる場合があります。また、ループ内でのクエリ間に短い遅延を導入してfor
、Google から適切な結果が得られるようにしました (クエリが速すぎると、有効な緯度/経度ポイントが得られず、0,0 になります)。
これには非常に時間がかかるため、ユーザーがボタンを押してこれに移動するUIViewController
と、長い時間がかかり、ユーザーがアプリが壊れていると思うのではないかと心配しています。ViewController が「表示」されるのが理想的ですが、クエリが終了するまでマップ上にアニメーション化されたアクティビティ インジケーターを備えたマップ (最初は注釈なし) を用意し、注釈をロードします。こうすることで、ユーザーはマップが読み込まれるのを待っている間、ビューで他の情報を見ることができます。
これが私のコードです:
- (void) viewDidLoad {
[mapScroll startAnimating]; // activity indicator outlet
[self makeMap];
// ... etc.
}
- (void)makeMap {
allRegions = [[NSMutableArray alloc] init];
[self getDistinctRegions]; //generates allRegions array
double maxLat = -90;
double maxLon = -180;
double minLat = 90;
double minLon = 180;
for (int i=0; i<[allRegions count]; i++) {
NSString *tempString = [allRegions objectAtIndex:i];
NSString *searchString = [tempString stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
NSString *queryURL = [[NSString alloc] initWithFormat:@"http://maps.google.com/maps/geo?output=csv&q=%@",searchString];
NSString *queryResults = [[NSString alloc] initWithContentsOfURL: [NSURL URLWithString:queryURL] encoding: NSUTF8StringEncoding error:nil];
NSArray *queryData = [queryResults componentsSeparatedByString:@","];
if ([queryData count] == 4) {
double latitude = [[queryData objectAtIndex:2] doubleValue];
double longitude = [[queryData objectAtIndex:3] doubleValue];
if (latitude > maxLat) maxLat = latitude;
if (latitude < minLat) minLat = latitude;
if (longitude > maxLon) maxLon = longitude;
if (longitude < minLon) minLon = longitude;
CLLocationCoordinate2D coordinate;
coordinate.latitude = latitude;
coordinate.longitude = longitude;
MKPlacemark *marker;
marker = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil];
[mapView addAnnotation:marker];
NSLog(@"%d",i);
[NSThread sleepForTimeInterval:0.12];
}
}
MKCoordinateRegion overallRegion;
double latSpan = abs(maxLat - minLat);
double lonSpan = abs(maxLon - minLon);
double avgLatitude = (maxLat+minLat)/2;
double avgLongitude = (maxLon+minLon)/2;
overallRegion.center.latitude = avgLatitude;
overallRegion.center.longitude = avgLongitude;
overallRegion.span.latitudeDelta = latSpan;
overallRegion.span.longitudeDelta = lonSpan;
[mapView setRegion:overallRegion animated:YES];
[mapScroll stopAnimating];
mapScroll.hidden = TRUE;
}