4

アプリデリゲートからユーザーの緯度と経度の座標を取得するビューコントローラーがあります。これはうまく機能しますが、ユーザーの都市、州、タイムゾーンも必要です。これにはCLGeocoderを使用する必要があることはわかっていますが(コードの最後のチャンクを参照してください)、それを組み合わせる方法がわかりません。都市、州、タイムゾーンのNSStringが必要です。誰かがポインタや例を持っていますか?ありがとうございました!

App Delegateでは、CCLocationManagerを使用して次のような座標を取得します。

- (NSString *)getUserCoordinates
{
    NSString *userCoordinates = [NSString stringWithFormat:@"latitude: %f longitude: %f", 
    locationManager.location.coordinate.latitude, 
    locationManager.location.coordinate.longitude];
    locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
    [locationManager startUpdatingLocation];
    return userCoordinates;
}

- (NSString *)getUserLatitude
{
    NSString *userLatitude = [NSString stringWithFormat:@"%f", 
    locationManager.location.coordinate.latitude];
    return userLatitude;
}

- (NSString *)getUserLongitude
{
    NSString *userLongitude = [NSString stringWithFormat:@"%f", 
    locationManager.location.coordinate.longitude];
    return userLongitude;
}

私のViewControllerでは、次のようにしてユーザーの緯度と経度をNSStringとして取得します。

NSString *userLatitude =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserLatitude];

NSString *userLongitude =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserLongitude];

都市、州、タイムゾーンを取得したいと思います。CLGeocoderが必要なことは理解していますが、それを融合する方法がわかりません。

CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, 
NSError *error) {
    for (CLPlacemark * placemark in placemarks) {
        NSString *locality = [placemark locality];
    }
}
4

4 に答える 4

12

いくつかのこと、ブランドン:

1) CLLocationManager は、座標のリクエストに対してすぐに応答しない場合があります。ビュー コントローラーを CLLocationManager デリゲートとして設定する必要があります。その後、場所の更新が行われると (メソッドに含まれlocationManager:didUpdateLocations:ます)、CLGeocoder メソッドを実行できます。

2)

私はこのように書いた:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    NSLog( @"didUpdateLocation!");
    NSLog( @"latitude is %@ and longitude is %@", [self getUserLatitude], [self getUserLongitude]);

    CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray *placemarks, NSError *error) {
        for (CLPlacemark * placemark in placemarks) {
            NSString * addressName = [placemark name];
            NSString * city = [placemark locality]; // locality means "city"
            NSString * administrativeArea = [placemark administrativeArea]; // which is "state" in the U.S.A.

            NSLog( @"name is %@ and locality is %@ and administrative area is %@", addressName, city, administrativeArea );
        }
    }];
}

場所のタイムゾーンを取得するのは少しトリッキーです。iOS内でそれを取得するためのAPIまたはサンプルコードがあるに違いありませんが、それはCLPlacemark APIの一部ではありません.

于 2013-03-09T07:27:24.827 に答える
2

緯度と経度の double 値から CLLocation を形成します。次に、その場所を reverseGeocodeLocation:completionHandler にフィードします。

メソッド reverseGeocodeLocation:completionHandler: は非同期であることにも注意してください。

また、CLLocationManagerDelegate のlocationManager:didUpdateHeading: を使用して、使用可能な Location がある場合に非同期に更新することもできます。

とにかくあなたのアプローチに従って、AppDelegateからコードの一部を変更するだけです

- (double)getUserLatitude
{
    return retrun locationManager.location.coordinate.latitude;
}

- (double)getUserLongitude
{
    retrun locationManager.location.coordinate.longitude;
}

-(CLLocationManager*) getLocationManager
{
    return locationManager;
}

ここで Location オブジェクトを作成します

double latt = [(PDCAppDelegate *)[UIApplication sharedApplication].delegate getUserLatitude];

double longt = [(PDCAppDelegate *)[UIApplication sharedApplication].delegate getUserLongitude];
CLLocation loc = [[CLLocation alloc] initWithLatitude:latt longitude:longt]

または、CLLocationManager から場所オブジェクトを直接取得できます

CLLocation loc = [(PDCAppDelegate *)[UIApplication sharedApplication].delegate getLocationManager].location;

次に、場所を提供するコードを使用して、reverseGeocodeLocation:completionHandler: を取得し、CLPlaceMarkを取得できます。

[geoCoder reverseGeocodeLocation:loc completionHandler:^(NSArray *placemarks, 
NSError *error) {
    for (CLPlacemark * placemark in placemarks) {
        NSString *locality = [placemark locality];
        NSString * name =    [placemark name];
        NSString  *country  = [placemark country];
        /*you can put these values in some member vairables*/

        m_locality = [placemark locality];
        m_name =    [placemark name];
        m_country  = [placemark country];
    }
}
于 2013-03-09T07:54:45.660 に答える
0

タイムゾーンの問題の解決策はありませんが(この質問に回答した他の人に同意します-Apple以外のAPIを探してください)、興味のある人のためにSwiftで回答を提供すると思いました:

func provideGeocodedStringForLocation(location: CLLocation, withCompletionHandler completionHandler: (String) -> ()) {
  let geocoder = CLGeocoder()
  geocoder.reverseGeocodeLocation(location) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in
    guard let placemarks = placemarks where placemarks.count > 0 && error == nil else {
      if let error = error { print(error.localizedDescription) }
      completionHandler("Earth")
      return
    }

    let city = placemarks[0].locality ?? ""
    let state: String
    if let adminArea = placemarks[0].administrativeArea {
      state = ", \(adminArea)"
    } else {
      state = ""
    }

    completionHandler("\(city)\(state)") // produces output similar to "Boulder, CO"
  }
}

// get the lat/long from your UIAppDelegate subclass
let latitude = CLLocationDegrees("40.0176")
let longitude = CLLocationDegrees("-105.28212")
let location = CLLocation(latitude: latitude, longitude: longitude)

provideGeocodedStringForLocation(location) { print($0) }
于 2016-01-12T00:43:36.277 に答える