-->

iPhone的iOS5 CLGeocoder如何解析地址大(200)设置?(iPhone iOS5

2019-06-24 11:56发布

我有一大套的约200地址,我需要知道他们的经度和纬度。 我创建了解析地址的方法,现在我试图让使用这些地址坐标CLGeocoder

我目前的做法是创建并行地理编码器,让他们做他们的魔法。 我注意到,他们每个人似乎需要单独的线程。 (所以我看到多达100个线程在一个点)。

我快到的问题是,在某些时候(后约50个地址),地址解析中断返回任何地点标记,以及

NSLog(@"Address not recognized: *%@*",[htc objectForKey:kAddressKey]);

被调用。 这是一个数量的线程或内置CLGeocoder限制的限制吗? 难道是因为我没有正确清理地理编码,需要某种形式的自动释放语句(ARC)的?

- (无效)geocodeArray:(NSMutableArray的*)数组{

    NSMutableDictionary* htc = nil;
    objectsToGeocode = array.count;

    NSDictionary *htcDictionary =nil;
     for (int i = 0; i<array.count;i++) {
         htcDictionary = [array objectAtIndex:i];

        //create an updated dictionary that would hold the reverse geocoding location
        htc = [[NSMutableDictionary alloc] initWithDictionary:htcDictionary];
        NSLog(@"geocoding: %@",[htc objectForKey:kAddressKey]);

        CLGeocoder* geoCoder = [[CLGeocoder alloc] init];
        [geoCoder geocodeAddressString:[htc objectForKey:kAddressKey] completionHandler:^(NSArray *placemarks, NSError *error) {

            if(placemarks.count>0)
            {
                NSLog(@"Found placemarks for %@",[htc objectForKey:kAddressKey]);
                CLPlacemark* placemark =  [placemarks objectAtIndex:0];
                MyLocation *annotation = [[MyLocation alloc]
                                          initWithName:[htcDictionary objectForKey:kNameKey]
                                          address:[htcDictionary objectForKey:kAddressKey]
                                          coordinate:placemark.location.coordinate] ;
                annotation.faxNumber = [htc objectForKey:kFaxKey];
                annotation.phoneNumber = [htc objectForKey:kPhoneKey];
                annotation.website = [htc objectForKey:kWebsiteKey];
                annotation.type = [htc objectForKey:kFacilityTypeKey];
                [_mapView addAnnotation:annotation];  


                double placemarkToUserDistance = [self._mapView.userLocation.location distanceFromLocation:placemark.location] ;
                //convert distance to miles
                placemarkToUserDistance =placemarkToUserDistance/ 1000/ kKilometersPerMile;

                [htc setObject:[NSNumber numberWithDouble:placemarkToUserDistance] forKey:kDistanceToUserKey];
                [htc setObject:[NSNumber numberWithDouble:placemark.location.coordinate.latitude] forKey:kLatitudeKey];
                 [htc setObject:[NSNumber numberWithDouble:placemark.location.coordinate.longitude] forKey:kLongitudeKey];
                NSAssert([htc objectForKey:kLatitudeKey]!=nil,@"kLatitudeKey is not saved!");
                NSAssert([htc objectForKey:kLongitudeKey]!=nil,@"kLongitudeKey is not saved!");

            }else {
                NSLog(@"Address not recognized: *%@*",[htc objectForKey:kAddressKey]);
            }


            [self.dataSource addObject:htc];

            if(++geocodingCount >=objectsToGeocode){
                NSLog(@"%@",self.dataSource);
                    [self saveGeocoding];

            }

        } ];


        //        [temp addObject:htcDictionary];
    }

}

为了验证这是否是一个线程问题,我创造了这个方法,这样会将我的大数据集到5个阵列,并尝试进行地理编码它们的块。 我注意到,第一请求通过,以及一第二个的一部分。 但是,一旦魔数(约50)到达,地理编码停止。

什么可能会发生什么想法? 这是对地理编码操作次数苹果施加的限制? 我应该增加请求之间的延迟或尝试运行应用5个独立的时间和拼凑的结果通过手?

-(void)geocodeDatasource
{

        //I'm trying to build a file with coordinates of addresses and include it with the app
        geocodingCount = 0;
        self.dataSource = [[NSMutableArray alloc] initWithCapacity:self.arrayForGeocodingInitialJSON.count+5];
        haveToEmailInitialResults = YES;


    //attempt to geocode in batches

     float numberOfArrays = 5.0;
    NSMutableArray* array1 = [[NSMutableArray alloc] initWithCapacity:arrayForGeocodingInitialJSON.count/numberOfArrays];
    NSMutableArray* array2 = [[NSMutableArray alloc] initWithCapacity:arrayForGeocodingInitialJSON.count/numberOfArrays];
    NSMutableArray* array3 = [[NSMutableArray alloc] initWithCapacity:arrayForGeocodingInitialJSON.count/numberOfArrays];
    NSMutableArray* array4 = [[NSMutableArray alloc] initWithCapacity:arrayForGeocodingInitialJSON.count/numberOfArrays];
    NSMutableArray* array5 = [[NSMutableArray alloc] initWithCapacity:arrayForGeocodingInitialJSON.count/numberOfArrays];

    for(int i = 0 ;i<arrayForGeocodingInitialJSON.count;i++)
    {
        id object = [arrayForGeocodingInitialJSON objectAtIndex:i];
        if(i<arrayForGeocodingInitialJSON.count*(1/numberOfArrays))
        {
            [array1 addObject:object];
        }else if(i>=arrayForGeocodingInitialJSON.count/numberOfArrays && i<arrayForGeocodingInitialJSON.count*(2/numberOfArrays))
        {
            [array2 addObject:object];
        }else if(i>=arrayForGeocodingInitialJSON.count*(2/numberOfArrays) && i<arrayForGeocodingInitialJSON.count*(3/numberOfArrays))
        {
            [array3 addObject:object];
        }else if(i>=arrayForGeocodingInitialJSON.count*(3/numberOfArrays) && i<arrayForGeocodingInitialJSON.count*(4/numberOfArrays))
        {
            [array4 addObject:object];
        }else if(i>=arrayForGeocodingInitialJSON.count*(4/numberOfArrays) && i<arrayForGeocodingInitialJSON.count)
        {
            [array5 addObject:object];
        }



    }

    //simple delays eliminate the need for extra variables and notifications
        [self geocodeArray:array2];

        [self performSelector:@selector(geocodeArray:) withObject:array1 afterDelay:15];
        [self performSelector:@selector(geocodeArray:) withObject:array3 afterDelay:30];
        [self performSelector:@selector(geocodeArray:) withObject:array4 afterDelay:45];
        [self performSelector:@selector(geocodeArray:) withObject:array5 afterDelay:45];
}

谢谢!

Answer 1:

你不能马上地理编码大集。 iOS的扼杀你。 我看到的iOS限制你到50次定位的时间,与“时间”因素是未知的。

我也有过类似的问题,但我只需要一个序列,需要时间的用户呈现的地理编码数据,我排队我所有的geocodings。

有效地,我的地理编码25块 - 在一个时间在半秒每个之间的大约的间隔显示结果给用户1。 当我有少于4个留给显示,我将地理编码的下一个25这样继续下去,直到一切都被地理编码(或在我的情况下,无限期)。

如果你需要拥有的一切在一次地理编码,您需要将您的链带geocodings每块之间的延迟在一起,表现出某种繁忙的指标,直到你完成。 这可能需要一些时间处理大量geocodings的。



Answer 2:

答案是你违反了苹果的地理编码器的TOS。

从CLGeocoder文档。

应用程序应该意识到他们是如何利用地理编码。 以下是有效地使用这个类的一些经验法则:

发送的任何一个用户动作最多一个地址解析请求。 如果用户执行了涉及地理编码相同的位置的多个动作,重复使用从最初的地址解析请求,而不是开始对于每个动作的各个请求的结果。 当你想自动更新用户的当前位置(例如,当用户在移动时),发行新的地址解析请求,只有当用户移动一个显著的距离后的一段合理的时间已经过去了。 例如,在一个典型的情况,你不应该发送超过每分钟一个地址解析请求。 不要在同一时间启动地址解析请求时,用户将不会立即看到结果。 例如,如果你的应用是不活动或在后台不启动的请求。

苹果将​​其权利范围内很好地停止提供回应,完全切断你的应用程序,甚至撤销你的开发者帐户。

如果您需要快速处理如此大量的地址,那么你应该看看越来越像事实服务利息或数据科学工具包的要点邮政地址和地理区域。


更新

下面是API文档Places API的-解决 ,这是事实的地方地理编码器。


更新2

下面是API 街道地址到坐标 ,这就是数据科学工具包的位置地理编码器。



文章来源: iPhone iOS5 CLGeocoder how to geocode a large (200) set of addresses?