我可以使用经纬度在我的MKMapView
上标注,但是我的源数据中需要使用街道地址而不是经纬度,例如:1234 west 1234 east, San Francisco, CA ...
这是否与CLLocationManager
有关?
有人之前尝试过这个吗?
我可以使用经纬度在我的MKMapView
上标注,但是我的源数据中需要使用街道地址而不是经纬度,例如:1234 west 1234 east, San Francisco, CA ...
这是否与CLLocationManager
有关?
有人之前尝试过这个吗?
参考了psoft提供的优质信息,我使用以下代码达到了我想要的效果。
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];
}
}
];
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(placemark.coordinate, 5000, 5000);
(这里的5000以米为单位)。 - user467105firstObject
而不是 objectAtIndex:0
。 - Laszloif (placemarks && placemarks.count > 0)
是多余的,因为如果 placemarks
是 nil
,则 placemarks.count
将返回 0
。可以用 if (placemarks.count > 0)
替换它。 - hhanesand重构后的 Swift 版本:
let location = "some address, state, and zip"
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(location) { [weak self] placemarks, error in
if let placemark = placemarks?.first, let location = placemark.location {
let mark = MKPlacemark(placemark: placemark)
if var region = self?.mapView.region {
region.center = location.coordinate
region.span.longitudeDelta /= 8.0
region.span.latitudeDelta /= 8.0
self?.mapView.setRegion(region, animated: true)
self?.mapView.addAnnotation(mark)
}
}
}
你需要的是所谓的地理编码或正向地理编码。 反向地理编码是将纬度/经度对转换为街道地址的过程。
iOS5提供了CLGeocoder类进行地理编码。MKPlacemark支持iOS >= 3.0的反向地理编码。当然,涉及的数据非常大,因此您的应用程序通常需要网络访问功能。
一个很好的起点是苹果公司的位置感知编程指南。此外,在SO上有很多关于这个问题的问题。https://stackoverflow.com/search?q=geocoding
祝你好运!
Swift 版本
let location = self.txtLocation.text;
let geocoder:CLGeocoder = CLGeocoder();
geocoder.geocodeAddressString(location!) { (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.mkMapView.region;
region.center = (placemark.location?.coordinate)!;
region.span.longitudeDelta /= 8.0;
region.span.latitudeDelta /= 8.0;
self.mkMapView.setRegion(region, animated: true);
self.mkMapView.addAnnotation(placemark);
}
}
这里是另一个版本...
func map() {
let 5km:CLLocationDistance = 5000
let a= "100 smith avenue some town 90210 SD"
let g = CLGeocoder()
g.geocodeAddressString(a) { [weak self] placemarks, error in
if let p = placemarks?.first, let l = placemark.location {
let p = MKPlacemark(coordinate: l.coordinate, addressDictionary: nil)
let cr = MKCoordinateRegionMakeWithDistance(l.coordinate, 5km, 5km)
let options = [
MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: cr.center),
MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: cr.span)
]
let m = MKMapItem(placemark: p)
m.name = "Your House"
m.openInMaps(launchOptions: options)
}
}
}
这是不可能的。但是您可以使用CLGeocoder
类从地址获取经纬度。