Professional Documents
Culture Documents
Integrantes: Angl Rene Penzzi Claudio Fabin Braatz Israel Gerome Van Nevel Denis Fabin Maernitz
Tabla de contenidos
1. 2. 3. Qu es una API? ............................................................................................................................. 3 Un poco de historia........................................................................................................................... 4 Introduccin...................................................................................................................................... 4 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. 3.8. 4. El "Hello, World" de Google Maps v. 3 ................................................................................. 5 Cmo declarar tu aplicacin como HTML5 .......................................................................... 5 Carga del API de Google Maps ............................................................................................... 6 Elementos DOM de mapa ........................................................................................................ 6 Opciones de mapa..................................................................................................................... 7 google.maps.Map: el objeto elemental .................................................................................... 7 Carga del mapa......................................................................................................................... 8 Latitudes y longitudes .............................................................................................................. 8
Bibliotecas en la versin 3 del API de Google Maps ..................................................................... 8 4.1. Biblioteca de elementos geomtricos de la versin 3 del API de JavaScript de Google Maps 9 4.2. 4.3. 4.4. Conceptos de geometra esfrica ............................................................................................. 9 Funciones de distancia y rea ................................................................................................ 10 Funciones de desplazamiento ................................................................................................ 12
5. 6.
Mtodos de codificacin ................................................................................................................. 14 Tipos de mapa ................................................................................................................................. 15 6.1. Tipos de mapas bsicos .......................................................................................................... 15
7. 8. 9. 10. 11.
Modificacin del registro del tipo de mapa .................................................................................. 16 Mapas con estilos ............................................................................................................................ 17 Funciones de mapas ....................................................................................................................... 17 Tipos de mapas personalizados ................................................................................................. 18 Coordenadas de mapa................................................................................................................ 18 Coordenadas mundiales ......................................................................................................... 18 Coordenadas de pxeles.......................................................................................................... 19 Coordenadas de mosaico ....................................................................................................... 20 La interfaz MapType ................................................................................................................. 20 Tipos de mapa base .................................................................................................................... 21 Tipos de mapa de superposicin ............................................................................................... 22 Tipos de mapa de imagen .......................................................................................................... 23 Proyecciones................................................................................................................................ 24
16.1. 16.2. 16.3. 17. 18. 18.1. 18.2. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
Implementacin de una proyeccin .................................................................................. 24 Transformaciones de coordenadas en proyecciones ....................................................... 24 Seleccin de mosaicos de mapas en proyecciones ............................................................ 25
Visin general de los eventos de mapa...................................................................................... 27 Existen dos tipos de eventos: ..................................................................................................... 27 Eventos de la interfaz de usuario .......................................................................................... 27 Cambios de estado de MVC .................................................................................................. 28 Eventos de mapa ......................................................................................................................... 28 Acceso a los argumentos en los eventos de la interfaz de usuario .......................................... 29 Cmo usar cierres en detectores de eventos ............................................................................. 30 Obtencin y configuracin de propiedades en los controladores de eventos ........................ 31 Cmo detectar eventos DOM .................................................................................................... 32 Controles del mapa..................................................................................................................... 33 La interfaz de usuario predeterminada.................................................................................... 34 El conjunto de controles predeterminado ................................................................................ 34 Cmo inhabilitar la interfaz de usuario predeterminada? ................................................... 35 Cmo aadir controles al mapa? ............................................................................................ 35 Opciones de los controles ........................................................................................................... 36 Cmo modificar los controles? ................................................................................................ 37 Cmo colocar los controles? .................................................................................................... 38 Controles personalizados ........................................................................................................... 40 Cmo representar controles personalizados? ........................................................................ 40 Cmo gestionar eventos desde controles personalizados? .................................................... 41 Cmo colocar los controles personalizados? .......................................................................... 41 Un ejemplo de un control personalizado .................................................................................. 42 Cmo aadir estados a los controles? ..................................................................................... 43
1. Qu es una API?
3
Interfaz de programacin de aplicaciones o API (del ingls Application Programming Interface) es el conjunto de funciones y procedimientos (o mtodos, en la programacin orientada a objetos) que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstraccin. Son usadas generalmente en las bibliotecas (tambin denominadas vulgarmente "libreras"). Una interfaz de programacin representa la capacidad de comunicacin entre componentes de software. Se trata del conjunto de llamadas a ciertas bibliotecas que ofrecen acceso a ciertos servicios desde los procesos y representa un mtodo para conseguir abstraccin en la programacin, generalmente (aunque no necesariamente) entre los niveles o capas inferiores y los superiores del software. Uno de los principales propsitos de una API consiste en proporcionar un conjunto de funciones de uso general, por ejemplo, para dibujar ventanas o iconos en la pantalla. De esta forma, los programadores se benefician de las ventajas de la API haciendo uso de su funcionalidad, evitndose el trabajo de programar todo desde el principio. Las APIs asimismo son abstractas: el software que proporciona una cierta API generalmente es llamado la implementacin de esa API.
2. Un poco de historia
Google Maps es el nombre de un servicio de Google. Es un servidor de aplicaciones de mapas en la Web. Ofrece imgenes de mapas desplazables, as como fotos satelitales del mundo e incluso la ruta entre diferentes ubicaciones o imgenes a pie de calle Street View. Desde el 6 de octubre del 2005, Google Maps es parte de Google Local. Es idntico a Google Earth, una aplicacin Windows/Mac/Linux que ofrece vistas del globo terrqueo, sea de da o de noche, pero que no es fcil de integrar a pginas Web. Ofrece, asimismo, la posibilidad de que cualquier propietario de una pgina Web integre muchas de sus caractersticas a su sitio. Google Maps fue anunciado por primera vez en Google Blog el 8 de febrero del 2005. Originalmente soportara slo a los usuarios de Internet Explorer y Mozilla Firefox, pero el soporte para Opera y Safari fue agregado el 25 de febrero del 2005. El software estuvo en su fase beta por 6 meses antes de convertirse en parte de Google Local, el 6 de octubre del 2005. Como en las aplicaciones webs de Google, se usan un gran nmero de archivos de Javascript para crear Google Maps. Como el usuario puede mover el mapa, la visualizacin del mismo se baja desde el servidor. Cuando un usuario busca un negocio, la ubicacin es marcada por un indicador en forma de pin, el cual es una imagen PNG transparente sobre el mapa. Para lograr la conectividad sin sincrona con el servidor, Google aplic el uso de AJAX dentro de esta aplicacin. Es una aplicacin para el desarrollo de mapas.
3. Introduccin
4
El elemento fundamental en cualquier aplicacin del API de Google Maps v. 3 es el propio mapa. En este segmento se explica el uso del objeto google.maps.Map fundamental y los aspectos bsicos de las operaciones de mapa.
<!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style type="text/css"> html { height: 100% } body { height: 100%; margin: 0px; padding: 0px } #map_canvas { height: 100% } </style> <script type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=set_to_true_or_false"> </script> <script type="text/javascript"> function initialize() { var latlng = new google.maps.LatLng(-34.397, 150.644); var myOptions = { zoom: 8, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); } </script> </head> <body onload="initialize()"> <div id="map_canvas" style="width:100%; height:100%"></div> </body> </html> Incluso en este sencillo ejemplo, hay algunas cosas que se deben tener en cuenta: 1. 2. 3. 4. 5. 6. Declaramos la aplicacin como HTML5 mediante la declaracin <!DOCTYPE html>. Incluimos el cdigo JavaScript del API de Google Maps mediante la etiqueta script. Creamos un elemento div denominado "map_canvas" que aloja el mapa. Creamos un objeto JavaScript literal para alojar una serie de propiedades de mapa. Escribimos una funcin JavaScript para crear un objeto de mapa. Inicializamos el objeto de mapa desde el evento onload de la etiqueta body. Estos pasos se explican a continuacin.
Te recomendamos que declares un DOCTYPE verdadero en tu aplicacin web. En los ejemplos que te mostramos aqu, hemos declarado nuestras aplicaciones como HTML5 mediante el sencillo DOCTYPE HTML5, tal y como se muestra a continuacin: <!DOCTYPE html> Los navegadores ms habituales mostrarn contenido declarado con este DOCTYPE en "modo estndar", lo que significa que tu aplicacin deber ser ms compatible con los navegadores. El DOCTYPE tambin est diseado para ajustarse de la mejor manera; as, los navegadores que no lo entiendan lo ignorarn y utilizarn el "modo chapucero" para mostrar el contenido. Se debe tener en cuenta que algunas de las CSS que funcionan en el modo chapucero no son vlidas en el modo estndar. En concreto, todos los tamaos basados en porcentajes deben heredarse de los elementos de bloque principales, y si cualquiera de estos antecesores no puede especificar un tamao, se supondr un tamao de 0 x 0 pxeles. Por esta razn, incluimos la siguiente declaracin <style>: <style type="text/css"> html { height: 100% } body { height: 100%; margin: 0px; padding: 0px } #map_canvas { height: 100% } </style> Esta declaracin de CSS indica que el contenedor del mapa <div> (denominado map_canvas) debe ocupar el 100% de la altura del cuerpo de HTML. Ten en cuenta que debemos declarar de forma especfica estos porcentajes tanto para <body> como para <html>.
<div id="map_canvas" style="width: 100%; height: 100%"></div> Para que el mapa se muestre en una pgina web, debemos reservar un lugar para l. Normalmente, lo hacemos mediante la creacin de un elemento div con nombre y la obtencin de una referencia a este elemento en el modelo de objetos de documento (DOM) del navegador. En el ejemplo anterior, definimos un objeto <div> denominado "map_canvas" y definimos su tamao mediante atributos de estilo. Ten en cuenta que este tamao se establece en "100%", lo que ampla el mapa hasta que ocupa toda la pantalla. Es posible que sea necesario ajustar estos valores segn el desplazamiento y el tamao de la pantalla del navegador. Ten en cuenta que el mapa siempre adoptar el tamao del elemento en el que est contenido, por lo que siempre debes establecer un tamao para el elemento <div> de forma explcita.
Constructor google.maps.Map(opts? )
Descripcin Permite crear un nuevo mapa a partir de los parmetros opcionales transmitidos por el parmetro
geometry: incluye funciones de utilidades para el clculo de valores geomtricos escalares (como la distancia y el rea) en la superficie terrestre. adsense: permite que la aplicacin desarrollada con el API de Google Maps incluya anuncios de texto contextuales para poder obtener ingresos con los anuncios mostrados a los usuarios. panoramio: contiene funciones que permiten aadir capas de fotos de Panoramio a las aplicaciones creadas con el API de Google Maps.
En la siguiente solicitud de inicializacin se muestra cmo solicitar la biblioteca google.maps.geometry del API de JavaScript de Google Maps: <script type="text/javascript" src="https://maps.google.com/maps/api/js?libraries=geometry&sensor=true_or_false"></script>
4.1. Biblioteca de elementos geomtricos de la versin 3 del API de JavaScript de Google Maps
La biblioteca de elementos geomtricos de la versin 3 del API de JavaScript de Google Maps ofrece funciones de utilidades para el clculo de datos geomtricos sobre la superficie de la Tierra. La biblioteca incluye dos espacios de nombre: spherical incluye utilidades de geometra esfrica y te permite calcular ngulos, distancias y reas a partir de latitudes y de longitudes. encoding incluye utilidades para codificar y decodificar rutas de polilneas de acuerdo con el Algoritmo de polilneas codificadas. La biblioteca google.maps.geometry no incluye clases; en su lugar, incluye mtodos estticos de los espacios de nombre anteriores.
En su lugar, puedes utilizar computeLength() para calcular la longitud de una trayectoria determinada si tienes diferentes ubicaciones. Ej.
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>Pars - Mosc - Pequn</title> <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false"> </script> <script type="text/javascript"> function InicializarMapa() { // establece las opciones y crea el mapa var opcionesMapa = { center: new google.maps.LatLng(47.0, 59.0), zoom: 2, mapTypeId: google.maps.MapTypeId.TERRAIN }; var mapa = new google.maps.Map(document.getElementById("elemento_mapa"), opcionesMapa); // coordenadas de Pars, Mosc y Pequn posicionParis = new google.maps.LatLng(48.856578, 2.351828); posicionMoscu = new google.maps.LatLng(55.752222, 37.615556); posicionPekin = new google.maps.LatLng(39.905556, 116.391389); // dibuja la ruta Pars - Mosc - Pequn, utilizando segmentos rectos // respecto a la proyeccin (polilnea estndar) var opcionesRutaParisPekin = { path: [ posicionParis, posicionMoscu, posicionPekin ], strokeColor: "#ff0000", strokeWeitght: 10, strokeOpacity: 0.5, geodesic: true, map: mapa }; var rutaParisPekin = new google.maps.Polyline(opcionesRutaParisPekin); // calcula la longitud en metros de la ruta var longitud = google.maps.geometry.spherical.computeLength(rutaParisPekin.getPath()); // muestra el longitud en km, redondeando el valor var opcionesVentana = {
10
content: "Longitud total: " + Math.round(longitud / 1000) + " km", position: posicionPekin } var ventanaInfo = new google.maps.InfoWindow(opcionesVentana); ventanaInfo.open(mapa); } </script> </head> <body onload="InicializarMapa()"> <div id="elemento_mapa" style="width: 500px; height: 300px"></div> </body> </html>
Como
se
puede
observar,
la
longitud
de
la
ruta
la
calculamos
mediante
la
funcin
"google.maps.geometry.spherical.computeLength()", que, atencin!, espera como parmetro un vector de objetos "LatLng" que representa la secuencia (ordenada) de vertices de la polilnea. Es importante tener claro que la funcin no espera un objeto "Polyline" sino solo sus vertices, Afortunadamente, obtener un vector con los vrtices de una polilne es tan fcil como llamar a la funcin "getPath()" de la clase "Polyline": var longitud = google.maps.geometry.spherical.computeLength(rutaParisPekin.getPath()); Cabe destacar que la longitud obtenida corresponde a la suma de las longitudes de las lneas geodsicas que unen los vrtices adyacientes de la polilnea. Es decir, el nmero que obtenemos s la distancia mnima real (sobre la superfcie terrestre) que se debe recorrer para ir des del origen al fin de la ruta pasando por todos los puntos de paso intermedios. Es importante entender que la longitud de una polilnea depende nica y exclusivamente de la posicin de sus vrtices. Esto significa que, aunque representemos la polilnea mediante segmentos rectos respecto a la proyeccin (recordad: especificando la opcin "geodesic: false" o, simplemente, obviando esta opcin) la longitud de la polilnea no cambiar. El resto del cdigo no presenta sorpresas. Tan solo merece ser destacado el uso de la funcin "Math.round()" que redondea un nmero decimal al nmero entero ms prximo. En el ejemplo se utiliza para redondear la distancia calculada.
Para calcular el rea de un rea poligonal, debes ejecutar computeArea(), transmitiendo el conjunto de objetos LatLng que definen un bucle cerrado. Ej. <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>rea de la Plaa de Catalunya de Barcelona</title> <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false" > </script> <script type="text/javascript"> function InicializarMapa() { // establece las opciones y crea el mapa var opcionesMapa = {
11
center: new google.maps.LatLng(41.387024, 2.169960), zoom: 16, mapTypeId: google.maps.MapTypeId.ROADMAP }; var mapa = new google.maps.Map(document.getElementById("elemento_mapa"), opcionesMapa); var esquinasPlaza = [ new google.maps.LatLng(41.387877, new google.maps.LatLng(41.387418, new google.maps.LatLng(41.385856, new google.maps.LatLng(41.386919, ]; 2.169971), 2.168748), 2.170143), 2.171205)
// delimita el contorno de la plaza var contornoPlaza = new google.maps.Polygon({ paths: esquinasPlaza, strokeColor: "#ff0000", // color del contorno strokeOpacity: 0.5, // opacidad del contorno strokeWeight: 10, // ancho del contorno fillColor: "#ff0000", // color de relleno fillOpacity: 0.2, // opacidad del relleno map: mapa // mapa sobre el que se debe dibujar el polgono }); // calcula el rea en metros cuadrados del polgono var area = google.maps.geometry.spherical.computeArea(contornoPlaza.getPath()); // muestra el resultado var opcionesVentana = { content: "rea total: " + Math.round(area) + " m<sup>2</sup>", position: mapa.getCenter() } var ventanaInfo = new google.maps.InfoWindow(opcionesVentana); ventanaInfo.open(mapa); } </script> </head> <body onload="InicializarMapa()"> <div id="elemento_mapa" style="width: 500px; height: 300px"></div> </body> </html>
12
A partir de dos objetos LatLng y un valor entre 0 y 1, tambin puedes calcular un destino entre ambos con el mtodo interpolate(), que calcula la interpolacin lineal esfrica entre las dos ubicaciones, donde el valor indica la distancia fraccional a recorrer desde el origen hasta el destino. El siguiente ejemplo crea dos polilneas cuando haces clic en dos puntos del mapa (una geodsica y una lnea "recta" que conectan las dos ubicaciones) y calcula el ngulo a recorrer entre los dos puntos:
function initialize() { var atlantic = new google.maps.LatLng(34, -40.605); var myOptions = { zoom: 4, center: atlantic, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map(document.getElementById('map_canvas'), myOptions); var polyOptions = { strokeColor: '#FF0000', strokeOpacity: 1.0, strokeWeight: 3 } poly = new google.maps.Polyline(polyOptions); poly.setMap(map); var geodesicOptions = { strokeColor: '#CC0099', strokeOpacity: 1.0, strokeWeight: 3, geodesic: true } geodesic = new google.maps.Polyline(geodesicOptions); geodesic.setMap(map); // Add a listener for the click event google.maps.event.addListener(map, 'click', addLocation); } function addLocation(event) { clickcount++; if (clickcount == 1) { addOrigin(event); } if (clickcount == 2) { addDestination(event); } } function addOrigin(event) { clearPaths(); var path = poly.getPath();
13
path.push(event.latLng); var gPath = geodesic.getPath(); gPath.push(event.latLng); } function addDestination(event) { var path = poly.getPath(); path.push(event.latLng); var gPath = geodesic.getPath(); gPath.push(event.latLng); adjustHeading(); clickcount = 0; } function clearPaths() { var path = poly.getPath(); while (path.getLength()) { path.pop(); } var gPath = geodesic.getPath(); while (gPath.getLength()) { gPath.pop(); } } function adjustHeading() { var path = poly.getPath(); var pathSize = path.getLength(); var heading = google.maps.geometry.spherical.computeHeading(path.getAt(0), path.getAt(pathSize - 1)); document.getElementById('heading').value = heading; document.getElementById('origin').value = path.getAt(0).lat() + "," + path.getAt(0).lng(); document.getElementById('destination').value = path.getAt(pathSize 1).lat() + "," + path.getAt(pathSize - 1).lng(); }
5. Mtodos de codificacin
Las trayectorias de la versin 3 del API de JavaScript de Google Maps frecuentemente se especifican como Array de objetos LatLng. Sin embargo, este tipo de conjunto frecuentemente es muy voluminoso para transmitirlo. Por ello, puedes utilizar el algoritmo de codificacin de poli lneas de Google para comprimir una trayectoria determinada, que posteriormente podrs descomprimir descodificndola. La biblioteca geometry incluye un nombre de espacio encoding para que las utilidades codifiquen y decodifiquen poli lneas. El mtodo esttico encodePath() codifica la trayectoria especificada. Puedes transmitir tanto un conjunto de LatLng como MVCArray (que devuelvePolyline.getPath()). Para decodificar una trayectoria codificada, solo debes ejecutar decodePath() transmitiendo el mtodo de la cadena codificada. El siguiente ejemplo muestra un mapa de Oxford, Misisipi (EE.UU.). Al hacer clic en el mapa se aade un punto a una poli lnea. A medida que se crea la poli lnea, su codificacin se muestra debajo.
14
var poly; var map; function initialize() { var oxford = new google.maps.LatLng(34.3664951, -89.5192484); var myOptions = { zoom: 14, center: oxford, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map(document.getElementById('map_canvas'), myOptions); var polyOptions = { strokeColor: '#000000', strokeOpacity: 1.0, strokeWeight: 3 } poly = new google.maps.Polyline(polyOptions); poly.setMap(map); // Add a listener for the click event google.maps.event.addListener(map, 'click', addLatLng); } /** * Handles click events on a map, and adds a new point to the Polyline. * Updates the encoding text area with the path's encoded values. */ function addLatLng(event) { var path = poly.getPath(); path.push(event.latLng); // Update the text field to display the polyline encodings var encodeString = google.maps.geometry.encoding.encodePath(path); if (encodeString != null) { document.getElementById('encodedPolyline').value = encodeString; } }
6. Tipos de mapa
En este documento se describen los tipos de mapas que puedes mostrar mediante el API de JavaScript de Google Maps. El API utiliza un objeto MapType para contener informacin sobre estos mapas. Un objeto MapType es una interfaz que define la visualizacin y el uso de mosaicos de mapas, as como la traduccin de sistemas de coordenadas de pantalla a coordenadas reales (en el mapa). Cada objeto MapType debe contener algunos mtodos para gestionar la recuperacin y el suministro de mosaicos y propiedades que definan su comportamiento visual. El funcionamiento interno de los tipos de mapas en el API de Google Maps constituye un tema de nivel avanzado. La mayora de los desarrolladores puede utilizar simplemente los tipos de mapas bsicos que se describen a continuacin. Sin embargo, tambin es posible definir mosaicos de mapas propios mediante tipos de mapas personalizados o modificar la presentacin de tipos de mapas existentes a travs de mapas con estilos. Para proporcionar tipos de mapas personalizados, debes saber cmo modificar el registro del tipo de mapa.
El API de Google Maps permite utilizar muchos tipos de mapas. Adems de los conocidos mosaicos de mapa de carreteras "pintados", el API de Google Maps tambin ofrece otros tipos de mapas. El API de Google Maps ofrece los siguientes tipos de mapas: MapTypeId.ROADMAP, que muestra la vista de mapa de carreteras predeterminada. MapTypeId.SATELLITE, que muestra imgenes de satlite de Google Earth. MapTypeId.HYBRID, que muestra una mezcla de vistas normales y de satlite. MapTypeId.TERRAIN, que muestra mosaicos de mapas fsicos a partir de la informacin de relieve.
Para modificar el tipo de mapa que utiliza el objeto Map, debes configurar la propiedad mapTypeId configurando el objeto Map options en el constructor o ejecutando el mtodo setMapTypeId() del mapa. # # Setting the mapTypeId upon construction # var myLatlng = new google.maps.LatLng(-34.397, 150.644); var myOptions = { zoom: 8, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); # # Modifying the mapTypeId dynamically # map.setMapTypeId(google.maps.MapTypeId.TERRAIN); Ten en cuenta que no configuras el tipo de mapa directamente, sino que configuras su objeto mapTypeId para hacer referencia a un objeto MapType mediante un identificador. La versin 3 del API de JavaScript de Google Maps utiliza un registro del tipo de mapa, que se explica a continuacin, para gestionar estas referencias .
16
zoom: 12, center: brooklyn, mapTypeControlOptions: { mapTypeIds: [google.maps.MapTypeId.ROADMAP, MY_MAPTYPE_ID] }, mapTypeId: MY_MAPTYPE_ID }; # Create our map. This creation will implicitly create a # map type registry. map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); # Create your custom map type using your own code. # (See below.) var myMapType = new MyMapType(); # Set the registry to associate 'mymap' with the # custom map type we created, and set the map to # show that map type. map.mapTypes.set(MY_MAPTYPE_ID, myMapType);
9. Funciones de mapas
Un mapa incluye un conjunto de funciones, como una carretera o un parque, especificados a travs de un objeto MapTypeStyleFeatureType. Los tipos de funciones forman un rbol de categoras, cuya raz es all. Al especificar la funcin como all, se seleccionarn todos los elementos de mapa. Algunas categoras de tipos de funciones incluyen subcategoras que se especifican separadas por puntos (por ejemplo, landscape.natural o road.local). Si se especifica la funcin principal (road, por ejemplo), entonces los estilos aplicados a esta seleccin se aplican a todas las carreteras, incluidas las subcategoras. Por otra parte, algunos de los recursos de un mapa constan de diferentes elementos. Por ejemplo, una carretera incluye, no solo la lnea grfica (geometra)que la representa sobre el mapa, sino tambin el texto que indica su nombre (etiquetas) en el mapa. Los elementos de las funciones se seleccionan especificando una categora de tipo MapTypeStyleElementType. Se admiten los siguientes tipos de elementos: all (predeterminado) selecciona todos los elementos del recurso. geometry permite seleccionar solamente los elementos geomtricos de la funcin correspondiente. labels selecciona solo las etiquetas de texto asociadas a una funcin concreta.
Si no se especifica ningn tipo de elemento, los estilos se aplican a todos los elementos con independencia del tipo de elemento.
17
La siguiente especificacin selecciona las etiquetas de todas las carreteras locales: { featureType: "road.local", elementType: "labels" }
11.Coordenadas de mapa
Google Maps API utiliza diversos sistemas de coordenadas: Valores de latitud y longitud que hacen referencia a un punto nico en el mundo. (Google utiliza el estndar WGS84 o Sistema Geodsico Mundial). Coordenadas mundiales que hacen referencia a un punto nico en el mapa. Coordenadas de mosaico que hacen referencia a un mosaico especfico del mapa en el nivel de zoom aplicado.
11.1.
Coordenadas mundiales
Siempre que Maps API necesite convertir una ubicacin del mundo en una ubicacin del mapa (la pantalla), primero deber convertir los valores de latitud y longitud en una coordenada "mundial". Esta conversin se realiza mediante una proyeccin cartogrfica. Google Maps utiliza la proyeccin de Mercator con este propsito. Tambin puedes definir tu propia proyeccin mediante la implementacin de la interfaz google.maps.Projection. (Ten en cuenta que las interfaces de la versin 3 no son clases que puedas "subclasificar", sino que son especificaciones simples para las clases que t mismo defines). Para una mayor comodidad en el clculo de las coordenadas en pxeles, asumimos que un mapa en el nivel de zoom 0 es un nico mosaico del tamao de mosaico base. A continuacin, definimos las coordenadas mundiales de acuerdo
18
con el sistema de coordenadas en pxeles en el nivel de zoom 0, utilizando la proyeccin para convertir latitudes y longitudes en posiciones de pxel en este mosaico base. Esta coordenada mundial es un valor de punto flotante medido desde el origen de la proyeccin del mapa hasta la ubicacin especfica. Ten en cuenta que como este valor es un valor de punto flotante, puede ser mucho ms preciso que la resolucin actual de la imagen de mapa que se muestre. En otras palabras, una coordenada mundial es independiente del nivel de zoom actual. Las coordenadas mundiales de Google Maps se miden a partir del origen de la proyeccin de Mercator (la esquina noroccidental del mapa a 180 grados de longitud y 85 grados de latitud aproximadamente) y se incrementa a lo largo del eje x en direccin este (derecha) y a lo largo del eje y en direccin sur (abajo). Dado que el mosaico base de la proyeccin de Mercator en Google Maps es de 256 x 256 pxeles, el espacio de coordenadas mundiales que se puede utilizar equivale a {0256}, {0-256}.
Ten en cuenta que una proyeccin de Mercator tiene un ancho longitudinalmente finito, pero un alto latitudinalmente infinito. "Cortamos" la imagen del mapa base que utiliza una proyeccin de Mercator en +/- 85 grados aproximadamente para que el mapa resultante tenga forma rectangular, con lo que la seleccin de mosaicos presenta una lgica mucho ms sencilla. Ten en cuenta que es posible que una proyeccin produzca coordenadas mundiales que se siten fuera del espacio de coordenadas utilizables del mapa base si te acercas demasiado a los polos, por ejemplo.
11.2.
Coordenadas de pxeles
Las coordenadas mundiales representan ubicaciones absolutas en una proyeccin dada, pero necesitamos convertirlas en coordenadas de pxeles para determinar la desviacin en "pxeles" en un nivel de zoom concreto. Estas coordenadas de pxeles se calculan mediante la frmula siguiente: pixelCoordinate = worldCoordinate * 2zoomLevel De la ecuacin anterior, fjate en que cada nivel de zoom creciente equivale al doble en las direcciones x y y. Por tanto, cada nivel de zoom superior presenta una resolucin que cuadriplica la del nivel precedente. Por ejemplo, en el nivel de zoom 1, el mapa consta de cuatro mosaicos de 256 x 256 pxeles, lo que equivale a un espacio en pxeles de 512 x 512. En el nivel de zoom 19, se puede hacer referencia a cada pxel x e y del mapa utilizando un valor entre 0 y 256 * 219. Dado que basamos las coordenadas mundiales en el tamao de mosaico del mapa, la parte entera de las coordenadas de pxeles permite identificar el pxel exacto en dicha ubicacin en el nivel de zoom actual. Ten en cuenta que en el nivel de zoom 0, las coordenadas de pxeles equivalen a las coordenadas mundiales. Ahora ya disponemos de un mtodo para representar con precisin todas las ubicaciones del mapa en todos los niveles de zoom. Google Maps API construye una ventana grfica a partir del centro del nivel de zoom del mapa (como LatLng) y el tamao del elemento DOM que lo contiene y convierte este cuadro delimitador en coordenadas de pxeles. El API determina entonces de forma lgica todos los mosaicos del mapa incluidos dentro de los lmites de pxeles
19
especificados. Se hace referencia a cada uno de estos mosaicos de mapa mediante coordenadas de mosaico, que simplifican enormemente la visualizacin de las imgenes del mapa.
11.3.
Coordenadas de mosaico
Lo ms probable es que Google Maps API no pueda cargar todas las imgenes del mapa en los niveles de zoom superiores, que resultan de mayor utilidad; en su lugar, Google Maps API descompone las imgenes de cada nivel de zoom en un conjunto de mosaicos de mapa organizados de forma lgica en el orden que comprende la aplicacin. Cuando se desplaza un mapa a una ubicacin nueva o a un nivel de zoom nuevo, Google Maps API determina los mosaicos necesarios mediante las coordenadas de pxeles y convierte estos valores en un conjunto de mosaicos para su recuperacin. Estas coordenadas de mosaico se asignan mediante un esquema que hace que resulte fcil determinar desde un punto de vista lgico el mosaico que contiene las imgenes correspondientes a un punto especfico. En Google Maps, los mosaicos se numeran desde el mismo origen que los pxeles. Para la implementacin en Google de la proyeccin de Mercator, el mosaico de origen se encuentra siempre en la esquina ms noroccidental del mapa; los valores del eje x aumentan de oeste a este y los del eje y aumentan de norte a sur. Los mosaicos se indexan utilizando las coordenadas x,y desde ese origen. Por ejemplo, en el nivel de zoom 2, cuando la Tierra se divide en 16 teselas, se puede hacer referencia a cada una de ellas mediante un par x,y exclusivo:
Ten en cuenta que al dividir las coordenadas de pxeles por el tamao de mosaico y tomar la parte entera del resultado, se obtiene como consecuencia la coordenada de mosaico en el nivel de zoom actual.
20
minZoom (obligatoria) especifica el nivel de zoom mnimo con el que se mostrarn los mosaicos de este tipo de mapa. De forma predeterminada, este valor es 0, lo que indica que no existe ningn nivel de zoom mnimo. name (opcional) especifica el nombre de este tipo de mapa. Esta propiedad solo es necesaria si deseas que este tipo de mapa se pueda seleccionar en el control MapType. alt (opcional) especifica el texto alternativo para este tipo de mapa, mostrado en forma de texto que se muestra al colocar el cursor del ratn sobre determinado elemento. Esta propiedad solo es necesaria si deseas que este tipo de mapa se pueda seleccionar en el control MapType. (Consulta la seccin Cmo aadir controles MapType incluida ms adelante). Adems, las clases que implementan la interfaz MapType necesitan que implementes los siguientes mtodos: getTile() (obligatorio) se ejecuta siempre que el API determina que es necesario mostrar en el mapa mosaicos nuevos en la ventana grfica correspondiente. El mtodo getTile() debe poseer la siguiente firma: getTile(tileCoord:Point,zoom:number,ownerDocument:Document):Node El API determina si es necesario ejecutar getTile() en base a las propiedades tileSize, minZoom y maxZoom de MapType y a la ventana grfica y el nivel de zoom actuales del mapa. El controlador de este mtodo debe devolver un elemento HTML a partir de una coordenada transmitida, el nivel de zoom y el elemento DOM en el que aadir la imagen de mosaico. releaseTile() (opcional) se ejecuta siempre que el API determina que es necesario eliminar un mosaico del mapa porque queda fuera del rea de visin. Este mtodo debe poseer la siguiente firma: releaseTile(tile:Node) Normalmente, la eliminacin de cualquier elemento asociado a los mosaicos del mapa se realiza despus de aadirlos a este. Por ejemplo, si has asociado detectores de eventos a las superposiciones de mosaicos de mapa, debers eliminarlos aqu. El mtodo getTile() funciona como el principal controlador para determinar los mosaicos que se cargarn en una ventana grfica concreta.
21
div.style.borderWidth = '1px'; div.style.borderColor = '#AAAAAA'; return div; }; CoordMapType.prototype.name = "Tile #s"; CoordMapType.prototype.alt = "Tile Coordinate Map Type"; var map; var chicago = new google.maps.LatLng(41.850033,-87.6500523); var coordinateMapType = new CoordMapType(); function initialize() { var mapOptions = { zoom: 10, center: chicago, mapTypeControlOptions: { mapTypeIds: ['coordinate', google.maps.MapTypeId.ROADMAP], style: google.maps.MapTypeControlStyle.DROPDOWN_MENU } }; map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); // Now attach the coordinate map type to the map's registry map.mapTypes.set('coordinate',coordinateMapType); // We can now set the map to use the 'coordinate' map type map.setMapTypeId('coordinate'); }
22
return div; }; var map; var chicago = new google.maps.LatLng(41.850033,-87.6500523); function initialize() { var mapOptions = { zoom: 10, center: chicago, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); // Insert this overlay map type as the first overlay map type at // position 0. Note that all overlay map types appear on top of // their parent base map. map.overlayMapTypes.insertAt(0, new CoordMapType(new google.maps.Size(256, 256))); }
El cdigo siguiente implementa un tipo ImageMapType bsico mediante los mosaicos de trfico de Google. Te en cuenta que el tipo de mapa se inserta en el conjunto overlayMapTypes del mapa:
var trafficOptions = { getTileUrl: function(coord, zoom) { return "http://mt3.google.com/mapstt?" + "zoom=" + zoom + "&x=" + coord.x + "&y=" + coord.y + "&client=api"; }, tileSize: new google.maps.Size(256, 256), isPng: true }; var trafficMapType = new google.maps.ImageMapType(trafficOptions); var map; function initialize() { map = new google.maps.Map(document.getElementById("map_canvas")); map.setCenter(new google.maps.LatLng(37.76, -122.45)); map.setZoom(12); map.setMapTypeId('satellite');
23
map.overlayMapTypes.insertAt(0, trafficMapType); }
16.Proyecciones
La Tierra es una esfera tridimensional (aproximadamente), mientras que un mapa es una representacin en dos dimensiones. El mapa que visualizas en el API de Google Maps, al igual que cualquier representacin plana de la Tierra, es una proyeccin de esa esfera en una superficie plana. En sus trminos ms bsicos, una proyeccin se puede definir como una asignacin de valores de latitud y longitud a las coordenadas del mapa de la proyeccin. En el API de Google Maps, las proyecciones deben implementar la interfaz Projection. La implementacin de un objeto Projection debe proporcionar no solo una asignacin de un sistema de coordenadas a otro, sino tambin una asignacin bidireccional. Es decir, debes determinar cmo traducir desde las coordenadas de la Tierra (LatLng) hasta el sistema de coordenadas mundiales de la proyeccin (Projection), y viceversa. Google Maps utiliza la proyeccin de Mercator para crear sus mapas a partir de datos geogrficos y convertir eventos del mapa en coordenadas geogrficas. Puedes obtener esta proyeccin ejecutando getProjection() en el mapa (Map) (o cualquier de los tipos de mapas (MapType) base estndar). En la mayora de usos, bastar con esta proyeccin (Projection), aunque tambin podrs definir y utilizar tu propias proyecciones personalizadas.
16.1.
A la hora de implementar una proyeccin personalizada, debes definir los siguientes elementos: Las frmulas para cambiar coordenadas de latitud y longitud a un plano cartesiano y viceversa. (La interfaz Projection solo admite transformaciones a coordenadas rectilneas). El tamao del mosaico base. Todos los mosaicos deben ser rectangulares. El "tamao del mundo" de un mapa utilizando el conjunto de mosaicos base a un nivel 0 de zoom. Ten en cuenta que en los mapas que se componen de un mosaico a un nivel 0 de zoom, el tamao del mundo coincide con el tamao del mosaico base.
16.2.
Cada proyeccin proporciona dos mtodos que realizan conversiones entre estos dos sistemas de coordenadas, lo que te permite convertir coordenadas geogrficas en mundiales y viceversa: El mtodo Projection.fromLatLngToPoint() convierte un valor LatLng en una coordenada mundial. Este mtodo se utiliza para posicionar superposiciones en el mapa (y para posicionar el mapa en s). El mtodo Projection.fromPointToLatLng() convierte una coordenada mundial en un valor LatLng. Este mtodo se utiliza para convertir eventos, como los clics que se registran en el mapa, en coordenadas geogrficas.
24
16.3.
Las proyecciones adems de ser tiles para determinar posiciones de ubicaciones o superposiciones, ayudan a posicionar los propios mosaicos de mapas. El API de Google Maps representa mapas base mediante una interfaz MapType, que debe declarar una propiedad projection para identificar la proyeccin del mapa y un mtodo getTile() para recuperar los mosaicos del mapa en funcin de los valores de coordenadas del mosaico. Las coordenadas del mosaico se basan en el tamao del mosaico bsico (que debe ser rectangular) y el "tamao del Mundo" de tu mapa, que es el tamao de pxel de tu mapa del mundo a un nivel 0 de zoom. (En el caso de los mapas compuestos por un mosaico a un nivel de 0 zoom, el mosaico tiene el mismo tamao que el Mundo). Defines el tamao del mosaico base en la propiedad tileSize de MapType. Defines el tamao del Mundo implcitamente en los mtodos fromLatLngToPoint() y fromPointToLatLng() de tu proyeccin. Debido a que la seleccin de las imgenes depende de estos valores transmitidos, es til establecer un nombre para las imgenes que se puedan seleccionar automticamente, en funcin de estos valores transmitidos, como por ejemplo map_zoom_tileX_tileY.png. El siguiente ejemplo define un ImageMapType con la proyeccin de Gall-Peters: // Note: this value is exact as the map projects a full 360 degrees of longitude var GALL_PETERS_RANGE_X = 800; // Note: this value is inexact as the map is cut off at ~ +/- 83 degrees. // However, the polar regions produce very little increase in Y range, so // we will use the tile size. var GALL_PETERS_RANGE_Y = 510; function degreesToRadians(deg) { return deg * (Math.PI / 180); } function radiansToDegrees(rad) { return rad / (Math.PI / 180); } function GallPetersProjection() { // Using the base map tile, denote the lat/lon of the equatorial origin. this.worldOrigin_ = new google.maps.Point(GALL_PETERS_RANGE_X * 400 / 800, GALL_PETERS_RANGE_Y / 2); // This projection has equidistant meridians, so each longitude degree is a linear // mapping. this.worldCoordinatePerLonDegree_ = GALL_PETERS_RANGE_X / 360; // This constant merely reflects that latitudes vary from +90 to -90 degrees. this.worldCoordinateLatRange = GALL_PETERS_RANGE_Y / 2; }; GallPetersProjection.prototype.fromLatLngToPoint = function(latLng) { var origin = this.worldOrigin_; var x = origin.x + this.worldCoordinatePerLonDegree_ * latLng.lng(); // Note that latitude is measured from the world coordinate origin // at the top left of the map.
25
var latRadians = degreesToRadians(latLng.lat()); var y = origin.y - this.worldCoordinateLatRange * Math.sin(latRadians); return new google.maps.Point(x, y); }; GallPetersProjection.prototype.fromPointToLatLng = function(point, noWrap) { var y = point.y; var x = point.x; if (y y = } if (y y = } < 0) { 0; >= GALL_PETERS_RANGE_Y) { GALL_PETERS_RANGE_Y;
var origin = this.worldOrigin_; var lng = (x - origin.x) / this.worldCoordinatePerLonDegree_; var latRadians = Math.asin((origin.y - y) / this.worldCoordinateLatRange); var lat = radiansToDegrees(latRadians); return new google.maps.LatLng(lat, lng, noWrap); }; function initialize() { var gallPetersMap; var gallPetersMapType = new google.maps.ImageMapType({ getTileUrl: function(coord, zoom) { var numTiles = 1 << zoom; // Don't wrap tiles vertically. if (coord.y < 0 || coord.y >= numTiles) { return null; } // Wrap tiles horizontally. var x = ((coord.x % numTiles) + numTiles) % numTiles; // For simplicity, we use a tileset consisting of 1 tile at zoom level 0 // and 4 tiles at zoom level 1. var baseURL = 'images/'; baseURL += 'gall-peters_' + zoom + '_' + x + '_' + coord.y + '.png'; return baseURL; }, tileSize: new google.maps.Size(800, 512), isPng: true, minZoom: 0, maxZoom: 1, name: 'Gall-Peters' }); gallPetersMapType.projection = new GallPetersProjection(); var mapOptions = { zoom: 0, center: new google.maps.LatLng(0,0) };
26
Las notificaciones de cambio de estado de MVC (Modelviewcontroller) reflejan los cambios en los objetos del API de Google Maps y se denominan mediante una convencin property_changed.
Cada objeto del API de Google Maps exporta una determinada cantidad de eventos con nombres. Los programas interesados en determinados eventos registran detectores de eventos de JavaScript para estos eventos y ejecutan cdigo al recibirlos mediante el registro de controladores de eventos addListener() en el espacio de nombre google.maps.event. Modelo Vista Controlador (MVC) es un patrn de arquitectura de software que separa los datos de una aplicacin, la interfaz de usuario, y la lgica de negocio en tres componentes distintos. El patrn de llamada y retorno MVC (segn CMU), se ve frecuentemente en aplicaciones web, donde la vista es la pgina HTML y el cdigo que provee de datos dinmicos a la pgina. El modelo es el Sistema de Gestin de Base de Datos y la Lgica de negocio, y el controlador es el responsable de recibir los eventos de entrada desde la vista.
18.1.
Algunos objetos del API de Google Maps estn diseados para responder a los eventos de usuario como los de ratn o los de teclado. Por ejemplo, un objeto google.maps.Marker puede detectar los siguientes eventos de usuario:
'mouseover' 'mouseout'
Estos eventos pueden tener el aspecto de eventos DOM estndar pero, realmente, forman parte del API de Google Maps. Dado que los distintos navegadores implementan distintos modelos de eventos DOM, el API de Google Maps ofrece estos mecanismos que permiten detectar eventos DOM y responder a ellos sin necesidad de gestionar las diversas peculiaridades de cada plataforma. Estos eventos suelen incluir argumentos en el evento que destacan algn estado de la interfaz de usuario (como, por ejemplo, la posicin del ratn).
18.2.
Los objetos MVC suelen contener estado. Cuando cambia la propiedad de un objeto, el API activa un evento que la propiedad ha cambiado. Por ejemplo, el API activa un evento zoom_changed en un mapa cuando cambia el nivel de zoom del mismo. Para interceptar estos cambios de estado, registra tambin los controladores de eventos addListener() en el mtodo de espacio de nombre event. Los eventos de usuario y los cambios de estado de MVC pueden parecer similares pero, generalmente, se recomienda tratarlos de forma diferente en el cdigo. Los eventos MVC, por ejemplo, no incluyen argumentos en sus eventos. Se recomienda inspeccionar la propiedad que se ha modificado en un cambio de estado de MVC mediante la ejecucin del mtodo getProperty adecuado de ese objeto.
var map; function initialize() { var myLatlng = new google.maps.LatLng(-25.363882,131.044922); var myOptions = { zoom: 4, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); google.maps.event.addListener(map, 'zoom_changed', function() { setTimeout(moveToDarwin, 3000); });
28
var marker = new google.maps.Marker({ position: myLatlng, map: map, title:"Hello World!" }); google.maps.event.addListener(marker, 'click', function() { map.setZoom(8); }); } function moveToDarwin() { var darwin = new google.maps.LatLng(-12.461334, 130.841904); map.setCenter(darwin); }
var map; function initialize() { var myLatlng = new google.maps.LatLng(-25.363882,131.044922); var myOptions = { zoom: 4, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); google.maps.event.addListener(map, 'click', function(event) { placeMarker(event.latLng); }); } function placeMarker(location) { var marker = new google.maps.Marker({ position: location, map: map });
29
map.setCenter(location); }
var map; function initialize() { var myLatlng = new google.maps.LatLng(-25.363882,131.044922); var myOptions = { zoom: 4, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); // Add 5 markers to the map at random locations var southWest = new google.maps.LatLng(-31.203405,125.244141); var northEast = new google.maps.LatLng(-25.363882,131.044922); var bounds = new google.maps.LatLngBounds(southWest,northEast); map.fitBounds(bounds); var lngSpan = northEast.lng() - southWest.lng(); var latSpan = northEast.lat() - southWest.lat(); for (var i = 0; i < 5; i++) { var location = new google.maps.LatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random()); var marker = new google.maps.Marker({ position: location, map: map }); var j = i + 1; marker.setTitle(j.toString()); attachSecretMessage(marker, i); } } // The five markers show a secret message when clicked // but that message is not within the marker's instance data
30
function attachSecretMessage(marker, number) { var message = ["This","is","the","secret","message"]; var infowindow = new google.maps.InfoWindow( { content: message[number], size: new google.maps.Size(50,50) }); google.maps.event.addListener(marker, 'click', function() { infowindow.open(map,marker); }); }
var map; function initialize() { var myLatlng = new google.maps.LatLng(-25.363882,131.044922); var myOptions = { zoom: 4, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); var zoomLevel; var infowindow = new google.maps.InfoWindow( { content: 'Zoom Level Test', size: new google.maps.Size(50,50), position: myLatlng }); infowindow.open(map); google.maps.event.addListener(map, 'zoom_changed', function() { zoomLevel = map.getZoom(); 31
miembros jerrquicos de DOM como window o document.body.myform, elementos con nombre como document.getElementById("foo").
Hay que tener en cuenta que addDomListener() solo transmite el evento indicado al navegador, que lo gestiona de
acuerdo con el modelo de evento de DOM del navegador; no obstante, casi todos los navegadores modernos admiten al menos el nivel dos DOM. El evento window.onload, que gestionamos con la etiqueta <body>. Utilizamos este evento para activar el cdigo JavaScript inicial una vez se ha cargado por completo una pgina HTML como se muestra a continuacin:
<script> function initialize() { // Map initialization } </script> <body onload="initialize()"> <div id="map_canvas"></div> </body>
Aunque este evento se asocia al elemento <body>, es en realidad un evento window que indica que la jerarqua DOM debajo del elemento window se ha creado y representado completamente. Aunque es fcil de comprender, un evento onload dentro de una etiqueta <body> mezcla contenido con comportamiento. Generalmente, se considera una buena prctica separar el cdigo de contenido (HTML) del cdigo de comportamiento (JavaScript) y suministrar el cdigo de presentacin (CSS) tambin aparte. Puedes hacerlo sustituyendo el
32
controlador de eventos onload en lnea por un detector DOM dentro del cdigo JavaScript del API de Google Maps como se indica a continuacin:
<script> function initialize() { // Map initialization } google.maps.event.addDomListener(window, 'load', initialize); </script> <body> <div id="map_canvas"></div> </body>
33
El control de giro incluye un icono circular pequeo que te permite girar mapas que contienen imgenes oblicuas. Este control aparece en la esquina superior izquierda del mapa de forma predeterminada. El control de mapa general muestra un mapa general en miniatura que refleja la ventana grfica del mapa actual dentro de una zona ms amplia. Este control aparece en la esquina inferior derecha del mapa y se muestra contrado de forma predeterminada. Nota: el control de navegacin que exista anteriormente se ha descartado y divido en controles de zoom y desplazamiento independientes. No puedes acceder ni modificar estos controles del mapa directamente, pero puedes modificar los campos MapOptions del mapa que afectan a la visibilidad y a la presentacin de los controles. Puedes ajustar la presentacin de los controles creando una instancia del mapa (con las opciones adecuadas MapOptions) o modificar un mapa de forma dinmica ejecutando setOptions() para cambiar las opciones del mapa. No todos estos controles estn habilitados de forma predeterminada.
Control Zoom
Pantallas pequeas Control de zoom pequeo para pantallas de menos de 400x350 px No est presente en pantallas de menos de 400x350 px
iPhone No est presente. La imagen se acerca y se aleja pellizcando la pantalla con dos dedos. No est presente. El usuario se desplaza por la imagen tocando la pantalla.
Desplazamiento
MapType
34
Escala
No presente
No presente
No presente
No presente
Adems, el manejo con el teclado est activado de forma predeterminada en todos los dispositivos.
function initialize() { var myOptions = { zoom: 4, center: new google.maps.LatLng(-33, 151), disableDefaultUI: true, mapTypeId: google.maps.MapTypeId.ROADMAP } var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); }
35
zoom: 4, center: new google.maps.LatLng(-33, 151), panControl: false, zoomControl: false, scaleControl: true, mapTypeId: google.maps.MapTypeId.ROADMAP } var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); }
36
function initialize() { var myOptions = { zoom: 4, center: new google.maps.LatLng(-33, 151), mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU }, zoomControl: true, zoomControlOptions: { style: google.maps.ZoomControlStyle.SMALL }, mapTypeId: google.maps.MapTypeId.ROADMAP } var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); } Los controles se suelen configurar al crear el mapa. Sin embargo, puedes modificar la presentacin de los controles de forma dinmica ejecutando el mtodo setOptions() del mapa Map y pasndole nuevas opciones de controles.
37
overviewMapControl habilita e inhabilita el control de mapa general. El control de mapa general se puede mostrar de forma completa (como un mapa general en miniatura) o contrado en un estado minimizado. De forma predeterminada, el control se inhabilita y se contrae. De forma adicional, el campooverviewMapControlOptions especifica las opciones OverviewMapControlOptions que se deben utilizar para este control.
38
Ten en cuenta que estas posiciones pueden coincidir con las de los elementos de la interfaz de usuario, las cuales no se pueden modificar (como, por ejemplo, el copyright y el logotipo de Google). En estos casos, los controles se colocarn en funcin de la lgica anotada para cada posicin y aparecern en la posicin ms prxima posible a la indicada. En el siguiente ejemplo se muestra un mapa sencillo en el que se incluyen todos los controles habilitados en las diferentes posiciones.
function initialize() { var myOptions = { zoom: 12, center: new google.maps.LatLng(-28.643387, 153.612224), mapTypeId: google.maps.MapTypeId.ROADMAP, mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.BOTTOM_CENTER }, panControl: true, panControlOptions: { position: google.maps.ControlPosition.TOP_RIGHT }, zoomControl: true, zoomControlOptions: { style: google.maps.ZoomControlStyle.LARGE, position: google.maps.ControlPosition.LEFT_CENTER }, scaleControl: true, scaleControlOptions: { position: google.maps.ControlPosition.TOP_LEFT },
39
streetViewControl: true, streetViewControlOptions: { position: google.maps.ControlPosition.LEFT_TOP } } var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); }
La forma de representar el control depende de ti. En general, te recomendamos que coloques toda la presentacin del control en un nico elemento <div> para que puedas manipular el control como una unidad. En los ejemplos que se muestran a continuacin se utiliza este patrn de diseo. Para disear controles atractivos, es necesario disponer de conocimientos de la estructura DOM y CSS. En el cdigo que se muestra a continuacin se indica cmo se crea un control sencillo a partir de un elemento <div> contenedor, de un elemento <div> para contener el diseo del botn y de otro elemento <div> para contener el interior del botn. // Create a div to hold the control. var controlDiv = document.createElement('DIV'); // Set CSS styles for the DIV containing the control // Setting padding to 5 px will offset the control // from the edge of the map controlDiv.style.padding = '5px'; // Set CSS for the control border var controlUI = document.createElement('DIV'); controlUI.style.backgroundColor = 'white'; controlUI.style.borderStyle = 'solid'; controlUI.style.borderWidth = '2px'; controlUI.style.cursor = 'pointer';
40
controlUI.style.textAlign = 'center'; controlUI.title = 'Click to set the map to Home'; controlDiv.appendChild(controlUI); // Set CSS for the control interior var controlText = document.createElement('DIV'); controlText.style.fontFamily = 'Arial,sans-serif'; controlText.style.fontSize = '12px'; controlText.style.paddingLeft = '4px'; controlText.style.paddingRight = '4px'; controlText.innerHTML = 'Home'; controlUI.appendChild(controlText);
Para que un control resulte til, debe realizar alguna funcin. Las funciones del control dependen de ti. El control puede responder a la introduccin de datos realizada por el usuario o a los cambios realizados en el estado del mapa Map. Para responder a la introduccin de datos realizada por el usuarios, el API de Google Maps proporciona un mtodo de gestin de eventos en varios navegadores addDomListener() que controla la mayora de los eventos DOM admitidos del navegador. El fragmento de cdigo que se muestra a continuacin aade un detector para el evento 'click' del navegador. Ten en cuenta que este evento se recibe del DOM, no del mapa. // Setup the click event listener: simply set the map to center on Chicago var chicago = new google.maps.LatLng(41.850033, -87.6500523); google.maps.event.addDomListener(outer, 'click', function() { map.setCenter(chicago) });
41
var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); // Construct your control in whatever manner is appropriate. // Generally, your constructor will want access to the // DIV on which you'll attach the control UI to the Map. var controlDiv = document.createElement('DIV'); var myControl = new MyControl(controlDiv); // We don't really need to set an index value here, but // this would be how you do it. Note that we set this // value as a property of the DIV itself. controlDiv.index = 1; // Add the control to the map at a designated control position // by pushing it on the position's array. This code will // implicitly add the control to the DOM, through the Map // object. You should not attach the control manually. map.controls[google.maps.ControlPosition.TOP_RIGHT].push(controlDiv);
36.
El control que se muestra a continuacin es sencillo (aunque no es especialmente til) y combina los patrones indicados anteriormente. Este control responde a los eventos'click' DOM centrando el mapa en una cierta ubicacin predeterminada: var map; var chicago = new google.maps.LatLng(41.850033, -87.6500523); /** * The HomeControl adds a control to the map that simply * returns the user to Chicago. This constructor takes * the control DIV as an argument. */ function HomeControl(controlDiv, map) { // Set CSS styles for the DIV containing the control // Setting padding to 5 px will offset the control // from the edge of the map controlDiv.style.padding = '5px'; // Set CSS for the control border var controlUI = document.createElement('DIV'); controlUI.style.backgroundColor = 'white'; controlUI.style.borderStyle = 'solid'; controlUI.style.borderWidth = '2px'; controlUI.style.cursor = 'pointer'; controlUI.style.textAlign = 'center'; controlUI.title = 'Click to set the map to Home'; controlDiv.appendChild(controlUI); // Set CSS for the control interior var controlText = document.createElement('DIV'); controlText.style.fontFamily = 'Arial,sans-serif'; controlText.style.fontSize = '12px'; controlText.style.paddingLeft = '4px'; controlText.style.paddingRight = '4px'; controlText.innerHTML = 'Home'; controlUI.appendChild(controlText); // Setup the click event listeners: simply set the map to Chicago google.maps.event.addDomListener(controlUI, 'click', function() { map.setCenter(chicago)
42
}); } function initialize() { var mapDiv = document.getElementById('map_canvas'); var myOptions = { zoom: 12, center: chicago, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(mapDiv, myOptions); // Create the DIV to hold the control and call the HomeControl() constructor // passing in this DIV. var homeControlDiv = document.createElement('DIV'); var homeControl = new HomeControl(homeControlDiv, map); homeControlDiv.index = 1; map.controls[google.maps.ControlPosition.TOP_RIGHT].push(homeControlDiv); }
37.
Los controles tambin pueden almacenar estados. El ejemplo que se muestra a continuacin es similar al indicado anteriormente, pero, en este caso, el control contiene un botn de establecimiento de la pgina principal que establece el control para que muestre una nueva ubicacin de la pgina principal. Para ello, creamos una propiedad home_ dentro del control para almacenar este estado y para proporcionar captadores y definidores del mismo. var map; var chicago = new google.maps.LatLng(41.850033, -87.6500523); /** * The HomeControl adds a control to the map that * returns the user to the control's defined home. */ // Define a property to hold the Home state HomeControl.prototype.home_ = null; // Define setters and getters for this property HomeControl.prototype.getHome = function() { return this.home_; } HomeControl.prototype.setHome = function(home) { this.home_ = home; } function HomeControl(map, div, home) { // Get the control DIV. We'll attach our control UI to this DIV. var controlDiv = div; // We set up a variable for the 'this' keyword since we're adding event // listeners later and 'this' will be out of scope. var control = this; // Set the home property upon construction control.home_ = home;
43
// Set CSS styles for the DIV containing the control. Setting padding to // 5 px will offset the control from the edge of the map controlDiv.style.padding = '5px'; // Set CSS for the control border var goHomeUI = document.createElement('DIV'); goHomeUI.title = 'Click to set the map to Home'; controlDiv.appendChild(goHomeUI); // Set CSS for the control interior var goHomeText = document.createElement('DIV'); goHomeText.innerHTML = 'Home'; goHomeUI.appendChild(goHomeText); // Set CSS for the setHome control border var setHomeUI = document.createElement('DIV'); setHomeUI.title = 'Click to set Home to the current center'; controlDiv.appendChild(setHomeUI); // Set CSS for the control interior var setHomeText = document.createElement('DIV'); setHomeText.innerHTML = 'Set Home'; setHomeUI.appendChild(setHomeText); // Setup the click event listener for Home: // simply set the map to the control's current home property. google.maps.event.addDomListener(goHomeUI, 'click', function() { var currentHome = control.getHome(); map.setCenter(currentHome); }); // Setup the click event listener for Set Home: // Set the control's home to the current Map center. google.maps.event.addDomListener(setHomeUI, 'click', function() { var newHome = map.getCenter(); control.setHome(newHome); }); } function initialize() { var mapDiv = document.getElementById('map_canvas'); var myOptions = { zoom: 12, center: chicago, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(mapDiv, myOptions); // Create the DIV to hold the control and call the HomeControl() // constructor passing in this DIV. var homeControlDiv = document.createElement('DIV'); var homeControl = new HomeControl(map, homeControlDiv, chicago); homeControlDiv.index = 1; map.controls[google.maps.ControlPosition.TOP_RIGHT].push(homeControlDiv); }
44
45