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

我一定在文档中缺少东西,我认为这应该很容易...


如果我有一个坐标,并且想在某个方向上x米外获得一个新坐标。我该怎么做呢?


我正在寻找类似的东西


-(CLLocationCoordinate2D) translateCoordinate:(CLLocationCoordinate2D)coordinate 

                               translateMeters:(int)meters 

                              translateDegrees:(double)degrees;


谢谢!


幕布斯7119047
浏览 403回答 3
3回答

慕村225694

不幸的是,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。

白衣染霜花

我找到了一种方法,必须进行挖掘以找到正确的结构和功能。我最终没有使用度数,而是用经度和纬度来表示米。这是我的操作方式:-(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;}当然,如果将来我真的需要使用学位,对我进行一些更改(如我所想)很容易(我认为...)。

qq_笑_17

使用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;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS