web-dev-qa-db-fra.com

Coordonnées 3D sur une sphère à Latitude et Longitude

J'ai les informations suivantes:

Il existe une sphère d'origine (0,0,0) et de rayon R. Après avoir fait une intersection rayon-sphère, je connais un point (XYZ) dans l'espace 3D qui se trouve sur la sphère (la position exacte dans l'espace 3D où la ligne perce la coque sphérique).

Pour mon programme, je voudrais calculer la latitude et la longitude du point XYZ sur la sphère, mais je ne peux pas penser (ou Google) à un moyen de le faire facilement.

Donc, en bref, la fonction que j'essaie d'écrire est la suivante:

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

Est-ce que quelqu'un sait comment faire cela? Comme référence, ce fichier Wiki SVG peut être utile:

Geographic coordinates

Mise à jour:

Merci pour toutes les réponses utiles, donc à la fin je suis allé avec ce code:

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

Maintenant, je dois réfléchir à la réponse qui m'a le plus aidé à accepter: P.

36
Roy T.

Je suppose qu'il ne devrait pas être difficile de trouver les coordonnées polaires sphériques à partir de x, y, z (système de coordonnées 3D).

  1. r est toujours constant s'il est en surface.

    enter image description here

  2. (90 - θ) votre latitude (négative signifie que c'est en bas) comme il est mesuré à partir du haut .

    enter image description here

  3. φ est votre longitude. (mais pas tout à fait sûr du système de longitude)

    enter image description here

Vérifiez également ce diagramme de wikipedia .

enter image description here

32
Santosh Linkha
lat=atan2(z,sqrt(x*x+y*y))
lng=atan2(y,x)

L'utilisation de formules avec atan2() est plus pratique. Vous n'avez pas à ajouter/soustraire pi/2 ou à vous soucier des problèmes de signe dans différents quadrants ou à diviser par zéro.

lat sera> 0 dans l'hémisphère nord
lat sera <0 dans l'hémisphère sud
lng sera> 0 dans l'hémisphère oriental
lng sera <0 dans l'hémisphère occidental

9
Curd

Cela a aidé à utiliser 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
Torsten Becker

Modifier - après avoir relu votre question, ma réponse n'est pas nécessairement applicable, mais je vais la laisser pour référence.

Cela dépend de la précision avec laquelle vous souhaitez être un objectif dans lequel vous allez utiliser le résultat. Il n'y a pas de système de latitude et de logitude unique, par exemple WGS84 (GPS USA) ou ETRS89 (GPS européen) diffèrent légèrement et divergent à mesure que l'océan Atlantique s'élargit.

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

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

Enfin, cela devrait répondre directement à votre question.

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

ou

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

0
Jaydee