Mostrar/Ocultar

 Inclinación de la vista al acercarnos al suelo 🗺️ Foro Programación de Google Earth y Maps 🗺️


Foro de Programación de Google Earth y Maps  Foro de Programación de Google Earth y Maps: Programación con las APIs de Google: Google Earth, Google Maps, KML, Aplicaciones Moviles
Responder al tema Versión Imprimible
Página 1 de 1 - Tema con 7 Mensajes y 24028 Lecturas
Último Mensaje:
Autor Mensaje

Morta
Veterano
Veterano
Registrado:09-10-2008
Mensajes: 64

Votos: 0 👍

EnlacesAsunto: Inclinación de la vista al acercarnos al suelo

Publicado:
Responder citando
A ver si alguien me puede echar un cable. No se si solo me ocurre a mi o que pero cuando acerco la vista hasta el suelo, automáticamente se inclina y llega a mostrar el horizonte. Me gustaría evitarlo y que siempre se quede en vertical sobre el punto que enfocamos. No se si me explico. Cuando nos vamos acercando a la superficie, llega un momento en que cuando estamos muy cerca del suelo, la vista se va inclinando automáticamente. Observo que solo ocurre en el plugin y no en el programa normal de Google Earth. Pongo un ejemplo básico: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Inclinación de la vista al acercarse al suelo</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script src="http://www.google.com/jsapi?key=ABQIAAAArCZgeQ8ddm8YbeJQqqHN5BTYrZjdppbykE52CdH9dtH9wJ0VsBQSgm6ZbaTJsaMARyyYkz_JttmHMQ"></script>
<script type="text/javascript">
Google.load("earth", "1");
Var ge = null;

Function init() {
google.earth.createInstance("map3d", initCB, failureCB);
}

Function initCB(instance) {
Ge = instance;
Ge.getWindow().setVisibility(true);
Ge.getOptions().setStatusBarVisibility(true);
Ge.getNavigationControl().setVisibility(ge.VISIBILITY_SHOW);

Var lookAt = ge.createLookAt('');
LookAt.setLatitude(40.417042);
LookAt.setLongitude(-3.700000);
LookAt.setRange(5000.0);
Ge.getView().setAbstractView(lookAt);

}
Function failureCB(object) {
alert('Error');
}



</script>
</head>
<body onload='init()' id='body'>
<div id='map3d_container' style='border: 5px solid silver; height: 550px;'>
<div id='map3d' style='height: 100%;'></div>
</div>
</body>La solución que se me ocurre pero que no termina de gustarme, es añadir el siguiente código que añade un evento que se ejecuta cuando movemos el ratón de tal manera que la vista deja de estar inclinada

Function enderezar_vista(event) {
Var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
LookAt.setTilt(0);
Ge.getView().setAbstractView(lookAt);
}
Google.earth.addEventListener(ge.getGlobe(), 'mousemove', enderezar_vista);

El código entonces quedaría así:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Rectificación de la inclinación de la vista</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script src="http://www.google.com/jsapi?key=ABQIAAAArCZgeQ8ddm8YbeJQqqHN5BTYrZjdppbykE52CdH9dtH9wJ0VsBQSgm6ZbaTJsaMARyyYkz_JttmHMQ"></script>
<script type="text/javascript">
Google.load("earth", "1");
Var ge = null;

Function init() {
google.earth.createInstance("map3d", initCB, failureCB);
}

Function initCB(instance) {
Ge = instance;
Ge.getWindow().setVisibility(true);
Ge.getOptions().setStatusBarVisibility(true);
Ge.getNavigationControl().setVisibility(ge.VISIBILITY_SHOW);

//------------
//ENDEREZA LA VISTA cuando movemos el raton
Function enderezar_vista(event) {
Var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
LookAt.setTilt(0);
Ge.getView().setAbstractView(lookAt);
}
Google.earth.addEventListener(ge.getGlobe(), 'mousemove', enderezar_vista);
//------------


Var lookAt = ge.createLookAt('');
LookAt.setLatitude(40.417042);
LookAt.setLongitude(-3.700000);
LookAt.setRange(5000.0);
Ge.getView().setAbstractView(lookAt);

}
Function failureCB(object) {
alert('Error');
}

//------
</script>
</head>
<body onload='init()' id='body'>
<div id='map3d_container' style='border: 5px solid silver; height: 550px;'>
<div id='map3d' style='height: 100%;'></div>
</div>
</body>¿Alguien conoce como evitar esta inclinación de la vista de otra forma? Agradecería vuestra ayuda.

Al margen de esto, observo también que la exageración del relieve siempre está activa en el plugin. En el programa, en las opciones, en exagerar elevación, se puede modificar entre los valores 0.5 - 3 pero si se pone como valor 0 también funciona. ¿Alguien sabe como evitar la exageración del relieve en el plugin?

