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

Posted

技术标签:

【中文标题】在 iOS 中使用 CLGeocoder 进行转发地理编码,为某些位置的位置返回 null【英文标题】:Forward geocoding with CLGeocoder in iOS returning null for locality of certain locations 【发布时间】:2013-07-25 05:13:32 【问题描述】:

我正在尝试对字符串进行前向地理编码,它通常可以正常工作,但是对于某些位置,例如“温哥华”,它会为结果地标的位置返回 null,但它确实会返回国家、省、和坐标。我什至尝试对从前向地理编码中找到的坐标进行反向地理编码,虽然没有失败,但它返回了一个不同的位置,“穆迪港”。

最奇怪的是,我尝试通过 Apple 的 Geocoder 示例代码运行 Vancouver,它运行良好。位置不会出现空值。

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

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

-(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】:

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

优点:

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

缺点:

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

现在来到您的情况,我的猜测是由于互联网连接,您无法完全使用地理编码 API。可能这就是为什么你没有得到本地化的原因。

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

碰巧的是,正向地理编码器可以让您获得高水平 基于本地设备的国家、地区等信息 信息,但需要互联网连接才能获得更多信息 地点等信息。

【讨论】:

很好的答案,虽然我的互联网似乎很好。那么我唯一的问题是为什么它在 ios Geocoder 示例代码中有效? developer.apple.com/library/ios/#samplecode/GeocoderDemo/… 基本上相同的操作,相同的模拟器,大约在同一时间完成,互联网运行良好,许多其他位置运行良好,但当我搜索温哥华时没有城市名称(我还没有找到其他为我做这件事的地方,但想必不止一个) 我试过你的代码,它返回了我的位置。我不知所措。您能否告诉我您在 textfield.text 中使用的确切 NSString。我用温哥华,它给了我当地的感觉。 在“温哥华”中使用了多种不同的变体。就像我说的,在同一个模拟器上运行的 Apple 示例代码似乎总是可以正常工作,但大多数时候我的代码不起作用。有一次它似乎开始正常工作,但后来我无法重现。 您的代码在我看来运行良好。我可以建议延迟一段时间吗?因为地理编码需要时间并且它发生在另一个线程上。您必须调用某种方法来创建/标记注释。您可以在延迟一段时间后调用该方法 [self performSelector:@select(createAnnotation:) withObject:nil afterDelay:5.0];您可以在方法执行之前显示活动指示器视图...

以上是关于在 iOS 中使用 CLGeocoder 进行转发地理编码,为某些位置的位置返回 null的主要内容,如果未能解决你的问题,请参考以下文章

CLGeocoder 延迟直到完成处理程序

CLGeocoder 在 iOS8 上强制使用特定语言

如何在 iOs 中使用 CLGeoCoder 使用邮政编码/邮政编码获取纬度经度?

iOS - 没有互联网连接的 CLGeocoder

XCode 4.3 使用错误链接的 dylib 构建 iOS 应用程序(未找到符号:_OBJC_CLASS_$_CLGeocoder)

对许多地址进行地理编码 - CLGeocoder