我有一个这样的坐标数组(这只是一个示例):
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);
您可以根据需要设置阈值