3D-координаты на сфере с широтой и долготой
У меня есть следующая информация:
Существует сфера с началом (0,0,0) и радиусом R.
После пересечения лучевой сферы я знаю точку (XYZ) в трехмерном пространстве, которое находится на сфере (точное положение в трехмерном пространстве, где линия пробивает сферическую оболочку).
Для моей программы я хотел бы рассчитать широту и долготу точки XYZ на сфере, но я не могу думать (или Google) о том, как сделать это легко.
Короче говоря, функция, которую я пытаюсь написать, такова:
public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
return Latitude and Longitude
}
Кто-нибудь знает, как это сделать? В качестве ссылки этот файл SVG может быть полезен:
Также я нашел, что это преобразование обратно из широты и долготы в XYZ, что также может быть полезно: http://swardsonstudios.com/?p=65
Обновление:
Спасибо за все полезные ответы, поэтому в конце я пошел с этим кодом:
public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
float lat = (float)Math.Acos(position.Y / sphereRadius); //theta
float lon = (float)Math.Atan(position.X / position.Z); //phi
return new LatLon(lat, lon);
}
Теперь мне нужно подумать, какой ответ помог мне больше всего принять: P.
Ответы
Ответ 1
Я думаю, что нетрудно найти сферические полярные координаты из x, y, z (3d-система координат).
-
r
всегда постоянна, если она на поверхности.
![enter image description here]()
-
(90 - & theta;) ваша широта (отрицательная означает ее внизу) как она измеряется сверху.
![enter image description here]()
-
& phi; - ваша долгота. (но не совсем уверен в долготе системы)
![enter image description here]()
Также проверьте эту диаграмму из wikipedia.
![enter image description here]()
Ответ 2
lat=atan2(z,sqrt(x*x+y*y))
lng=atan2(y,x)
Использование формул с atan2()
более удобно.
Вам не нужно добавлять/вычитать pi/2 или заботиться о проблемах с знаками в разных квадрантах или делить на ноль.
lat
будет > 0 в северном полушарии
lat
будет < 0 в южном полушарии
lng
будет > 0 в восточном полушарии
lng
будет < 0 в западном полушарии
Ответ 3
Это помогло использовать Javascript/THREE.js:
var lat = 90 - (Math.acos(y / RADIUS_SPHERE)) * 180 / Math.PI;
var lon = ((270 + (Math.atan2(x , z)) * 180 / Math.PI) % 360) -180;
Ответ 4
r=sqrt(x^2+y^2+z^2)
phi = arccos(sqrt(x^2+y^2)/r)*sign(y)
lambda = arccos(x/sqrt(x^2+y^2))
latitude = 180/pi * phi
longitude = 180/pi * lambda
вам, возможно, придется немного помахать знаками
Ответ 5
Это работа с обратной оболочкой, но:
Lat = arctan(z/(sqrt(x^2+y^2)))
Long = arccos(sqrt(x^2+y^2)/x)
Ответ 6
Изменить - перечитав вопрос, мой ответ не обязательно применим, но я оставлю его для справки.
Это зависит от того, насколько вы точны, чтобы быть целью, для которой вы собираетесь использовать результат. Единой системы широты и логичности нет, например, WGS84 (США GPS) или ETRS89 (европейский GPS) немного отличаются и расходятся по мере расширения Атлантического океана.
http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guide5.html
http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guide6.html
Наконец, это должно непосредственно ответить на ваш вопрос.
http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guideb.html
или
http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/convertingcoordinates3D.pdf
Ответ 7
После того, как вы начали прямое решение по размещению объектов на сфере с использованием lat/lng, я придумал простой класс, чтобы позволить вам сделать это с помощью функции three.js.
var earth = new THREE.GeoSpatialMap(geometry, material);
earth.setTexturesEdgeLongitude(-180.806168);
for (i = 0; i < continentData.length; i += step) {
var lat = continentData[i];
var lng = continentData[i + 1];
var light = new THREE.PointLight(0x0099ff);
var plant = new org.good.ecology.Plant();
plant.scale.x = plant.scale.y = plant.scale.z = Math.random() * 3;
console.log("Adding symbol at: " + lat + " : " + lng);
earth.addGeoSymbol(
new THREE.GeoSpatialMap.GeoSymbol(plant, {
phi: lat,
lambda: lng
})
);
plant.lookAt(earth.position);
}
https://github.com/scottbyrns/Three.js-Geospatial-Mapping