使用iOS中的CLGeocoder进行前向地理编码,为某些位置的位置返回null

时间:2013-07-25 05:13:33

标签: ios geocoding core-location clgeocoder mkplacemark

我正在尝试对字符串执行前向地理编码,它通常可以正常工作,但是对于某些位置,例如“温哥华”,它会为所得到的地标的位置返回null,但它会返回国家/地区,省,和坐标。我甚至尝试对从前向地理编码中找到的坐标进行反向地理编码,虽然没有失败,但它返回了另一个位置,“Port Moody”。

最奇怪的是,我尝试通过Apple的Geocoder示例代码运行温哥华,它的工作正常。该地区不会出现空位。

另外,我正在测试它,它突然开始工作,然后我再次检查它停止工作。是什么给了什么?

这是我的代码。怀疑它会有多大帮助。

-(BOOL) textFieldShouldReturn:(UITextField *)textField {
     CLGeocoder *geocoder = [[CLGeocoder alloc] init];

     [geocoder geocodeAddressString:textField.text completionHandler:^(NSArray *placemarks, NSError *error) {
    self.placemark = [[MKPlacemark alloc] initWithPlacemark:[placemarks objectAtIndex:0]];
    if (error) {
        NSLog(@"Geocode error %@",error.debugDescription);
        [self alertForFailedGeocode];
        return;
    }
    if (self.placemark.locality == nil || self.placemark.country == nil) {
        //eg if you search "Canada" you'll get a nil locality, and the coordinate is in the middle of nowhere.

        if (self.placemark.location) {
            [geocoder reverseGeocodeLocation:self.placemark.location completionHandler:^(NSArray *placemarks, NSError *error) {
                if (error) {
                    [self alertForFailedGeocode];
                    return;
                }

                self.placemark = [placemarks objectAtIndex:0];
                [self alertForConfirmGeocode:[self locationStringForPlacemark:self.placemark]];
                self.location = self.placemark.location;
                self.isUsingCurrentLocation = FALSE;
                return;
            }];
            return;
        }
        else {
            NSLog(@"Geocode failed BECAUSE nil locality or country or both");
            [self alertForFailedGeocode];
            return;
        }
    }

    NSLog(@"%d places found",placemarks.count);
    [self alertForConfirmGeocode:[self locationStringForPlacemark:self.placemark]];
    self.location = self.placemark.location;
    self.isUsingCurrentLocation = FALSE;
}];
return YES;

}

1 个答案:

答案 0 :(得分:2)

地理编码操作不在设备上处理,需要互联网连接,因为它们发生在云端。它有其优点和缺点。

优点:

  
      
  1. 保存您的设备资源,因为转换是在Cloud上进行的。
  2.   
  3. 随着技术的进步,Apple可以在云上更新他们的API,这可以让我们的应用程序获得更好的性能,甚至无需改变   代码中的任何内容。
  4.   

缺点:

  

您需要可靠的互联网连接才能访问地理编码API。

现在达到你的条件,我的猜测是由于互联网连接,你无法完全使用地理编码API。可能就是这就是为什么你没有得到这个地方。

那么问题是你如何获得国家,省和坐标?

  

当它发生时,前向地理编码器可以让你达到高水平   基于本地设备的国家,地区等信息   信息,但它需要互联网连接以获得更多   地方等信息。