首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算CLLocationDistance的中心坐标

如何计算CLLocationDistance的中心坐标
EN

Stack Overflow用户
提问于 2013-05-31 13:27:27
回答 3查看 4.5K关注 0票数 2

我想要计算我的位置和一些注释之间的中心点。到目前为止,我已经这样做了:

代码语言:javascript
复制
CLLocation *myLoc = self.locMgr.location;

        MKPointAnnotation *middleAnnotation = [locationV.annotations objectAtIndex:locationV.annotations.count/2];

        CLLocation *someStuiodLoc = [[CLLocation alloc] initWithLatitude:middleAnnotation.coordinate.latitude longitude:middleAnnotation.coordinate.longitude];

        CLLocationDistance dist = [myLoc distanceFromLocation:someStuiodLoc];

如何计算"dist“的中心点/坐标??

EN

回答 3

Stack Overflow用户

发布于 2013-05-31 14:32:37

代码语言:javascript
复制
#define ToRadian(x) ((x) * M_PI/180)
#define ToDegrees(x) ((x) * 180/M_PI)

+ (CLLocationCoordinate2D)midpointBetweenCoordinate:(CLLocationCoordinate2D)c1 andCoordinate:(CLLocationCoordinate2D)c2 
{ 
          c1.latitude = ToRadian(c1.latitude); 
          c2.latitude = ToRadian(c2.latitude);
          CLLocationDegrees dLon = ToRadian(c2.longitude - c1.longitude); 
          CLLocationDegrees bx = cos(c2.latitude) * cos(dLon); 
          CLLocationDegrees by = cos(c2.latitude) * sin(dLon);
          CLLocationDegrees latitude = atan2(sin(c1.latitude) + sin(c2.latitude), sqrt((cos(c1.latitude) + bx) * (cos(c1.latitude) + bx) + by*by));
          CLLocationDegrees longitude = ToRadian(c1.longitude) + atan2(by, cos(c1.latitude) + bx);

           CLLocationCoordinate2D midpointCoordinate; 
           midpointCoordinate.longitude = ToDegrees(longitude); 
           midpointCoordinate.latitude = ToDegrees(latitude);

           return midpointCoordinate;
}
票数 7
EN

Stack Overflow用户

发布于 2015-05-21 11:19:27

我已经在Swift中编写了库函数来计算多个坐标之间的中点,如下所示:

代码语言:javascript
复制
//        /** Degrees to Radian **/

class func degreeToRadian(angle:CLLocationDegrees) -> CGFloat{

    return (  (CGFloat(angle)) / 180.0 * CGFloat(M_PI)  )

}

//        /** Radians to Degrees **/

class func radianToDegree(radian:CGFloat) -> CLLocationDegrees{

    return CLLocationDegrees(  radian * CGFloat(180.0 / M_PI)  )

}

class func middlePointOfListMarkers(listCoords: [CLLocationCoordinate2D]) -> CLLocationCoordinate2D{

    var x = 0.0 as CGFloat

    var y = 0.0 as CGFloat

    var z = 0.0 as CGFloat



    for coordinate in listCoords{

        var lat:CGFloat = degreeToRadian(coordinate.latitude)

        var lon:CGFloat = degreeToRadian(coordinate.longitude)

        x = x + cos(lat) * cos(lon)

        y = y + cos(lat) * sin(lon);

        z = z + sin(lat);

    }

    x = x/CGFloat(listCoords.count)

    y = y/CGFloat(listCoords.count)

    z = z/CGFloat(listCoords.count)



    var resultLon: CGFloat = atan2(y, x)

    var resultHyp: CGFloat = sqrt(x*x+y*y)

    var resultLat:CGFloat = atan2(z, resultHyp)



    var newLat = radianToDegree(resultLat)

    var newLon = radianToDegree(resultLon)

    var result:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: newLat, longitude: newLon)

    return result

}

详细答案可在here中找到

票数 4
EN

Stack Overflow用户

发布于 2013-05-31 13:41:46

你可以使用中点公式(http://www.purplemath.com/modules/midpoint.htm)计算两个坐标的midPoint,如果距离小于500英里,该公式将非常接近实际的地理点。如果你认为地球是球形的,那么就需要对这些点进行更复杂的处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16850332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档