从 X、Y、Z 转换为纬度和经度
Translate from X, Y, Z to Latitude and Longitude
这不是 Converting from longitude\latitude to Cartesian coordinates 的骗局。
我想要在 X、Y、Z 坐标与纬度和经度之间来回转换的函数。问题是应用程序已经具有从 latitude/longitude 到 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];
}
有什么想法吗?
我不能 post 发表评论所以我会开始 "answer" 虽然不是:
在getXYZ中半径可以作为参数传递,但在反函数中半径不能作为参数:它必须是长度(向量)。尝试将 "radius = radius || 200;" 替换为 var radius = length(vector)" 并删除半径参数(未测试)。
我会继续回答我自己的问题...
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};
}
这不是 Converting from longitude\latitude to Cartesian coordinates 的骗局。
我想要在 X、Y、Z 坐标与纬度和经度之间来回转换的函数。问题是应用程序已经具有从 latitude/longitude 到 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];
}
有什么想法吗?
我不能 post 发表评论所以我会开始 "answer" 虽然不是:
在getXYZ中半径可以作为参数传递,但在反函数中半径不能作为参数:它必须是长度(向量)。尝试将 "radius = radius || 200;" 替换为 var radius = length(vector)" 并删除半径参数(未测试)。
我会继续回答我自己的问题...
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};
}