我在模拟中有实体,其初始位置和路径是使用 Java 十进制度的代码。我需要缩放传感器半径(以海里为单位)和速度(海里/小时)以匹配十进制度。目的是在 OpenMap 和 Google Earth 中可视化模拟。
我已经看到如何将距离(英里)转换为度数?,但那里的建议不起作用。
任何帮助表示赞赏!我认为这将涉及使用大圆距离公式......但不能完全理解。
我在模拟中有实体,其初始位置和路径是使用 Java 十进制度的代码。我需要缩放传感器半径(以海里为单位)和速度(海里/小时)以匹配十进制度。目的是在 OpenMap 和 Google Earth 中可视化模拟。
我已经看到如何将距离(英里)转换为度数?,但那里的建议不起作用。
任何帮助表示赞赏!我认为这将涉及使用大圆距离公式......但不能完全理解。
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()
for 度数的包装:
#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);}