将距离(海里)转换为度(纬度/经度)

Posted

技术标签:

【中文标题】将距离(海里)转换为度(纬度/经度)【英文标题】:Converting distance (nautical miles) into degrees (Lat/Long) 【发布时间】:2013-02-06 06:29:52 【问题描述】:

我在模拟中有实体,其初始位置和路径是使用 Java 十进制度的代码。我需要缩放传感器半径(以海里为单位)和速度(海里/小时)以匹配十进制度。目的是在 OpenMap 和 Google Earth 中可视化模拟。

我见过How to convert Distance(miles) to degrees?,但那里的建议不起作用。

感谢任何帮助!我认为这将涉及使用大圆距离公式......但不能完全理解。

【问题讨论】:

看到这个answer “十进制距离”是什么意思? 我说的不是“十进制距离”,而是“十进制度”。这就是我的意思:en.wikipedia.org/wiki/Decimal_degrees @TechExchange 在 OpenMap 中使用该计算给了我 30+NM 应该是 20NM。分析检测时出现大错误。 【参考方案1】:

Ed Williams 的航空公式https://edwilliams.org/avform.htm 是一个很好的、易于使用的起点。而且我经常引用http://movable-type.co.uk/scripts/latlong.html

我猜你需要某种向量(你的问题有点不清楚)。

我使用(在 C 中,而不是在 Java 中)计算固定径向距离的是:

void polarToLatLong(double lat, double lon, double dist, double radial,
   double *outlat, double *outlon) 
   if (!dist)  // distance zero, so just return the point
      *outlat = lat;
      *outlon = lon;
   
   else if (lat > 89.9999)  // North Pole singularity. Dist is in NM.
      *outlat = 90 - dist / 60;
      *outlon = fmod(radial + 180) - 180;
   
   else  // normal case
      double sinlat, coslon;
      dist /= 3442; // = Earth's radius in nm (not WGS84!)
      sinlat = Sin(lat) * cos(dist) + Cos(lat) * sin(dist) * Cos(radial);
      *outlat = Arcsin(sinlat);
      coslon = (cos(dist) - Sin(lat) * sinlat) / (Cos(lat) * Cos(*outlat));
      *outlon = lon + (Sin(radial) >= 0 : -1 : 1) * Arccos(coslon);
   

在上面的代码中,Sin() 带有一个大写的 S,它只是 sin() 度数的包装:

#define CLAMP(a,x,b) MIN(MAX(a, x), b) // GTK+ GLib version slightly different
double Sin(double deg)   return sin(deg * (PI / 180)); // wrappers for degrees
double Cos(double deg)   return cos(deg * (PI / 180));
double Arcsin(double x)  return asin(CLAMP(-1, x, 1)) * (180 / PI);
double Arccos(double x)  return acos(CLAMP(-1, x, 1)) * (180 / PI);

【讨论】:

编辑: Ed Williams 航空公式的链接现在是edwilliams.org/avform.htm。

以上是关于将距离(海里)转换为度(纬度/经度)的主要内容,如果未能解决你的问题,请参考以下文章

如何将度分秒转换为度小数

经纬度与距离的换算

怎么算经纬度和距离呢?

如何将极地系统转换为纬度和经度

在java中将地址转换为纬度和经度以获得基于距离的建议

从纬度,经度转换为x,y