Un saludo y muchas gracias
Ir arriba Morta
Compartir:

_polifemo
SuperExpert
SuperExpert
Registrado:27-11-2009
Mensajes: 436

Votos: 0 👍

EnlacesAsunto: Re: Inclinación de la vista al acercarnos al suelo

Publicado:
Responder citando
Hola Morta.

La interface GEOptions tiene una función "getAutoGroundLevelViewEnabled ()" que devuelve un booleano. Si lo estableces a false debería solucionarse.


code.google.com/ ...mbers.html

Ah, que no es que en GoogleEarth no se incline la vista al acercarte, es que hay que activarlo en Herramientas/Opciones/Pestaña de navegación.

Respecto a la exageración del terreno. Supongo que con la función de la misma interface "setTerrainExaggeration(double terrainExaggeration)" estableciendo el double a un valor de uno funcionará.

Si funciona, desde luego mejor solución esa que cargar una función en cada evento. Si no funciona, yo solo activaría el evento cuando estés por debajo de una altura determinada; es decir cuando empiece a inclinar la vista.

Un saludo y ya me cuentas.
Ir arriba _polifemo
Compartir:

Morta
Veterano
Veterano
Registrado:09-10-2008
Mensajes: 64

Votos: 0 👍

EnlacesAsunto: Re: Inclinación de la vista al acercarnos al suelo

Publicado:
Responder citando
Hola de nuevo Polifemo
Muchas gracias por la respuesta.
He hecho una prueba rápida pero creo que no me funciona
He añadido esto al init

Ge.getOptions().setAutoGroundLevelViewEnabled(false);
Ge.getOptions().setTerrainExaggeration(0);

Y sigue inclinándose y saliendo el relieve exagerado (se que el mínimo es 1 pero en el programa le pones 0 y funciona, no sale exagerado)

Quizá es que no uso bien las funciones, como siempre la ayuda de GE es un poco escueta o yo no la entiendo bien
Muchas gracias y un saludo
Ir arriba Morta
Compartir:

_polifemo
SuperExpert
SuperExpert
Registrado:27-11-2009
Mensajes: 436

Votos: 0 👍

EnlacesAsunto: Re: Inclinación de la vista al acercarnos al suelo

Publicado:
Responder citando
Vaya, pensé que desactivando la opción de ver la vista terreno desaparecería el giro paulatino. Pero no, independientemente de que esté o no activa la vista terreno y la de streetview, siempre se inclina automáticamente el punto de vista.

La verdad es que no encuentre mas opción que la de tu función enderezar_vista(). Lo único que añadiría es que como mínimo le pongas como condición que solo se ejecute cuando la altura sea menor de X metros.

Echa un ojo por internet a ver si alguien ha dado con la solución. Porque si no... Amigo Morta, creo que estamos vencidos. Ojos que se mueven
Ir arriba _polifemo
Compartir:

Morta
Veterano
Veterano
Registrado:09-10-2008
Mensajes: 64

Votos: 0 👍

EnlacesAsunto: Re: Inclinación de la vista al acercarnos al suelo

Publicado:
Responder citando
¿Es curioso verdad? Algo que está resuelto en el programa y que parece que no es posible hacer en el plugin.
Estaría bien hacer que solo se ejecute a partir de una altura determinada pero no se me ocurre la forma de hacerlo. Aunque pensándolo bien, quizá tendría que ser una función que comprobara a que altura está la vista y hacer que se ejecute la de enderezar_vista cuando correspondiese pero ¿que se ganaría con ello? Mientras la vista no se inclina, el usuario no percibe nada, solo se ve cuando empieza a inclinarse que, cada vez que se mueve el ratón, la vista se "endereza".
He probado con las otras opciones que permite la función con el fin de hacer lo mas transparente posible la ejecución de la función al usuario pero no consigo que lo sea así que la que creo que mas se ajusta a lo que buscaba es la de mover el ratón. Estas posibilidades que comento son:
Google.earth.addEventListener(ge.getGlobe(), 'mouseclick', enderezar_vista);
Google.earth.addEventListener(ge.getGlobe(), 'mousedblclick', enderezar_vista);
Google.earth.addEventListener(ge.getGlobe(), 'mouseover', enderezar_vista);
Google.earth.addEventListener(ge.getGlobe(), 'mousedown', enderezar_vista);
Google.earth.addEventListener(ge.getGlobe(), 'mouseup', enderezar_vista);
Google.earth.addEventListener(ge.getGlobe(), 'mouseout', enderezar_vista);

