Подтвердить что ты не робот

3D-координаты на сфере с широтой и долготой

У меня есть следующая информация:

Существует сфера с началом (0,0,0) и радиусом R. После пересечения лучевой сферы я знаю точку (XYZ) в трехмерном пространстве, которое находится на сфере (точное положение в трехмерном пространстве, где линия пробивает сферическую оболочку).

Для моей программы я хотел бы рассчитать широту и долготу точки XYZ на сфере, но я не могу думать (или Google) о том, как сделать это легко.

Короче говоря, функция, которую я пытаюсь написать, такова:

public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
    return Latitude and Longitude
}

Кто-нибудь знает, как это сделать? В качестве ссылки этот файл SVG может быть полезен:

Geographic coordinates Также я нашел, что это преобразование обратно из широты и долготы в 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.

4b9b3361

Ответ 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