3D координаты на сфере в широту и долготу - PullRequest
35 голосов
/ 15 апреля 2011

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

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

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

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

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

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

Geographic coordinates

Обновление:

Спасибо за все полезные ответы, поэтому в конце я пошел с этим кодом:

 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.

Ответы [ 7 ]

31 голосов
/ 15 апреля 2011

Я думаю, что не должно быть трудно найти сферические полярные координаты из x, y, z (3d-система координат).

  1. r всегда постоянно, если оно на поверхности.

    enter image description here

  2. (90 - & theta; ) ваша широта (отрицательная означает, что она снизу), поскольку измеряется сверху .

    enter image description here

  3. & phi; - ваша долгота. (но не совсем уверен насчет системы долготы)

    enter image description here

Также проверьте эту диаграмму из Википедии .

enter image description here

9 голосов
/ 15 апреля 2011
lat=atan2(z,sqrt(x*x+y*y))
lng=atan2(y,x)

Использование формул с atan2() более удобно.Вам не нужно прибавлять / вычитать число пи / 2 или заботиться о проблемах знака в разных квадрантах или делении на ноль.

lat будет> 0 в северном полушарии
lat будет<0 в южном полушарии <br>lng будет> 0 в восточном полушарии
lng будет <0 в западном полушарии <br>

7 голосов
/ 01 ноября 2011

Это помогло с использованием 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;
0 голосов
/ 11 июня 2013

После работы над получением простого решения для размещения объектов на сфере с использованием 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

0 голосов
/ 15 апреля 2011

Редактировать - перечитав ваш вопрос, мой ответ не обязательно применим, но я оставлю его для справки.

Зависит от того, насколько точно вы хотите быть, для какой цели вы собираетесь использовать результат. Не существует единой системы широты и логичности, например, 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

0 голосов
/ 15 апреля 2011

Это работа с конвертом, но:

Lat = arctan(z/(sqrt(x^2+y^2)))

Long = arccos(sqrt(x^2+y^2)/x)
0 голосов
/ 15 апреля 2011
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 

вам, возможно, придется немного повозиться со знаками

...