从X,Y,Z转换为纬度和经度

时间:2015-02-15 10:35:34

标签: javascript geometry mapping geospatial

这不是Converting from longitude\latitude to Cartesian coordinates的欺骗。

我希望有能在X,Y,Z坐标和纬度和经度之间来回转换的函数。事情是应用程序已经具有从纬度/经度到XYZ的此功能(此功能不可更改)...

export function getXYZ(lat, lng, radius) {
  radius = radius || 200;

  var gamma = ( 90 - lat) * Math.PI / 180;
  var theta = (180 - lng) * Math.PI / 180;

  var x = radius * Math.sin(gamma) * Math.cos(theta);
  var y = radius * Math.cos(gamma);
  var z = radius * Math.sin(gamma) * Math.sin(theta);

  return {x: x, y: y, z: z};
}

我试图创建一个配对功能,以反过来的方式,但有些事情不对。

export function getLatLng(vector, radius) {
  radius = radius || 200;

  var lat, latRads, lng, lngRads;

  latRads = Math.acos(vector.y / radius);
  lngRads = Math.atan2(vector.z, vector.x);

  lat = (Math.PI / 2 - latRads) * 180 / Math.PI;
  lng = (Math.PI - lngRads) * 180 / Math.PI;

  return [lat, lng];
}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我无法发表评论,所以我会开始回答"虽然它不是一个:

在getXYZ中,半径可以作为参数传递,但在反函数中,半径不能是参数:它必须是长度(向量)。尝试替换" radius = radius || 200;" by var radius = length(vector)"并删除radius参数(didnt test)。

答案 1 :(得分:0)

我会继续回答我自己的问题......

export function getLatLng(vector, radius) {
      radius = radius || 200;

      var latRads = Math.acos(vector.y / radius);
      var lngRads = Math.atan2(vector.z, vector.x);
      var lat = (Math.PI / 2 - latRads) * (180 / Math.PI);
      var lng = (Math.PI - lngRads) * (180 / Math.PI);

      return [lat, lng - 180];
    }

反过来......

 export function getXYZ(lat, lng, radius) {
      radius = radius || 200;

      var latRads = ( 90 - lat) * Math.PI / 180;
      var lngRads = (180 - lng) * Math.PI / 180;

      var x = radius * Math.sin(latRads) * Math.cos(lngRads);
      var y = radius * Math.cos(latRads);
      var z = radius * Math.sin(latRads) * Math.sin(lngRads);

      return {x: x, y: y, z: z};
    }