如何过滤掉太近的坐标



我有一个这样的坐标数组(这只是一个示例):

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 点之间的物理距离。

为此,您可以从经度

/经度对创建CLLocation实例,然后使用distanceFromLocation:来检查它们的公差。

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

 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);

您可以根据需要设置阈值

最新更新