javascript Latitude Longitude to xyz position on earth (threejs)

吃可爱长大的小学妹 提交于 2019-12-03 13:50:57

问题


i´m playing arround with three.js

i want to render objects on specific geocoordinates on a bigger sphere, i´m pretty near to the solution, but i dont get the correct xyz position from lat lon

i have set up a test case on jsfiddle, there are two coordinates

latlons = [[40.7142700,-74.0059700], [52.5243700,13.4105300]];

its New York and Berlin

and this is my function to calc xyz from lat lon and radius

function calcPosFromLatLonRad(lat,lon,radius){

// Attempt1
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 = radius;
y = rad * cosLat * sinLon;
x = rad * cosLat * cosLon;
z = rad * sinLat;

// Attempt2
// x = radius *  Math.sin(lat) * Math.cos(lon)
// y = radius *  Math.sin(lat) * Math.sin(lon)
// z = radius * Math.cos(lat)


// Attempt3
// latitude = lat * Math.PI/180
// longitude = lon * Math.PI/180
// x =  -radius * Math.cos(latitude) * Math.cos(longitude)
// y =  radius * Math.sin(latitude) 
// z =  radius * Math.cos(latitude) * Math.sin(longitude)


// Attempt4
// var phi   = (90-lat)*(Math.PI/180);
// var theta = (lng+180)*(Math.PI/180);
// x = ((rad) * Math.sin(phi)*Math.cos(theta));
// z = ((rad) * Math.sin(phi)*Math.sin(theta));
// y = ((rad) * Math.cos(phi));



   console.log([x,y,z]);
   return [x,y,z];
}

but all attempts return different xy, and they are all not correct ( z is always correct).

could someone pleas guide me to the right way ? i have no idea what could be wrong

heres the fiddle to play with

UPDATE: working jsfiddle


回答1:


unfortunatly i can´t further explain, but after playing around this one works like a charme :)

function calcPosFromLatLonRad(lat,lon,radius){

    var phi   = (90-lat)*(Math.PI/180)
    var theta = (lon+180)*(Math.PI/180)

    x = -((radius) * Math.sin(phi)*Math.cos(theta))
    z = ((radius) * Math.sin(phi)*Math.sin(theta))
    y = ((radius) * Math.cos(phi))

    return [x,y,z]

}

yeah thats pretty cool isnt it ? And i´m still interested into some shorter equation

working fiddle




回答2:


This function works for me:

function calcPosFromLatLonRad(radius, lat, lon) {

  var spherical = new THREE.Spherical(
    radius,
    THREE.Math.degToRad(90 - lon),
    THREE.Math.degToRad(lat)
  );

  var vector = new THREE.Vector3();
  vector.setFromSpherical(spherical);

  console.log(vector.x, vector.y, vector.z);
  return vector;
}

calcPosFromLatLonRad(0.5, -74.00597, 40.71427);


来源:https://stackoverflow.com/questions/28365948/javascript-latitude-longitude-to-xyz-position-on-earth-threejs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!