2010-08-01 3 views
13

gibt es eine Möglichkeit, die MKMapView einen Pin mit einer bestimmten Adresse platzieren? Ohne Verwendung der KoordinatenMKMapView mit Adresse

Dank

Antwort

21

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; 
} 
+1

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. –

+0

Vielen Dank für Ihre Antwort – SampathKumar

+1

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

0

Sie benötigen einen Geocoding Service nutzen Ihre Adresse Koordinaten zu konvertieren. Google, denke ich, bietet ein, zusammen mit ein paar anderen Diensten.

5

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]; 
2

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); 
    } 
} 
+0

Es wäre großartig, wenn Sie auch eine Beispiel-URL angeben könnten. –

+1

Dies ist eine Beispiel-URL: http://maps.googleapis.com/maps/api/geocode/json?address=Mall+Road+Lahore+Pakistan&sensor=false –

5

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]; 
       } 
      }]; 
+1

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

+0

Ja, du hast Recht, ich bearbeite den Code, bedenke nur, dass FirstObject nur öffentlich auf iOS7 und höher verfügbar ist – Climbatize