9

我有一个顶部MKMapView有一个UISearchBar的,我希望用户能够输入一个地址,并找到该地址并在其上放置一个图钉。我不知道的是如何将地址字符串变成经纬度,这样我就可以制作一个CLLocation对象了。有谁知道我该怎么做?

4

4 回答 4

18

你可能会在这个问题中找到答案。

iOS - MKMapView 使用地址而不是 lat / long By User 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];
                 }
             }
         ];

一个非常简单的解决方案。但仅适用于 iOS5.1 或更高版本。

于 2014-08-01T10:10:31.607 回答
3

我使用了类似 Vijay 的方法,但不得不调整一行代码。region.center = placemark.region.center对我不起作用。也许我的代码也可以帮助某人:

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)
    }
}) 
于 2016-03-12T20:59:02.180 回答
1

对于 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)
            }
        })
于 2015-12-16T05:26:52.363 回答
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
}
于 2017-03-31T14:14:03.413 回答