2013-09-01 11 views
7

Mam MKMapView, który ma UISearchBar na górze i chcę, aby użytkownik mógł wpisać adres, a także znaleźć ten adres i upuścić na nim pinezkę. To, czego nie wiem, to jak zmienić ciąg adresu na długość i szerokość geograficzną, dzięki czemu mogę utworzyć obiekt CLLocation. Czy ktoś wie, jak mogę to zrobić?Jak uzyskać długie i długie współrzędne z ciągu adresu

+0

To nie pomoże, ponieważ pobiera on dane ma współrzędne dla adresów. Potrzebuję sposobu na znalezienie współrzędnych adresu, gdy użytkownik szuka adresu. –

Odpowiedz

16

Możesz znaleźć odpowiedź na to pytanie.

iOS - MKMapView place annotation by using address instead of lat/long użytkownika Romes.

NSString *location = @"some address, state, and zip"; 
CLGeocoder *geocoder = [[CLGeocoder alloc] init]; 
     [geocoder geocodeAddressString:location 
      completionHandler:^(NSArray* placemarks, NSError* error){ 
       if (placemarks && placemarks.count > 0) { 
        CLPlacemark *topResult = [placemarks objectAtIndex:0]; 
        MKPlacemark *placemark = [[MKPlacemark alloc] initWithPlacemark:topResult]; 

        MKCoordinateRegion region = self.mapView.region; 
        region.center = placemark.region.center; 
        region.span.longitudeDelta /= 8.0; 
        region.span.latitudeDelta /= 8.0; 

        [self.mapView setRegion:region animated:YES]; 
        [self.mapView addAnnotation:placemark]; 
       } 
      } 
     ]; 

Bardzo proste rozwiązanie. Ale dotyczy tylko iOS5.1 lub nowszego.

1

Dla swift2

var location: String = "some address, state, and zip" 
     var geocoder: CLGeocoder = CLGeocoder() 
     geocoder.geocodeAddressString(location,completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in 
      if (placemarks?.count > 0) { 
       var topResult: CLPlacemark = (placemarks?[0])! 
       var placemark: MKPlacemark = MKPlacemark(placemark: topResult) 
       var region: MKCoordinateRegion = self.mapView.region 
       region.center = placemark.region.center 
       region.span.longitudeDelta /= 8.0 
       region.span.latitudeDelta /= 8.0 
       self.mapView.setRegion(region, animated: true) 
       self.mapView.addAnnotation(placemark) 
      } 
     }) 
2

użyłem podobnego podejścia jak Vijay, ale musiał dostosować jedną linię kodu. region.center = placemark.region.center nie działa dla mnie. Może mój kod pomaga kogoś tak dobrze:

let location: String = "1 Infinite Loop, CA, USA" 
let geocoder: CLGeocoder = CLGeocoder() 
geocoder.geocodeAddressString(location,completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in 
    if (placemarks?.count > 0) { 
     let topResult: CLPlacemark = (placemarks?[0])! 
     let placemark: MKPlacemark = MKPlacemark(placemark: topResult) 
     var region: MKCoordinateRegion = self.mapView.region 

     region.center.latitude = (placemark.location?.coordinate.latitude)! 
     region.center.longitude = (placemark.location?.coordinate.longitude)! 

     region.span = MKCoordinateSpanMake(0.5, 0.5) 

     self.mapView.setRegion(region, animated: true) 
     self.mapView.addAnnotation(placemark) 
    } 
}) 
0
func geoCodeUsingAddress(address: NSString) -> CLLocationCoordinate2D { 
    var latitude: Double = 0 
    var longitude: Double = 0 
    let addressstr : NSString = "http://maps.google.com/maps/api/geocode/json?sensor=false&address=\(address)" as NSString 
    let urlStr = addressstr.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) 
    let searchURL: NSURL = NSURL(string: urlStr! as String)! 
    do { 
     let newdata = try Data(contentsOf: searchURL as URL) 
     if let responseDictionary = try JSONSerialization.jsonObject(with: newdata, options: []) as? NSDictionary { 
      print(responseDictionary) 
      let array = responseDictionary.object(forKey: "results") as! NSArray 
      let dic = array[0] as! NSDictionary 
      let locationDic = (dic.object(forKey: "geometry") as! NSDictionary).object(forKey: "location") as! NSDictionary 
      latitude = locationDic.object(forKey: "lat") as! Double 
      longitude = locationDic.object(forKey: "lng") as! Double 
     } catch { 
     } 
    } 
    var center = CLLocationCoordinate2D() 
    center.latitude = latitude 
    center.longitude = longitude 
    return center 
} 
+0

to jest dla mapy google (odpowiedź w Ostatnie szybkie 3) –