JS 中的经纬度到 XYZ 位置 .. 不工作

IT技术 javascript
2021-03-20 04:36:09
var phi   = (90-lat)*(Math.PI/180);
var theta = (lng+180)*(Math.PI/180);

marker_mesh.position.x = ((rad) * Math.sin(phi)*Math.cos(theta));
marker_mesh.position.z = ((rad) * Math.sin(phi)*Math.sin(theta));
marker_mesh.position.y = ((rad) * Math.cos(phi));

鉴于上述情况,我的标记没有转换为 3D 球体上的正确位置......想法?

它相对接近(在同一大陆上)但接近:\

下面给出......它应该在

纬度:41.7307619:-71.276195

我的地球有一个boundRadius : 500px

该函数的当前结果是

x: -119.7801015013779

y: 332.8157297895266

z: 353.3927238766871

在此处输入图片说明

1个回答

您的公式与大地测量到 ECEF 计算略有不同。请参阅 Dr Math纬度和经度、GPS 转换和维基百科大地测量与 ECEF 坐标之间的公式这将纬度、经度投影到一个扁平的球体(即真实的地球不是完美的球形)。

var cosLat = Math.cos(lat * Math.PI / 180.0);
var sinLat = Math.sin(lat * Math.PI / 180.0);
var cosLon = Math.cos(lon * Math.PI / 180.0);
var sinLon = Math.sin(lon * Math.PI / 180.0);
var rad = 6378137.0;
var f = 1.0 / 298.257224;
var C = 1.0 / Math.sqrt(cosLat * cosLat + (1 - f) * (1 - f) * sinLat * sinLat);
var S = (1.0 - f) * (1.0 - f) * C;
var h = 0.0;
marker_mesh.position.x = (rad * C + h) * cosLat * cosLon;
marker_mesh.position.y = (rad * C + h) * cosLat * sinLon;
marker_mesh.position.z = (rad * S + h) * sinLat;

在您的场景中,因为您似乎正在寻找一个完美的球体,所以您需要将 f = 0.0 和 rad = 500.0 改为。这将导致 C 和 S 变为 1.0,因此,公式的简化版本简化为:

var cosLat = Math.cos(lat * Math.PI / 180.0);
var sinLat = Math.sin(lat * Math.PI / 180.0);
var cosLon = Math.cos(lon * Math.PI / 180.0);
var sinLon = Math.sin(lon * Math.PI / 180.0);
var rad = 500.0;
marker_mesh.position.x = rad * cosLat * cosLon;
marker_mesh.position.y = rad * cosLat * sinLon;
marker_mesh.position.z = rad * sinLat;

注意我没有验证 Java 代码示例的语法。

哦,对了,在这种情况下,您可能指的是 Web 墨卡托投影。gal-systems.com/2011/07/convert-coordinates-between-web.html
2021-04-25 04:36:09
@samccone 根据要求,为您提供了两个 Java 片段。底部更简单的可能更符合您的喜好。
2021-05-19 04:36:09
感谢您的工作......我认为这个问题与此有关......这个问题更大...... stackoverflow.com/questions/2651099/ ......
2021-05-19 04:36:09