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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算远离一个坐标的新坐标x米和y度相关的知识,希望对你有一定的参考价值。

我必须在文档中遗漏一些东西,我认为这应该很容易......

如果我有一个坐标,并希望在某个方向上获得距离x米的新坐标。我该怎么做呢?

我正在寻找类似的东西

-(CLLocationCoordinate2D) translateCoordinate:(CLLocationCoordinate2D)coordinate translateMeters:(int)meters translateDegrees:(double)degrees;

谢谢!

答案

遗憾的是,API中没有提供此类功能,因此您必须自己编写。

This site提供了几个涉及纬度/经度和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代码中,它包含this link,它显示了大于地球周长1/4的距离的更精确计算。

另请注意,上面的代码接受以km为单位的距离,所以一定要在通过之前将米除以1000.0。

另一答案

我找到了一种方法,不得不挖掘以找到正确的结构和功能。我最终没有使用度数,而是使用lat而不是长度。

我是这样做的:

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

}

当然,如果我真的需要在将来使用学位,那么对上面做一些修改很容易(我认为......)让它像我实际要求的那样工作。

另一答案

使用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;
}
另一答案

Nicsoft的答案很精彩,正是我所需要的。我已经创建了一个Swift 3-y版本,它更简洁,可以在CLLocationCoordinate2D实例上直接调用:

public extension CLLocationCoordinate2D {

  public func transform(using latitudinalMeters: CLLocationDistance, longitudinalMeters: CLLocationDistance) -> CLLocationCoordinate2D {
    let region = MKCoordinateRegionMakeWithDistance(self, latitudinalMeters, longitudinalMeters)
    return CLLocationCoordinate2D(latitude: latitude + region.span.latitudeDelta, longitude: longitude + region.span.longitudeDelta)
  }

}

以上是关于计算远离一个坐标的新坐标x米和y度的主要内容,如果未能解决你的问题,请参考以下文章

计算在 X 和 Y 和 Z 方向上具有一个坐标 + 距离的新坐标

c语言程序设计,输入一个点的坐标,输出沿原点逆时针旋转90度得到的坐标

[深度学习][转载]如何旋转图片180度重新获取坐标位置

如何计算一组 x、y 坐标和位置变量之间的距离?

请教excel的坐标距离计算公式。

三边测量和定位点 (x,y,z)