6

以下のコードを使用して、現在の都市と国を取得しようとしてCLLocationManagerいます-

#pragma mark - Core Location Delegate Methods
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    CLGeocoder *reverseGeocoder = [[CLGeocoder alloc] init];

    [reverseGeocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error)
     {
         NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");
         if (error){
             NSLog(@"Geocode failed with error: %@", error);
             return;
         }

         NSLog(@"Received placemarks: %@", placemarks);


         CLPlacemark *myPlacemark = [placemarks objectAtIndex:0];
         NSString *countryCode = myPlacemark.ISOcountryCode;
         NSString *countryName = myPlacemark.country;
         NSString *city1 = myPlacemark.subLocality;
         NSString *city2 = myPlacemark.locality;
         NSLog(@"My country code: %@, countryName: %@, city1: %@, city2: %@", countryCode, countryName, city1, city2);
     }];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    CLLocationDirection th=[newHeading trueHeading];
    NSLog(@"True Heading value is=%f",th);
    CLLocationDirection magnetic=[newHeading magneticHeading];
    NSLog(@"Magnetic Heading value is=%f",magnetic);
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSString *errorType = (error.code == kCLErrorDenied) ? NSLocalizedString(@"access_denied", @"") : NSLocalizedString(@"unknown_error", @"");
    UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle:NSLocalizedString(@"error_getting_location", @"")
                      message:errorType
                      delegate:nil
                      cancelButtonTitle:NSLocalizedString(@"ok", @"")
                      otherButtonTitles:nil];
    [alert show];
}

それは常に-で結果を出します

私の国コード:IN、countryName:インド、city1 :( null)、city2 :( null)

これで何が問題になるのかわかりません。を使用して都市名を取得できないこの問題に直面した人はいますかCLLocationManager

4

4 に答える 4

7

編集:

- (void) getReverseGeocode
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    if(currentLatLong.count > 0)
    {
        CLLocationCoordinate2D myCoOrdinate;

        myCoOrdinate.latitude = LatValue;
        myCoOrdinate.longitude = LangValue;

        CLLocation *location = [[CLLocation alloc] initWithLatitude:myCoOrdinate.latitude longitude:myCoOrdinate.longitude];
        [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error)
         {
             if (error)
             {
                 NSLog(@"failed with error: %@", error);
                 return;
             }
             if(placemarks.count > 0)
             {
                 NSString *MyAddress = @"";
                 NSString *city = @"";

                 if([placemark.addressDictionary objectForKey:@"FormattedAddressLines"] != NULL)
                     MyAddress = [[placemark.addressDictionary objectForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
                 else
                     MyAddress = @"Address Not founded";

                 if([placemark.addressDictionary objectForKey:@"SubAdministrativeArea"] != NULL)
                     city = [placemark.addressDictionary objectForKey:@"SubAdministrativeArea"];
                 else if([placemark.addressDictionary objectForKey:@"City"] != NULL)
                     city = [placemark.addressDictionary objectForKey:@"City"];
                 else if([placemark.addressDictionary objectForKey:@"Country"] != NULL)
                     city = [placemark.addressDictionary objectForKey:@"Country"];
                 else
                     city = @"City Not founded";

               NSLog(@"%@",city);
               NSLog(@"%@", MyAddress);
             }
         }];
    }
}
于 2013-03-07T12:00:02.967 に答える
0

.hファイル内

#import <CoreLocation/CoreLocation.h>

@interface ClassDemo : NSObject<NSXMLParserDelegate,CLLocationManagerDelegate>
{
BOOL got;
BOOL needParser;
NSMutableArray *currentplaceArray; 
}
@property (nonatomic, retain) CLLocation  *currentLocation;
@property (nonatomic, getter = isResultsLoaded) BOOL resultsLoaded;
@property (strong, nonatomic)  CLLocationManager *locationManager;
@property (strong, nonatomic) CLGeocoder *geoCoder;

.mで

@synthesize locationManager,currentLocation;
- (void)viewDidLoad 
{
 got=NO;
needParser=YES;

currentplaceArray=[[NSMutableArray alloc]init];
//******** Location MAnager Allocation And Intialization********//
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate=self;
[locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation
{

if ([self isResultsLoaded])
{
    return;
}

[self setResultsLoaded:YES];

currentLocation = newLocation;
NSLog(@"%@",currentLocation);

NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat: @"http://maps.googleapis.com/maps/api/geocode/xml?latlng=%f,%f&sensor=false",newLocation.coordinate.latitude,newLocation.coordinate.longitude]]];

[parser setDelegate:self];
[parser parse];

}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"%@",elementName);
if([elementName isEqualToString:@"formatted_address"])
{
    got = YES; //got is a BOOL
}
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if(got&&needParser){
    got=NO;
    NSLog(@"the address is = %@",string);
    NSArray *tempPlaceArray=[string componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@",/"]];
    NSLog(@"%@",tempPlaceArray);
    for(int i=0; i <[tempPlaceArray count]; i++)
    {


        NSString *tempString=[[tempPlaceArray objectAtIndex:i]stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        NSLog(@"%@",tempString);
        if (![currentplaceArray containsObject:tempString])
        {
            if ([tempString length]!=0)
            {
                [currentplaceArray addObject:tempString];

            }
        }
    }
    needParser=NO;
    TempLocation *obj=[[TempLocation alloc]init];
    obj.countryName=[currentplaceArray objectAtIndex:[currentplaceArray count]-1];
    obj.stateName=[currentplaceArray objectAtIndex:[currentplaceArray count]-2];
    obj.cityName=[currentplaceArray objectAtIndex:[currentplaceArray count]-3];
    obj.fullAdd=string;
    [[Database getDBObject]insertIntoCurrentLocationTable:obj.cityName :obj.stateName :obj.countryName:obj.fullAdd];


}

}

一時ストレージ用の一時ロケーションクラスを作成します。また、としてデータベースに保存することもできます。コーディングをお楽しみください。

于 2013-03-07T12:20:21.840 に答える
0

アップルマップとその場所のデータベースについて知っているので、逆ジオコーディングのより正確で詳細な情報を取得するには、googlePlacesAPIを試してみてください。地名の自動入力についても同じことを試しましたが、機能しませんでした。そのため、google Places apiを使用しました。もう1つ、無料のapitrygeonames.orgがあります。

于 2013-03-07T12:14:54.213 に答える
0

私も同じ問題に気づきました。多くのトレイルとエラーの後、私は使用していたwifiに問題があることに気づきました。信号強度が低い場合は、都市がゼロになります。接続を変更してみてください。

于 2013-10-19T07:56:36.137 に答える