【问题标题】:calculate distance between 2 coordinates iphone - best practice计算 2 个坐标 iphone 之间的距离 - 最佳实践
【发布时间】:2012-01-16 09:13:08
【问题描述】:

我正在完成一个应用程序,希望我需要向用户显示他与大约 500 个坐标之间的距离。

使用 CLLocation 方法计算,效果不错,但在 iPhone 4 中完成每个位置的计算大约需要 1 分钟。

最好的方法是什么?使用跨度?还有其他更快的方法吗?

谢谢大家,

【问题讨论】:

    标签: iphone distance cllocation cllocationdistance


    【解决方案1】:

    我认为 Sahgal 是对的,这里有一些代码,也许它会对你有所帮助。

    +(CGFloat)calculateDistanceBetweenSource:(CLLocationCoordinate2D)firstCoords andDestination:(CLLocationCoordinate2D)secondCoords 
    {
    
        // this radius is in KM => if miles are needed it is calculated during setter of Place.distance
    
        double nRadius = 6371;
    
        // Get the difference between our two points
    
        // then convert the difference into radians
    
        double nDLat = (firstCoords.latitude - secondCoords.latitude)* (M_PI/180);
        double nDLon = (firstCoords.longitude - secondCoords.longitude)* (M_PI/180);
    
        double nLat1 =  secondCoords.latitude * (M_PI/180);
        double nLat2 =  secondCoords.latitude * (M_PI/180);
    
        double nA = pow ( sin(nDLat/2), 2 ) + cos(nLat1) * cos(nLat2) * pow ( sin(nDLon/2), 2 );
    
        double nC = 2 * atan2( sqrt(nA), sqrt( 1 - nA ));
    
        double nD = nRadius * nC;
    
        NSLog(@"Distance is %f",nD);
    
        return nD; // converts to miles or not (if en_) => implicit in method
    }
    

    【讨论】:

      【解决方案2】:

      看过其他答案,不知道对不对,但我觉得有更好的解决方案:

      (from documentation):

      - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
      

      你可以这样使用它:

      - (CLLocationDistance) DistanceBetweenCoordinate:(CLLocationCoordinate2D)originCoordinate andCoordinate:(CLLocationCoordinate2D)destinationCoordinate {
      
              CLLocation *originLocation = [[CLLocation alloc] initWithLatitude:originCoordinate.latitude longitude:originCoordinate.longitude];
              CLLocation *destinationLocation = [[CLLocation alloc] initWithLatitude:destinationCoordinate.latitude longitude:destinationCoordinate.longitude];
              CLLocationDistance distance = [originLocation distanceFromLocation:destinationLocation];
              [originLocation release];
              [destinationLocation release];
      
              return distance;
          }
      

      【讨论】:

      • 我用过这段代码,但它使用数据网络,而且比使用@Marvin 选项慢。谢谢。
      • 是的,目前在里斯本。很高兴认识其他也是 iPhone 开发人员的人。
      • podemos falar por iChat: rui.lopes@me.com
      【解决方案3】:

      这是代码..

      -(NSString *)findDistanceBetweenTwoLatLon
      {
          int intEarthRadius = 3963;
      
          double dblLat1 = DegreesToRadians(firstLatitude);
          double dblLon1 = DegreesToRadians(firstLongitude);
      
          double dblLat2 = DegreesToRadians(secondLatitude);
          double dblLon2 = DegreesToRadians(secondLongitude);
      
          float fltLat = dblLat2 - dblLat1;
          float fltLon = dblLon2 - dblLon1;
      
          double a = sin(fltLat/2) * sin(fltLat/2) + cos(dblLat2) * cos(dblLat2) * sin(fltLon/2) * sin(fltLon/2) ;
          double c = 2 * atan2(sqrt(a), sqrt(1-a));
          double d = intEarthRadius * c;
      
          double dMeters = d * kOneMileMeters;
      
          NSString *strDistance = [NSString stringWithFormat:@"%1.2f meters",dMeters];
      
          return strDistance;
      }
      

      定义所有这个宏..

      度数为弧度

      #define DegreesToRadians(degrees) (degrees * M_PI / 180)
      

      在哪里 M_PI

      #define M_PI   3.14159265358979323846264338327950288 
      #define kOneMileMeters 1609.344
      

      【讨论】:

        【解决方案4】:

        您可以尝试另一种方法。您可以获取两个点的经纬度(假设经纬度查找不会花费那么多时间)并且有公式可以使用经纬度计算距离。

        【讨论】:

          猜你喜欢
          • 2010-09-26
          • 1970-01-01
          • 2014-11-27
          • 2020-02-12
          • 2018-06-12
          • 1970-01-01
          • 2014-02-19
          • 2021-09-08
          • 2020-06-02
          相关资源
          最近更新 更多