如何过滤掉距离太近的坐标?

时间:2016-04-21 13:08:39

标签: ios objective-c arrays coordinates

我有一个像这样的坐标数组(它只是一个样本):

47.554730,18.963960
47.552670,18.962850
47.552310,18.963400
47.552080,18.963720
47.551870,18.964060
47.551780,18.963840
47.551690,18.963300
47.551540,18.962310
47.551480,18.961990
47.551440,18.961800

我想过滤掉彼此太靠近的坐标以减小尺寸。我怎样才能做到这一点?

我有个主意:

将数字设置为公差范围。 遍历数组中的每个坐标,检查它们之间的差异是否小于公差范围数,如果是,则删除其中一个坐标。

这会有用吗?如果是,我怎么能在Objective-C中编码?

2 个答案:

答案 0 :(得分:3)

您可以使用公差检查,但不应直接在纬度和经度值之间,它应该是纬度和经度所代表的地理位置之间的距离公差(以米为单位)。纬度和经度的性质意味着只能通过查看值来判断2点之间的物理距离。

要执行此操作,您可以从纬度/经度对创建CLLocation的实例,然后使用distanceFromLocation:来检查它们。

您需要决定如何选择要保留的位置和要删除的位置。有很多选择,其中许多选项需要多个循环以确保没有2个点彼此靠近。

答案 1 :(得分:0)

 NSArray *Array1 = @[@"47.551090,18.961610",
                    @"47.551010,18.961600",
                    @"47.550910,18.961600",
                    @"47.550830,18.961610",
                    @"47.550750,18.961640",
                    @"47.550690,18.961680",
                    @"47.549980,18.962870",
                    @"47.549170,18.964170",
                    @"47.548950,18.964500",
                    @"47.548840,18.964620",
                    @"47.548710,18.964690",
                    @"47.548470,18.964690",
                    @"47.548400,18.964690",
                    @"47.547990,18.964720"];

NSMutableArray *finalArr=[[NSMutableArray alloc] init];
CGFloat threshhold=0.0009;
for (NSString *str in Array1) {
    NSArray *temp=[str componentsSeparatedByString:@","];
    if(temp!=nil && [temp count]==2){
        BOOL isSame=NO;
        for(NSString *s in finalArr){
            NSArray *temp2=[s componentsSeparatedByString:@","];
            if(([[temp objectAtIndex:0] isEqualToString:[temp2 objectAtIndex:0]]) || ((((NSString*)[temp objectAtIndex:0])).floatValue-threshhold<=(((NSString*)[temp2 objectAtIndex:0])).floatValue && (((NSString*)[temp objectAtIndex:0])).floatValue+threshhold>=(((NSString*)[temp2 objectAtIndex:0])).floatValue)){
                isSame=YES;
                break;
            }

            if([[temp objectAtIndex:1] isEqualToString:[temp2 objectAtIndex:1]]){
                isSame=YES;
                break;
            }
        }

        if(isSame==NO){
            [finalArr addObject:str];
        }
    }
}
NSLog(@"%@",finalArr);

您可以根据需要设置阈值