2011-04-15 20 views
29

Tengo la siguiente información:coordenadas 3D en una esfera de latitud y longitud

Existe una esfera con origen (0,0,0) y el radio R. Después de hacer una intersección de rayos-esfera I conocer un punto (XYZ) en el espacio 3D que está en la esfera (la posición exacta en el espacio 3D donde la línea atraviesa el casco de la esfera).

Para mi programa me gustaría calcular la Latitud y la Longitud del punto XYZ en la esfera, pero no puedo pensar (o Google) en una manera de hacerlo fácilmente.

Así que en resumen, la función que estoy tratando de escribir es la siguiente:

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

¿Alguien sabe cómo hacer esto? Como referencia este archivo Wiki SVG podría ser útil:

Geographic coordinates También me pareció que para convertir de nuevo desde la latitud y longitud para XYZ, que también podría ser útil: http://swardsonstudios.com/?p=65

Actualización:

Gracias por todas las respuestas votos, así que al final yo fuimos con este código:

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

ahora tengo que pensar en cuál es la respuesta más me ayudó a aceptar: P.

+0

lo está usando coordenadas ?? use coordenadas esféricas polares que x, y, z –

+0

Las coordenadas XYZ que mencioné, son simplemente coordenadas 3D y no tienen ninguna relación con las coordenadas esféricas en absoluto: http://ecommprojects.com/seo/Ahmed-Zewails-4d-Telescope/xyz -coordinates.png –

+1

Encontré que para obtener el lat/long para tener el signo correcto usando SceneKit, necesitaba: latitud flotante = - ((flotante) acosf (result.localCoordinates.y/sphereRadius) - M_PI_2); // theta longitud flotante = M_PI - ((float) atan2f (resultado.localCoordinates.z, resultado.localCoordinates.x));/// phi if (longitud> M_PI) { longitud = longitud - (2.0 * M_PI); } – PKCLsoft

Respuesta

25

Supongo que no debería ser difícil encontrar las coordenadas esféricas polares de x, y, z (sistema de coordenadas 3d).

  1. r siempre es constante si está en la superficie.

    enter image description here

  2. (90 - θ) su latitud (negativo significa que está en la parte inferior) como se mide desde la parte superior.

    enter image description here

  3. φ es su longitud. (Pero no muy seguro sobre el sistema de longitud)

    enter image description here

También puedes ver este diagrama de wikipedia.

enter image description here

+0

Wow, gracias por la respuesta bien presentada, voy a probar esto ahora mismo. Y si todo sale bien, lo aceptaré en un momento :). –

+1

Estoy obteniendo resultados muy extraños con esta fórmula, así que me temo que esta no parece ser la solución. –

+1

nvm, estás en lo correcto. No miré tu foto, utilizas Z = arriba, utilicé Y = arriba. También intercambiaste lat y lon. –

0
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 

puede que tenga que jugar con los signos un poco

0

Este es un trabajo del dorso de la envolvente, pero:

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

Long = arccos(sqrt(x^2+y^2)/x) 
0

Editar - habiendo relees dudara mi la respuesta no es necesariamente aplicable, pero la dejaré para referencia.

Depende de qué tan preciso sea el propósito para el que va a utilizar el resultado. No hay un solo sistema de latitud y lentitud, por ejemplo, WGS84 (USA GPS) o ETRS89 (European GPS) difieren ligeramente y divergen a medida que el océano Atlántico se ensancha.

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

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

Finalmente esto debe abordar su pregunta directamente.

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

o

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

+0

Estoy usando esto unas coordenadas esféricas para una esfera perfecta (en un juego) así que no tengo que usar complejidades del mundo real :) –

+0

Me di cuenta que después de publicar, realmente debería leer la pregunta correctamente sonando. He hecho bastante de esto en el pasado, así que veo lat/long y empiezo a pontificar. – Jaydee

9
lat=atan2(z,sqrt(x*x+y*y)) 
lng=atan2(y,x) 

Uso de fórmulas con atan2() es más conveniente. No tiene que agregar/restar pi/2 o preocuparse por los problemas de signo en diferentes cuadrantes o división por cero.

lat habrá> 0 en el hemisferio norte
lat habrá < 0 en el hemisferio sur
lng será> 0 en el hemisferio oriental
lng habrá < 0 en el hemisferio occidental

+0

Su latitud parece funcionar, pero su longitud es muy errática –

+0

@Roy T .: probablemente dependa de la definición de cuál de los dos ejes es x- y -y. Pruébelo con los ejes X e Y intercambiados (No especificó el sistema de coordenadas exactamente). – Curd

6

Esto ayudó a usar 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

Estarías dispuesto a ayudarme a descubrir el reverso de esto. Tengo el lat, lon y radio, y estoy tratando de averiguar el '{x, y, z}' de un THREE.Vector3. – Cmndo

+0

Marque esta respuesta: http://stackoverflow.com/a/28367325/174027 – jujule

+1

En mi caso tuve que cambiar el cálculo de lon a lo siguiente: var lon = ((270 + (Math.atan2 (x, z))) * 180/Math.PI)% 360) -360; – ppareja

0

Después de trabajar para obtener una solución directa para colocar objetos en una esfera usando lat/lng, se me ocurrió una clase simple para que pueda hacerlo usando 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

Cuestiones relacionadas