gibt es eine Möglichkeit, die MKMapView einen Pin mit einer bestimmten Adresse platzieren? Ohne Verwendung der KoordinatenMKMapView mit Adresse
Dank
gibt es eine Möglichkeit, die MKMapView einen Pin mit einer bestimmten Adresse platzieren? Ohne Verwendung der KoordinatenMKMapView mit Adresse
Dank
hier ist ein Code-Snippet I
-(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]];
NSArray *items = [locationStr componentsSeparatedByString:@","];
double lat = 0.0;
double lon = 0.0;
if([items count] >= 4 && [[items objectAtIndex:0] isEqualToString:@"200"]) {
lat = [[items objectAtIndex:2] doubleValue];
lon = [[items objectAtIndex:3] doubleValue];
}
else {
NSLog(@"Address, %@ not found: Error %@",addressStr, [items objectAtIndex:0]);
}
CLLocationCoordinate2D location;
location.latitude = lat;
location.longitude = lon;
return location;
}
Sie benötigen einen Geocoding Service nutzen Ihre Adresse Koordinaten zu konvertieren. Google, denke ich, bietet ein, zusammen mit ein paar anderen Diensten.
hier ist ein Code-Snippet in einer Anwendung verwendet ich in einer Anwendung verwendet
[NSString stringWithContentsOfURL:] jetzt veraltet . Sie müssen verwenden:
NSString *locationStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlStr] encoding:NSUTF8StringEncoding error:nil];
Da Google eine neue Version ihrer Geocoding API (upgrade notes) geschrieben, die Google Maps URL von @Aaron Saunders bereitgestellt ist nicht mehr gültig. Außerdem lautet die Antwort jetzt entweder json
oder xml
, daher habe ich einige Änderungen vorgenommen, um dies in der akzeptierten Antwort zu beheben.
- (CLLocationCoordinate2D)locationFromAddressString:(NSString*)addressString {
if (!addressString.length) {
ALog(@"provided an empty 'addressStr'");
return CLLocationCoordinate2DMake(0.0, 0.0);
}
NSString *urlStr = [NSString stringWithFormat:GOOGLE_MAPS_GEOCODING_URL_STR,
[addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSError *dataError;
NSError *jsonError;
NSData *responseData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]
options:NSDataReadingMappedAlways
error:&dataError];
NSDictionary *responseBody = [NSJSONSerialization JSONObjectWithData:responseData
options:NSJSONReadingMutableContainers
error:&jsonError];
if (!dataError && !jsonError && [responseBody[@"status"] isEqualToString:@"OK"]) {
NSDictionary *coords = responseBody[@"results"][0][@"geometry"][@"location"];
return CLLocationCoordinate2DMake([coords[@"lat"] doubleValue],
[coords[@"lng"] doubleValue]);
}
else {
ALog(@"Address [%@] not found. \nResponse [%@]. \nError [%@]",addressString, responseBody, jsonError);
return CLLocationCoordinate2DMake(0.0, 0.0);
}
}
Es wäre großartig, wenn Sie auch eine Beispiel-URL angeben könnten. –
Dies ist eine Beispiel-URL: http://maps.googleapis.com/maps/api/geocode/json?address=Mall+Road+Lahore+Pakistan&sensor=false –
Da dieses Ergebnis auf der ersten Seite ist, wenn Sie eine Google-Suche zu machen, ich denke, es ist gut, eine frischere Lösung als die Google Geocoding (begrenzt) zu geben. Es ist besser, einen Apple Geocoder zu verwenden:
NSString *location = @"your address";
CLGeocoder *geocoder = [CLGeocoder new];
[geocoder geocodeAddressString:location
completionHandler:^(NSArray* placemarks, NSError* error){
if (error) {
NSLog(@"%@", error);
} else if ([placemarks count]) {
CLPlacemark *topResult = [placemarks firstObject];
MKPlacemark *placemark = [[MKPlacemark alloc] initWithPlacemark:topResult];
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(placemark.coordinate, 5000, 5000);
[self.mapView setRegion:region animated:YES];
[self.mapView addAnnotation:placemark];
}
}];
Dies sollte wirklich die akzeptierte Antwort sein. Ich würde vorschlagen, [place marks firstObject] anstelle von objectAtIndex zu verwenden und den Fehlerstatus zu überprüfen. – Ben
Ja, du hast Recht, ich bearbeite den Code, bedenke nur, dass FirstObject nur öffentlich auf iOS7 und höher verfügbar ist – Climbatize
Es lohnt sich, die Google Geocoding Bedingungen Check-out (http://code.google.com/apis/maps/documentation/geocoding/), vor allem, wenn Sie bauen eine kommerzielle Anwendung. –
Vielen Dank für Ihre Antwort – SampathKumar
Beachten Sie, dass derzeit (iOS7 ist out), können Sie die CLGeocoder-Klasse verwenden und Code eine Adresszeichenfolge weiterleiten, um Koordinaten zurück zu bekommen. Verwenden Sie die Methode: "geocodeAddressString: completionHandler:". Auf diese Weise müssen Sie sich nicht für den Geokodierungsdienst von Google anmelden. – idStar