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球体上的正确位置......想法?
它相对接近(在同一个大陆上),但接近:\
如下所示......它应该在
呈现lat :41.7307619 长:-71.276195
我的地球有一个 boundRadius :500px
该函数的当前结果是
x: -119.7801015013779
y: 332.8157297895266
z: 353.3927238766871
答案 0 :(得分:18)
您的公式与大地测量与ECEF计算略有不同。请参阅数学博士Latitude and Longitude, GPS Conversion和维基百科Geodetic to/from ECEF coordinates上的公式。这将纬度,经度投射到扁平球体(即真实的地球不是完美的球形)。
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;
N.B。我还没有验证Java代码示例的语法。