緯度と経度を使用してMKMapView
に注釈を配置できますが、位置を使用する必要があるというフィードは、緯度と経度の代わりに住所を使用しています。例:1234西1234東、サンフランシスコ、カリフォルニア州...
これは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];
}
}
];
リファクタリング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)
}
}
}
後は、geocodingまたはforward-geocodingと呼ばれます。 Reverse-geocodingは、lat/longペアを番地に変換するプロセスです。
iOS5は、ジオコーディング用に CLGeocoder クラスを提供します。 MKPlacemarkは、iOS> = 3.0でリバースゴーコーディングをサポートしています。もちろん関連するデータは非常に大きいため、通常、アプリは機能へのネットワークアクセスを必要とします。
開始するのに適した場所は、Appleの Location Awareness Programming Guide です。また、SOについてはこれに関する質問がたくさんあります。 https://stackoverflow.com/search?q=geocoding
幸運を!
スイフト版
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
クラスを使用して、アドレスからlong/latを取得できます。