0

私は現在、地図に注釈を付けると、タイトルとサブタイトルが表示され、サブタイトルに緯度/経度/半径の情報が表示されるアプリを持っています。

 -(NSString *)title{
    return @"Saved position";
}

   - (NSString *)subtitle {
        return [NSString stringWithFormat: @"Lat: %.4F, Lon: %.4F, Rad: %.1fm",
        self.coordinate.latitude, self.coordinate.longitude, self.radius];
    }

    -(id)initWithCoordinate:(CLLocationCoordinate2D) coor{
        self.coordinate=coor;
        NSLog(@"%f,%f",coor.latitude,coor.longitude);
        return self;
    }

住所が表示されるように字幕行を変更したいのですが。これがCLGeocoderを使用した逆ジオコーディングであることは知っていますが、これを適切に行う方法がわかりません。私はオンラインで多くの例を見て、アップルの開発サイトを見てきましたが、それは少し圧倒的です。この初心者プログラマーには、どんな助けでも本当に感謝しています。

4

1 に答える 1

0

私はこれを解決し、私がそれをどのように行ったかを共有したいと思いました:

RegionAnnotation.h

#import <MapKit/MapKit.h>
#import <CoreFoundation/CoreFoundation.h>

@interface RegionAnnotation : NSObject <MKAnnotation, CLLocationManagerDelegate>

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, readonly, copy) NSString *subtitle;
@property (nonatomic, readonly, copy) NSString *title;

//Reverse Geocoding
@property(nonatomic, readonly) CLPlacemark *administrativeArea;//The state
@property(nonatomic, readonly) CLPlacemark *locality; //The city 
@property(nonatomic, readonly) CLPlacemark *subThoroughfare;//Street number
@property(nonatomic, readonly) CLPlacemark *thoroughfare;//Street address

@end

RegionAnnotation.m

#import "RegionAnnotation.h"
#import <AddressBookUI/AddressBookUI.h>

@implementation RegionAnnotation

@synthesize coordinate = _coordinate, subtitle = _subtitle, title = _title, administrativeArea = _administrativeArea, location = _location, locality = _locality, subThoroughfare = _subThoroughfare, thoroughfare = _thoroughfare;

- (id)init
{
    self = [super init];

    return self;    
}

- (void) setCoordinate:(CLLocationCoordinate2D)newCoordinate
{
    _coordinate = newCoordinate;
}

- (NSString *)title {
    return @"Monitored Region";
}

- (void) setSubtitle:(NSString *)newSubtitle
{
    _subtitle = newSubtitle;
}

-(void)reverseGeocodeLocation:(CLPlacemark *)placemark
{

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    CLLocationCoordinate2D coord = self.coordinate;

    CLLocation *location = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];

    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        CLPlacemark *placemark = [placemarks objectAtIndex:0];

        NSLog(@"%@ %@ %@ %@",
              placemark.subThoroughfare,
              placemark.thoroughfare,
              placemark.locality, 
              placemark.administrativeArea);
    }];
}


- (NSString *)getAddress {
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    CLLocation *location = [[CLLocation alloc] initWithLatitude:self.coordinate.latitude longitude:self.coordinate.longitude];
    NSString *geoAddress = [[NSString alloc] init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");
        if (error){
            NSLog(@"Geocode failed with error: %@", error);
//            [self displayError:error];
            return;
        }
        NSLog(@"getAddress Received placemarks: %@", placemarks);
        CLPlacemark *placemark = [placemarks objectAtIndex:0];
         // use the AddressBook framework to create an address dictionary
         NSString *addressString = ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO);        
        _subtitle = addressString;
    }];

    return geoAddress;

}


@end

I currently have the user do a long push to create an annotation on the map view. Now when the user selects the pin by pressing it, it shows the physical address instead of the longitude and latitude.

I hope this helps all others who have been searching for a way to do this.

于 2012-08-14T16:43:45.863 に答える