También he probado con los eventos de cambio de vista earth-api-samples.googlecode.com/ ...hange.html pero tampoco me funciona bien. Quizá complementado con la función de comprobar la altura a la que esté la vista funcionaría mejor. ¿Se te ocurre como hacer esa función para comprobar la altura?

Respecto al relieve, también es curioso que no se pueda eliminar la opción. Ya digo que, en el programa, aunque el intervalo es de 0.5 a 3, si le pones 0 como valor, elimina toda la exageración del terreno.

Muchas gracias por tu ayuda. Sigo dandole vueltas al tema.
Un saludo
Ir arriba Morta
Compartir:

_polifemo
SuperExpert
SuperExpert
Registrado:27-11-2009
Mensajes: 436

Votos: 0 👍

EnlacesAsunto: Re: Inclinación de la vista al acercarnos al suelo

Publicado:
Responder citando
Efectivamente, la función se debería ejecutar solo cuando se compruebe que la altura es menor que una determinada . ¿Conoces las estructuras condicionales IF THEN...ELSE?

Le he echado un ojo al api de Google earth, y lo primero que he visto es que es muy pobre, la verdad es que está muy limitada comparada con el API de Gmaps. Y parece que hay un modo que debería funcionar, pero que es largo y complicado:

1.-El método "GEView.getViewportGlobeBounds()" te va a devolver un objeto "KmlLatLonBox". Ver aquí.

2.-La interfaz KmlLatLonBox dispone de las funciones KmlLatLonBox.getNorth() y KmlLatLonBox.getSouth() que te dan la latitud superior e inferior de la pantalla en la vista del momento (en grados decimales). Ver aquí.

3.-Las restas (en su valor absoluto para que el algoritmo funcione bien en el hemisferio sur), y si el valor es menor que el que tú determines, se activa el enderezamiento.

Simple e intuitivo, ¿verdad? Chocado

Supongo que la cuestión es si te vale la pena tanta historia, o si directamente le aplicas la función en cada cambio de zoom. Yo te recomendaba esto por: elegancia, para no sobresaturar el procedimiento con operaciones innecesarias y sobre todo (y la mas importante) por que con tu método estabas impidiendo que el usuario pudiera voluntariamente inclinar la vista, pues en ese caso la función automáticamente enderezaría la vista e impediría la operación.

La verdad es que veo el API de Google Earth cada vez mas limitado (además de mal explicado). Y no creo que lo amplíen en un futuro, google ve mas negocio con el maps.

Oye, ¿que tal si dejas un checkbox para activar y desactivar el evento a gusto del usuario?. ¿y sobre el botón derecho? en gmaps exite ese evento, no se si en GE está.

Respecto al terreno, no se si tomarmelo como curioso o como un fallo. Ahora, que también es verdad que los programadores de GEarth pensaran que quien no quiera una vista en relieve, mejor que cargue la vista satelital de gmaps (con menor gestión de recursos).

Bueno, la pelota está en tu tejado.
Ir arriba _polifemo
Compartir:

Morta
Veterano
Veterano
Registrado:09-10-2008
Mensajes: 64

Votos: 0 👍

EnlacesAsunto: Re: Inclinación de la vista al acercarnos al suelo

Publicado:
Responder citando
Hola Polifemo
Curiosa esa forma de determinar si está dentro de un margen de altura. Mides la diferencia entre latitudes y si es pequeña, estas cerca del suelo.. Nunca se me hubiera ocurrido Sonriente
Le echaré un vistazo.

Por cierto, he hecho una consulta al respecto de la exageración del terreno en la página oficial de Google Earth (donde puedes reportar fallos y solicitar funciones, no la conocía) y esto me han contestado de momento code.google.com/ ...ail?id=619
Al principio, me han regañado Trist remitiéndome a un ejemplo y diciendo que pusiera como valor 0 (lo que ya habíamos intentado y que no funciona). Cuando les he dicho que eso no funciona y que el ejemplo que citan tampoco funciona correctamente parece que han reconsiderado el tema. A ver que pasa.
También he consultado sobre el tema de la inclinación y he incluido la forma de dibujar circulos sin que se conviertan en ovalos. Ahí no han contestado todavía
Un saludo
Ir arriba Morta
Compartir:
Mostrar mensajes de anteriores:   
 Responder al tema   Versión Imprimible
Todas las horas son GMT + 1 Hora
Página 1 de 1 - Tema con 7 Mensajes y 24028 Lecturas - Última modificación: 06/04/2011




RSS: Foro Programación de Google Earth y Maps RSS - Ultimos Mensajes
Cambiar a:  


Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
No Puedes adjuntar archivos en este foro
Tu puedes descargar archivos en este foro



Mostrar/Ocultar Últimas Fotos del Foro