为了账号安全,请及时绑定邮箱和手机立即绑定

计算远离一个坐标的新坐标x米和y度

计算远离一个坐标的新坐标x米和y度

iOS
幕布斯7119047 2019-12-15 12:08:55
我一定在文档中缺少东西,我认为这应该很容易...如果我有一个坐标,并且想在某个方向上x米外获得一个新坐标。我该怎么做呢?我正在寻找类似的东西-(CLLocationCoordinate2D) translateCoordinate:(CLLocationCoordinate2D)coordinate                                translateMeters:(int)meters                               translateDegrees:(double)degrees;谢谢!
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

不幸的是,API中没有提供此类功能,因此您必须编写自己的函数。


该站点提供了一些涉及纬度/经度的计算以及示例JavaScript代码。具体来说,标题为“给定距离和起点的目标点”的部分显示了如何计算您的要求。


JavaScript代码在该页面的底部,这是将其转换为Objective-C的一种可能方法:


- (double)radiansFromDegrees:(double)degrees

{

    return degrees * (M_PI/180.0);    

}


- (double)degreesFromRadians:(double)radians

{

    return radians * (180.0/M_PI);

}


- (CLLocationCoordinate2D)coordinateFromCoord:

        (CLLocationCoordinate2D)fromCoord 

        atDistanceKm:(double)distanceKm 

        atBearingDegrees:(double)bearingDegrees

{

    double distanceRadians = distanceKm / 6371.0;

      //6,371 = Earth's radius in km

    double bearingRadians = [self radiansFromDegrees:bearingDegrees];

    double fromLatRadians = [self radiansFromDegrees:fromCoord.latitude];

    double fromLonRadians = [self radiansFromDegrees:fromCoord.longitude];


    double toLatRadians = asin( sin(fromLatRadians) * cos(distanceRadians) 

        + cos(fromLatRadians) * sin(distanceRadians) * cos(bearingRadians) );


    double toLonRadians = fromLonRadians + atan2(sin(bearingRadians) 

        * sin(distanceRadians) * cos(fromLatRadians), cos(distanceRadians) 

        - sin(fromLatRadians) * sin(toLatRadians));


    // adjust toLonRadians to be in the range -180 to +180...

    toLonRadians = fmod((toLonRadians + 3*M_PI), (2*M_PI)) - M_PI;


    CLLocationCoordinate2D result;

    result.latitude = [self degreesFromRadians:toLatRadians];

    result.longitude = [self degreesFromRadians:toLonRadians];

    return result;

}

在JS代码中,它包含此链接,该链接显示了对大于地球周长1/4的距离的更精确的计算。


另请注意,上面的代码接受以km为单位的距离,因此请确保在通过之前将米除以1000.0。



查看完整回答
反对 回复 2019-12-16
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

我找到了一种方法,必须进行挖掘以找到正确的结构和功能。我最终没有使用度数,而是用经度和纬度来表示米。


这是我的操作方式:


-(CLLocationCoordinate2D)translateCoord:(CLLocationCoordinate2D)coord MetersLat:(double)metersLat MetersLong:(double)metersLong{


    CLLocationCoordinate2D tempCoord;


    MKCoordinateRegion tempRegion = MKCoordinateRegionMakeWithDistance(coord, metersLat, metersLong);

    MKCoordinateSpan tempSpan = tempRegion.span;


    tempCoord.latitude = coord.latitude + tempSpan.latitudeDelta;

    tempCoord.longitude = coord.longitude + tempSpan.longitudeDelta;


    return tempCoord;


}

当然,如果将来我真的需要使用学位,对我进行一些更改(如我所想)很容易(我认为...)。



查看完整回答
反对 回复 2019-12-16
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

使用an MKCoordinateRegion存在一些问题-可以调整返回的区域以适合该位置,因为两个增量可能无法准确地映射到该纬度处的投影,如果您希望其中一个轴的零增量不符合要求,等等。


此功能用于MKMapPoint执行坐标平移,使您可以在地图投影的坐标空间中移动点,然后从中提取坐标。


CLLocationCoordinate2D MKCoordinateOffsetFromCoordinate(CLLocationCoordinate2D coordinate, CLLocationDistance offsetLatMeters, CLLocationDistance offsetLongMeters) {

    MKMapPoint offsetPoint = MKMapPointForCoordinate(coordinate);


    CLLocationDistance metersPerPoint = MKMetersPerMapPointAtLatitude(coordinate.latitude);

    double latPoints = offsetLatMeters / metersPerPoint;

    offsetPoint.y += latPoints;

    double longPoints = offsetLongMeters / metersPerPoint;

    offsetPoint.x += longPoints;


    CLLocationCoordinate2D offsetCoordinate = MKCoordinateForMapPoint(offsetPoint);

    return offsetCoordinate;

}



查看完整回答
反对 回复 2019-12-16
  • 3 回答
  • 0 关注
  • 371 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信