2016-04-21 89 views
0

我有像这样的坐标的阵列(它只是一个样品):如何过滤掉过近的坐标?

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中编码?

+0

你的数组不应该这样。如果左列是纬度而右是经度。它应该是我认为的字典阵列或数组字典。或者应该有两个不同的经纬度数组 – Lion

+0

你应该输出什么? –

+0

有一个原因就是这样,谢谢你的建议! –

回答

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

您可以根据您的要求

+0

如果声明 – Wain

+1

还指出,2个不同经度的纬度相等的纬度可能在现实世界中相差很多英里,您可能会赢得最不可读的奖励...... – Wain

3

您可以使用一个公差检查设定的阈值,但它不应该是纬度和经度值之间的直接,它应该是在距离公差,以米为单位,以纬度和经度表示的地理位置之间。经纬度的本质意味着仅仅通过查看数值就无法确定2点之间的物理距离。

为此,您可以从经度/纬度对创建CLLocation的实例,然后使用distanceFromLocation:来容差检查它们。

您需要决定如何选择要保留的位置和要丢弃的位置。对此有很多选择,其中很多需要多个循环来确保没有2个点彼此靠近。