地理座標を取得するためにGoogle APIを使用していました。私が今まで使ってきたコードは以下の通りです
-(CLLocationCoordinate2D) getLocationFromAddressString:(NSString*) addressStr {
NSString *urlStr = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv",
[addressStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSString *locationStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlStr] encoding:NSStringEncodingConversionAllowLossy error:nil];
NSArray *items = [locationStr componentsSeparatedByString:@","];
double latitude = 0.0;
double longitude = 0.0;
//NSLog(@"items array %@", items);
if([items count] >= 4 && [[items objectAtIndex:0] isEqualToString:@"200"]) {
latitude = [[items objectAtIndex:2] doubleValue];
longitude = [[items objectAtIndex:3] doubleValue];
}
else {
//NSLog(@"Address, %@ not found: Error %@",addressStr, [items objectAtIndex:0]);
}
CLLocationCoordinate2D location;
location.latitude = latitude;
location.longitude = longitude;
return location;
}
CLGeocoder
Google API の代わりに使用して、住所文字列から位置座標を取得したいと考えています。
CLGeocoder
私はオンラインの例から見た作業を行ってきました。で作業するのは少し難しい作業だと思いますCLGeocoder
。CLGeocoder
既存のコードに大きな変更を加える必要がないように、以前のコードからあまり変更せずに を使用しようとしました。
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:addressStr completionHandler:^(NSArray *placemarks, NSError *error) {
self.placemarksArray = placemarks;
CLPlacemark *placeInfo = [placemarks objectAtIndex:0];
NSString *latitudeString = [NSString stringWithFormat:@"%f",placeInfo.location.coordinate.latitude ];
NSString *longitudeString = [NSString stringWithFormat:@"%f",placeInfo.location.coordinate.longitude ];
NSLog(@"latitudeString %@", latitudeString);
NSLog(@"longitudeString %@", longitudeString);
_latitudes = placeInfo.location.coordinate.latitude;
_longitudes = placeInfo.location.coordinate.longitude;
}];
location.latitude = _latitudes;
location.longitude = _longitudes;
return location;
しかし、何が起こるかというと、ブロックが実行される前にマップ ビューが読み込まれます。この場合、場所の正確な値は返されません。
私の質問は:
CLGeocoder
以前のコードをあまり変更せずに を使用することは可能ですか? または、構造全体を変更する必要がありますか。- 私が試した2番目のコードブロックから、私は何を間違っていますか?どうすれば修正できますか?
編集:上記のメソッドはから呼び出されますviewDidLoad
CLLocationCoordinate2D mapCenter = [self getLocationFromAddressString:fullAddress];
MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init];
[annotationPoint setCoordinate:mapCenter];
[annotationPointsArray addObject:annotationPoint];
addAnnotation = [[[MyAddressAnnotation alloc] initWithCoordinate:mapCenter title:firstName SubTitle:lastName]autorelease];
[mapView addAnnotation:addAnnotation];
これはCLLocationCoordinate2D
、getGeoLocation メソッドから緯度と経度の値を取得した後に実行されます。