如何将地点与 CLGeocoder 的结果相匹配?

Posted

技术标签:

【中文标题】如何将地点与 CLGeocoder 的结果相匹配?【英文标题】:How can I match the place with the result of CLGeocoder? 【发布时间】:2012-05-03 23:17:42 【问题描述】:

我可以通过CLGeocoderreverseGeocodeLocation:completionHandler:方法成功获得结果(如localityISOcountryCode等)。 但是如何才能将地点与结果相匹配呢?

例如:如果结果的城市(地区)是Hangzhou City,我可以简单地通过使用来匹配它

if ([placemark.locality isEqualToString:@"Hangzhou City"]) ...

但如您所知,有数百万个城市,不可能将城市名称一一获取并硬编码到我的应用程序中。

那么,有什么办法可以解决这个问题吗?或者是否存在任何框架?或者只有几个文件包含与CLGeocoder 的结果匹配的国家和城市名称?即使是模糊坐标匹配方案也可以(我的意思是,一个城市有自己的区域,我可以通过坐标确定城市,但我现在仍然需要得到每个城市的区域面积)。


部署目标ios5.0

【问题讨论】:

你想得到什么数据?通常,我们为此使用谷歌地图 API... @LordT 是的,我之前尝试过 GMaps API,同样的问题:数据是自定义的,我无法获取。所以我需要获取城市,然后将自定义数据添加到每个城市......当他/她到达一个城市时,用户将获得相应的数据。 你能解释一下你的目标是什么吗?您是否要遍历所有城市?您是否尝试存储用户访问城市的次数? if (...)here 里面是什么。 @Patrick 只是想在用户到达另一个城市时向用户展示一些有趣的地方。例如在“杭州市”,这个地区有 3 个苹果,在“加利福尼亚”(不确定名称),这个地区有 5 个橙子。 我建议尝试对用户所在的城市进行地理编码以获得CLPlacemark 对象。然后遍历areasOfInterest。虽然我不知道感兴趣的区域是如何确定的,但至少值得一试。 CLPlacemark 【参考方案1】:

还有一个更简单的方法,你可以使用反向 GeocodeLocation 来获取地点的信息。你必须知道这在每个城市都不会起作用。 有关详细信息,请查看 Apple 的 CLGeocoder Class Reference 和 Geocoding Location Data 文档。

因此您可以创建和处理服务的对象

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@interface locationUtility : NSObject<CLLocationManagerDelegate>
  CLLocationManager *locationManager;
  CLPlacemark *myPlacemark;
  CLGeocoder * geoCoder;


@property (nonatomic,retain) CLLocationManager *locationManager;

@end

和实现

#import "locationUtility.h"

@implementation locationUtility
@synthesize locationManager;

#pragma mark - Init
-(id)init 
  NSLog(@"locationUtility - init");
  self=[super init];

  locationManager = [[CLLocationManager alloc] init];
  locationManager.delegate = self;
  locationManager.desiredAccuracy = kCLLocationAccuracyBest;
  locationManager.distanceFilter = kCLDistanceFilterNone;
  [locationManager startMonitoringSignificantLocationChanges];
  geoCoder= [[CLGeocoder alloc] init];
  return self;


- (void) locationManager:(CLLocationManager *) manager didUpdateToLocation:(CLLocation *) newLocation
            fromLocation:(CLLocation *) oldLocation 
  [geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) 
     CLPlacemark *placemark = [placemarks objectAtIndex:0];
     myPlacemark=placemark; 
     // Here you get the information you need  
     // placemark.country;
     // placemark.administrativeArea;
     // placemark.subAdministrativeArea;
     // placemark.postalCode];
    ];


-(void) locationManager:(CLLocationManager *) manager didFailWithError:(NSError *) error 
  NSLog(@"locationManager didFailWithError: %@", error.description);


@end

【讨论】:

这就是我现在所做的,正如我在问题中描述的那样“不可能将城市名称和硬编码一个一个地输入到我的应用程序中。” 我需要让城市定义myPlacemark...无论如何感谢您的回答。 :)

以上是关于如何将地点与 CLGeocoder 的结果相匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MQ 服务器回复消息与正确的请求相匹配

如何将 Laravel .env 与 XAMPP 配置设置相匹配?

如何将文本框宽度与网格中的一组列相匹配?

当城市名称等于某个国家/地区的名称(不仅如此)时,CLGeocoder 返回错误的结果

为啥将 CLGeocoder 与“地标”数组一起使用?

如何让按钮的高度与另一个元素的高度相匹配?