【问题标题】:Create perpendicular lat long from single cllocation coordinate of X meter从 X 米的单个 cllocation 坐标创建垂直 lat long
【发布时间】:2016-07-23 23:42:42
【问题描述】:

我有用户当前位置,即 CLLocation 坐标(位置 lat & long),并且用户在赛道上,借助用户当前位置指向一个方向我创建了一个区域现在我想要更多赛道坐标(比如 2m, 4m,垂直方向距赛道6m),赛道长10m。请检查图像,红点在轨道上。 Please check this image

【问题讨论】:

  • 这方面有什么更新吗?

标签: ios objective-c cllocationmanager cllocationcoordinate2d


【解决方案1】:
/**
 * Returns the destination point from initial point having travelled the given distance on the
 * given initial bearing (bearing normally varies around path followed).
 *
 * @param   {double} distance - Distance travelled, in same units as earth radius (default: metres).
 * @param   {double} bearing - Initial bearing in degrees from north.
 *
 * @returns {CLLocationCoordinate} Destination point.
 */

#define kEarthRadius 6378137

- (CLLocationCoordinate2D)destinationPointWithStartingPoint:(MKMapPoint)initialPoint distance:(double)distance andBearing:(double)bearing {
  CLLocationCoordinate2D location = MKCoordinateForMapPoint(initialPoint);

  double delta = distance / kEarthRadius;
  double omega = [self degreesToRadians:bearing];

  double phi1 = [self degreesToRadians:location.latitude];
  double lambda1 = [self degreesToRadians:location.longitude];

  double phi2 = asin(sin(phi1)*cos(delta) + cos(phi1) * sin(delta) * cos(omega));
  double x = cos(delta) - sin(phi1) * sin(phi2);
  double y = sin(omega) * sin(delta) * cos(phi1);
  double lambda2 = lambda1 + atan2(y, x);

  return CLLocationCoordinate2DMake([self radiansToDegrees:phi2], ([self radiansToDegrees:lambda2]+540)%360-180);
}

- (CLLocationCoordinate2D)rhumbDestinationPointForInitialPoint:(MKMapPoint)initialPoint distance:(double)distance andBearing:(double)bearing {
  CLLocationCoordinate2D location = MKCoordinateForMapPoint(initialPoint);

  double delta = distance / kEarthRadius;
  double omega = [self degreesToRadians:bearing];

  double phi1 = [self degreesToRadians:location.latitude];
  double lambda1 = [self degreesToRadians:location.longitude];

  double delta_phi = delta * cos(omega);
  double phi2 = phi1 + delta_phi;

  // check for some daft bugger going past the pole, normalise latitude if so
  if (fabs(phi2) > M_PI / 2) {
    phi2 = phi2 > 0 ? M_PI-phi2 : -M_PI-phi2;
  }

  double delta_gamma = log(tan(phi2/2+M_PI/4)/tan(phi1/2+M_PI/4));
  double q = fabs(delta_gamma) > 10e-12 ? delta_phi / delta_gamma : cos(phi1);

  double delta_lambda = delta*sin(omega)/q;
  double lambda2 = lambda1 + delta_lambda;

  return CLLocationCoordinate2DMake([self radiansToDegrees:phi2], ([self radiansToDegrees:lambda2]+540)%360-180);
}

- (double)degreesToRadians:(double)degrees {
  return degrees * M_PI / 180.0;
}

- (double)radiansToDegrees:(double)radians {
  return radians * 180.0 / M_PI;
}

改编自:http://www.movable-type.co.uk/scripts/latlong.html
更多轴承信息:https://en.wikipedia.org/wiki/Bearing_(navigation)
和恒向线:https://en.wikipedia.org/wiki/Rhumb_line

【讨论】:

  • stackoverflow 旨在提供指导,而不是提供完整的具体解决方案!
猜你喜欢
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多