Współrzędne 3D na kuli do szerokości i długości geograficznej

Mam następujące informacje:

Istnieje kula o pochodzeniu (0,0,0) i promieniu R. Po wykonaniu przecięcia promień-kula znam punkt (XYZ) w przestrzeni 3D, który znajduje się na kuli (dokładna pozycja w przestrzeni 3D, gdzie linia przebija kadłub kuli).

W moim programie chciałbym obliczyć szerokość i długość geograficzną punktu XYZ na kuli, ale nie mogę wymyślić (lub wygooglować) sposobu, aby to zrobić łatwo.

Krótko mówiąc, funkcja, którą próbuję napisz to:

public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
    return Latitude and Longitude
}
Czy ktoś wie jak to zrobić? Jako odniesienie ten plik Wiki SVG może być pomocny:

Współrzędne geograficzne

Aktualizacja:

Dzięki za wszystkie pomocne odpowiedzi, więc w końcu poszedłem z tym kodem:

 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);
    }

Teraz muszę pomyśleć, która odpowiedź pomogła mi najbardziej zaakceptować: p.

Author: PKCLsoft, 2011-04-15

7 answers

Myślę, że nie powinno być trudno znaleźć sferyczne współrzędne biegunowe z X, y ,z (układ współrzędnych 3D).

  1. r jest zawsze stała, jeśli jest na powierzchni.

    Tutaj wpisz opis obrazka

  2. (90 - θ) twoja szerokość geograficzna (ujemna oznacza, że jest na dole), ponieważ jest mierzona od góry.

    Tutaj wpisz opis obrazka

  3. φ to twoja Długość geograficzna. (ale nie do końca pewne co do długości system)

    Tutaj wpisz opis obrazka

Sprawdź również ten diagram z Wikipedii .

Tutaj wpisz opis obrazka

 27
Author: Santosh Linkha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-05 13:02:06
lat=atan2(z,sqrt(x*x+y*y))
lng=atan2(y,x)

Używanie formuł z {[1] } jest wygodniejsze. Nie musisz dodawać/odejmować pi / 2 ani przejmować się problemami ze znakiem w różnych ćwiartkach lub dzieleniu przez zero.

lat będzie >0 na półkuli północnej
lat będzie lng będzie >0 na półkuli wschodniej
lng będzie

 9
Author: Curd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 08:59:34

To pomogło przy użyciu 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;
 7
Author: noiv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-01 16:25:39
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 

Być może będziesz musiał trochę majstrować przy znakach

 0
Author: titus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 08:40:37

Edit-po ponownym przeczytaniu kwestionujesz moja odpowiedź nie musi mieć zastosowania, ale zostawię ją dla odniesienia.

To zależy jak dokładne wan być dwhat cel masz zamiar użyć wynik dla. Nie ma jednego systemu szerokości i logitude, NP WGS84 (USA GPS) lub ETRS89 (Europejski GPS) różnią się nieznacznie i różnią się od Oceanu Atlantyckiego poszerza.

Http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guide5.html

Http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guide6.html

Wreszcie to powinno odpowiedzieć na twoje pytanie bezpośrednio.

Http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guideb.html

LUB

Http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/convertingcoordinates3D.pdf

 0
Author: Jaydee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 08:48:51

Po pracy nad prostym rozwiązaniem umieszczania obiektów na kuli za pomocą lat/lng, wymyśliłem prostą klasę, która pozwoli Ci zrobić to za pomocą trzech.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
Author: user1976945,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-11 00:43:10

To jest praca z kopertami, ale:

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

Long = arccos(sqrt(x^2+y^2)/x)
 0
Author: medivh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-11 00:44:35