jueves, 18 de diciembre de 2014

MongoDB o PostGIS?

¿Qué es mongoDB?
MongoDB es una base de datos NOSQL orientada  a documentos, desarrollada con código abierto.

¿Qué significa que es “NoSQL”?
Significa que en lugar de guardar los datos en tablas como se hace en las bases de datos relacionales, MongoDB guarda estructuras de datos en documentos tipo JSON con un esquema dinámico (BSON), haciendo que la integración de los datos en ciertas aplicaciones sea más fácil y rápida.
En el gráfico se aprecia la relación de una base de datos relacional (RDBMS) tanto la escalabilidad como la velocidad se ven afectados ante un número elevado de elementos en la base de datos MongoDB.

Desde hace 7 años que fue creada ha venido implementando características para ser usada como una base para la producción de uso y con muchas características. Una de las características principales que es es un base datos con un modelo de datos diferente, ya que está “orientada a documentos” con el esquema de un JSON como almacenamiento.

JSON
¿Qué ventajas tiene la representación de nuestros datos utilizando un formato JSON?
JSON presenta un framework flexible y conciso tanto para consultas,como para almacenar registros.
La sintaxis JSON es similar a la de otras estructuras de datos utilizados en muchos lenguajes de programación y es por tanto, familiar para los desarrolladores.
JSON es independiente del lenguaje de programación que se utilice.

¿Que tipos de datos puede almacenar un JSON?
6 tipos de datos:
  • cadenas
  • números
  • textos boolenaos (verdadero/falso)
  • nulos
  • arrays
  • objetos/documentos
Estructura:
{
"id" : 5010,
"ciudad" : "Ibarra",
"distrito" : "Ciudad Blanca"
 "Zona" : "Zona 1 Norte"

}

¿Cómo se realiza una consulta en MongoDB?

Esta estructura de JSON presenta ventajas de rendimiento al hacer Joins y transacciones ya que es una operación más rápida y limpia que realizar la misma consulta en SQL.


En una base de datos NoSQL no hay consultas SQL de tipo SELECT * FROM WHERE.

Las consultas se hacen pasando objetos JSON como parámetro. Por ejemplo:


db.Clientes.find({Nombre:"David"});

La consulta anterior buscará todos los clientes cuyo nombre sea David.


MongoDB viene de serie con una consola desde la que podemos ejecutar los distintos comandos.MongoDB se está utilizando en aplicaciones web de alto rendimiento. PostGIS se utiliza principalmente en proyectos gubernamentales o empresariales.

MongoDB destaca en la gestión de datos geoespaciales de gran volumen (big data). Es por lo tanto una solución a un problema real, la gestión de grandes volúmenes de datos. Este sistema responde también a las necesidades de escalabilidad horizontal que tienen cada vez más empresas.

En cuanto a las funcionalidades geométricas, MongoDB soporta algunas funcionalidades geométricas por lo que es una buena opción para gestionar datos geográficos sencillos. PostGIS tiene una capacidad de análisis espacial mucho más sofisticada, es un autentico sistema GIS. Por otra parte MongoDB utiliza índices B-Tree y PostGIS índices R-Tree. Un B-tree no puede ser utilizado de manera eficiente para indexar polígonos.

Por último mencionar que es algo complicado aprender a gestionar estas bases de datos NoSQL.


viernes, 21 de noviembre de 2014

Uso de servicios OCG

Introducción
En los módulos anteriores, hemos aprendido a programar herramientas SIG utilizando siempre la cartografía que acompañaba a la aplicación: en el caso de GoogleMaps, los cuatro tipos de mapa que nos ofrece su API, y en el caso de gvSIG, los mapas que habíamos obtenido previamente de algun servidor de mapas.

Sin embargo, la proliferación de los servicios de cartografía en línea ha hecho posible una nueva forma de trabajar en la que el cliente no dispone ya de una copia propia de los datos, sino que accede continuamente a servicios en línea que mantienen una copia actualizada de esos datos.
En esta parte, aprenderemos a utilizar la cartografía disponible en línea, es decir, a interaccionar con los servicios OGC desde nuestro código para obtener todo tipo de mapas e incorporarlos a nuestra aplicación SIG.

1. Google Maps y WMS
1.1. Anatomía de un mapa: los tiles
 Todos los mapas de Google Maps estan divididos en porciones de 256 X 256 píxeles llamadas tiles. Cuando se solicita un mapa, Google Maps descarga del servidor las distintas porciones por separado y las junta, creando la ilusión de una única imagen:
  

 El objetivo de reducir el mapa en porciones no es otro que minimizar el tamaño de los datos que el servidor tiene que enviar a las distintas aplicaciones. Debemos pensar que si bien en niveles de zoom pequeños sí que sería factible tener todo el mapa en una única imagen (cuyo tamaño sería de alrededor de unos pocos kilobytes), no sucede lo mismo con los niveles de zoom grandes, en los que sería prácticamente imposible enviar el mapa entero (cuyo tamaño sería de gigabytes).

En el nivel de zoom más pequeño (el nivel 0), el planeta entero está representado en una única porción. Cada nivel subsiguiente de zoom divide cada porción en cuatro subporciones, de manera que el número total de porciones responde a la fórmula 4N, donde N es el nivel de zoom. Así pues, en el nivel 1 habrá cuatro porciones (que formarán una rejilla de 2 x 2), en el nivel 2, dieciséis (que  formarán una rejilla de 4 x 4), y así sucesivamente.

1.2. Mapas personalizados
La API de Google Maps nos permite definir mapas personalizados, cuyo contenido (el contenido de cada una de las porciones) podemos elegir arbitrariamente. Una vez creados, estos mapas se pueden agregar a la vista mediante dos mecanismos diferenciados:
• como una capa del mapa actual, o
• como un mapa independiente.
Aunque existan dos formas de agregar mapas personalizados a una vista, la forma de implementarlos es siempre la misma: crear un objeto “GTileLayer” y sobrecargar las funciones siguientes:

• getTileUrl. Devuelve la dirección (URL) que contiene la imagen de la porción (tile) del mapa, dadas las coordenadas de la porción y el nivel de zoom.
• isPng. Devuelve un valor booleano indicando si la imagen de la porción está en formato PNG*, en cuyo caso puede contener transparencias.
• getOpacity. Devuelve un valor entre 0,0 y 1,0 indicando el nivel de opacidad del mapa. 0,0 es completamente transparente, y 1,0, completamente opaco.

Ejemplo 1: añadir una marca de agua a un mapa

 Veamos un ejemplo sencillo de implementación de un mapa personalizado. Supongamos que deseamos mostrar los mapas de Google con el logotipo de la UOC sobreimpreso a modo de marca de agua*.
La idea es que la marca de agua se vaya repitiendo a lo largo y ancho del mapa, a intervalos regulares. Para lograr este objetivo, emplazaremos una misma imagen —el logotipo cualquiera— en todas y cada una de las porciones que, recordemos, dividen el mapa en áreas de 256 x 256 píxeles. A todos los efectos, es como si creásemos un mosaico con el logotipo de la UOC. Para crear el efecto de marca de agua, estableceremos el nivel de opacidad del mapa en el 50%.

Suponiendo que tenemos el logotipo de la UOC en un fichero llamado “logo.png”(de 256 x 256 píxeles), el código que crea el mapa nos quedaría así:

var capaLogo;
capaLogo = new GTileLayer(null, 0, 19);
// el nombre del fichero que contiene la imagen
capaLogo.getTileUrl = function() { return "logo.png"; }
// opacidad del 50%, expresada en tanto por uno
capaLogo.getOpacity = function() { return 0.5; }
// el fichero que contiene la imagen está en formato PNG
capaLogo.isPng = function() { return true; }


Como podemos observar, el código sobrecarga las tres funciones de la clase “GTileLayer” antes descritas: getTileUrl, getOpacity e isPng. La función getTileUrl siempre devuelve la misma imagen (“logo-uoc.png”), que es la que queremos mostrar en todas las porciones del mapa; getOpacity, siempre la misma transparencia (del 50%), e isPng, siempre true, puesto que sabemos que la imagen que se devuelve está en formato PNG. Por otro lado, el constructor de la clase “GTileLayer” espera tres parámetros: 

• una colección de textos de copyright que se mostrarán en la parte inferior derecha del
mapa,
• el nivel de zoom mínimo del mapa (ampliación mínima del mapa) y
• el nivel de zoom máximo del mapa (ampliación máxima del mapa).
En el ejemplo, no se ha proporcionado ninguna colección de textos de copyright (“null”) y se han establecido los niveles de zoom mínimo y máximo permitidos por Google Maps.
1.2.1. Tile layer overlays

Una forma de agregar un mapa personalizado a la vista es mediante el mecanismo de las capas. Google llama a las capas que contienen mapas tile layer overlays. Por medio de este mecanismo, situaremos el mapa en la capa más superficial de la vista, de manera que quede por encima de las demás. Dada su posición predominante, debemos jugar con su opacidad para que revele, en mayor o menor medida, las capas inferiores. Los pasos que se habrán de seguir serán dos:
1) crear una capa a partir del objeto "GTileLayer" que contiene el mapa, y
2) agregar dicha capa a la vista.

Siguiendo con el ejemplo anterior, el código siguiente:

mapa.addOverlay(new GTileLayerOverlay(capaLogo));

crea una capa a partir del mapa “capaLogo” y lo agrega a la vista del mapa.
Como se puede observar, el primer paso se realiza instanciando un objeto "GTile-LayerOverlay", cuyo constructor espera un objeto "GTileLayer", es decir, el mapa personalizado ("capaLogo"). El segundo paso se alcanza mediante una llamada a la función addOverlay de la clase "GMap2", cuyo único parámetro debe ser un objeto "GTileLayerOverlay", es decir, la capa que se desea agregar a la vista.

1.3. Mapas WMS

Hasta ahora hemos aprendido a crear mapas personalizados y a agregarlos, como capas o como mapas aislados, a la vista de mapa. Sin embargo, el contenido que mostrábamos era muy poco interesante: tan sólo una imagen que se repetía una y otra vez.

Ahora utilizaremos esta base para crear mapas personalizados que muestren datos obtenidos de un servicio OGC/WMS. La idea que reside en el fondo de esta técnica es relativamente simple: obtener la imagen de cada porción de un servicio OGC/WMS y proporcionarla a Google Maps.

El servicio OGC/WMS, en adelante WMS (por Web Map Service, servicio de mapas de la Web), proporciona mapas georeferenciados a partir de datos geográficos. Los mapas se generan a petición de un cliente, que especifica, mediante un protocolo estándar, los datos que quiere obtener, la zona geográfica en la que se limita la petición, el formato del mapa obtenido, etc. Al final, el cliente obtiene una imagen georeferenciada que concentra y representa toda la información que esperaba obtener. 
Es importante destacar que el cliente no recibe nunca los datos en sí: tan sólo una imagen apta (hablando en términos de resolución) para ser mostrada en la pantalla de un ordenador.

El estándar define dos operaciones obligatorias que debe soportar el servicio (GetCapabilities y GetMap) y otra optativa (GetFeatureInfo): 
• GetCapabilities. Proporciona información acerca de los datos ofrecidos por el servidor y sus características, los sistemas de referencia soportados, el ámbito geográfico, etc. 
• GetMap. Proporciona una imagen georeferenciada que contiene los datos solicitados. El estándar nos permite definir el área del mapa, las capas mostradas, el formato de la imagen, etc.
• GetFeatureInfo. Proporciona información acerca de características particulares mostradas en el mapa.

La información que se puede obtener por medio del servicio WMS gira en torno a las capas de información. Es decir, el proveedor proporciona una o más capas, que se pueden obtener aisladas o combinadas mediante la operación GetMap. Es importante remarcar que siempre se obtiene una única imagen como respuesta a una operación GetMap.

A continuación, se detallan los parámetros obligatorios que espera la operación GetMap y el significado de cada uno de ellos:

• VERSION=1.1.1. Especifica el número de versión del protocolo. En otras palabras, especifica la versión del servicio a la que se espera acceder. Dependiendo de la versión, el proveedor aceptará unos parámetros u otros. Estos materiales se basan exclusivamente en la versión 1.1.1 del estándar.
• REQUEST=GetMap. Especifica la operación a la que se quiere acceder. Para la operación GetMap, el valor de REQUEST siempre será GetMap.
• LAYERS (capas). Especifica las capas de información que se desean obtener, separadas por comas. Las capas se deben listar desde la más profunda hasta la más superficial.
• STYLES (estilos). Especifica el estilo con el que se dibujará cada capa. Igual que en el parámetro anterior, los nombres de los estilos deben ir separados por comas.
• SRS (de Source Reference System, ‘sistema de referencia de la fuente’). Especifica el sistema de referencia de la petición. Todas las coordenadas especificadas en los demás parámetros se suponen escritas en este sistema de referencia.
• BBOX (de Bounding BOX, ‘cuadro delimitador’). Especifica los límites del mapa que se desea obtener. Se trata de una lista separada por comas de las coordenadas suroeste y noreste del mapa. Las coordenadas deben especificarse de acuerdo al sistema de referencia indicado en el parámetro SRS.
• WIDTH (ancho). Especifica la anchura, medida en píxeles, que debe tener la imagen resultante.
• HEIGHT (alto). Especifica la altura, medida en píxeles, que debe tener la imagen resultante.
• FORMAT (formato). Especifica el formato (PNG, JPEF, GIF, etc.) que debe tener la imagen resultante.

En resumen, mediante la operación GetMap podemos obtener una porción de cualquier mapa que nos ofrezca el proveedor, en el formato y en las dimensiones que deseemos.

1.4. Mapas personalizados
Partiendo del código desarrollado en el apartado anterior, a continuación mostraremos algunos ejemplos que combinan los mapas de Google con mapas WMS, o que incluso prescinden de los mapas de Google para mostrar un único mapa WMS o un par de ellos combinados. Para ilustrar estos ejemplos, hemos utilizado los servicios WMS que ofrecen el ICC* i el CREAF**
Ejemplo 2: un único mapa WMS
En este ejemplo, se crea un mapa personalizado que contiene un único mapa topográfico
a escala 1:250000 procedente del servicio WMS del ICC:

<!DOCTYPE html "-//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>
<meta http-equiv="content-type"
content="text/html;charset=utf-8"/>
<title>Ejemplo 2</title>
<script src="http://maps.google.com/maps?file=api&amp;v=2"
type="text/javascript"></script>
<script type="text/javascript">
function initialize() {
var mapa;
var capaTopo;
var mapaTopo;
if (GBrowserIsCompatible()) {
mapa = new GMap2(document.getElementById("elemento_mapa"));
mapa.setCenter(new GLatLng(41.5580, 1.5906), 7);
mapa.setUIToDefault();
// crea la capa WMS
capaTopo = crearCapaWms(7, 12, 1.0,
"http://shagrat.icc.es/lizardtech/iserv/ows?",
"mtc250m,");
// crea un mapa personalizado a partir de la capa WMS
mapaTopo = new GMapType(
[capaTopo],
G_NORMAL_MAP.getProjection(),
"WMS");
// agrega el mapa personalizado al visor
mapa.addMapType(mapaTopo);
}
}
function crearCapaWms(zoomMin, zoomMax, opacidad, url, capas,
estilos, formato, colorFondo, version, srs) {
var capaWms;
capaWms = new GTileLayer(null, zoomMin, zoomMax);
// rellena los parámetros no especificados
if (! estilos) { estilos = ""; }
if (! formato) { formato = "image/png"; }
if (! version) { version = "1.1.1"; }
if (! colorFondo) { colorFondo = "0xFFFFFF"; }
if (! srs) { srs = "EPSG:4326"; }
capaWms.wmsUrl = url;
capaWms.wmsCapas = capas;
capaWms.wmsEstilos = estilos;
capaWms.wmsFormato = formato;
capaWms.wmsVersion = version;
capaWms.wmsColorFondo = colorFondo;
capaWms.wmsSrs = srs;
// la dirección web del fichero que contiene la imagen
capaWms.getTileUrl = obtenerUrlTile;
// opacidad expresada en tanto por uno
capaWms.getOpacity = function() { return opacidad; }
// el fichero que contiene la imagen está en formato PNG?
capaWms.isPng = function() { return formato == "image/png"; }
return capaWms;
}
// tile: GPoint
// zoom: Number
function obtenerUrlTile(tile, zoom) {
var xySupIzq; // coord. x/y de la esquina superior izquierda
var geoSupIzq; // coord. geográfica de la esquina superior
// izquierda
var xyInfDer; // coord. x/y de la esquina inferior derecha
var geoInfDer; // coord. geográfica de la esquina inferior
// derecha
var urlTile;
// obtiene las coordenadas x/y de las esquinas superior
// izquierda e inferior derecha
xySupIzq = new GPoint(tile.x * 256, (tile.y + 1) * 256);
xyInfDer = new GPoint((tile.x + 1) * 256, tile.y * 256);
// obtiene las coordenadas geográficas de las esquinas superior
// izquierda e inferior derecha
geoSupIzq = G_NORMAL_MAP.getProjection().
fromPixelToLatLng(xySupIzq, zoom);
geoInfDer = G_NORMAL_MAP.getProjection().
fromPixelToLatLng(xyInfDer, zoom);
// genera la URL del "tile"
urlTile = this.wmsUrl;
urlTile += "&REQUEST=GetMap";
urlTile += "&SERVICE=WMS";
urlTile += "&VERSION=" + this.wmsVersion;
urlTile += "&LAYERS=" + this.wmsCapas;
urlTile += "&STYLES=" + this.wmsEstilos;
urlTile += "&FORMAT=" + this.wmsFormato;
urlTile += "&BGCOLOR=" + this.wmsColorFondo;
urlTile += "&TRANSPARENT=TRUE";
urlTile += "&SRS=" + this.wmsSrs;
urlTile += "&BBOX=" + geoSupIzq.x + "," + geoSupIzq.y + "," +
geoInfDer.x + "," + geoInfDer.y;
urlTile += "&WIDTH=256";
urlTile += "&HEIGHT=256";
urlTile += "&reaspect=false";
return urlTile;
}
</script>
</head>
<body onload="initialize()" onunload="GUnload()">
<div id="elemento_mapa" style="width: 750px; height: 450px">
</div>
</body>
</html>
El resultado será parecido al siguiente:
Ejemplo

Ejemplo 3: mapa WMS combinado con el mapa normal de Google Maps
En este ejemplo, hemos creado un mapa personalizado que combina el mapa normal de
Google Maps con un mapa geológico a escala 1:50000 procedente del servicio WMS del
ICC. Sólo mostramos la función initialize, porque el resto del código no cambia respecto
al ejemplo n.º 2.

function initialize() {
var mapa;
var capaGeo;
var mapaCombi;
if (GBrowserIsCompatible()) {
mapa = new GMap2(document.getElementById("elemento_mapa"));
mapa.setCenter(new GLatLng(41.5580, 1.5906), 7);
mapa.setUIToDefault();
// crea la capa WMS
capaGeo = crearCapaWms(7, 15, 0.4,
"http://shagrat.icc.es/lizardtech/iserv/ows?",
"mgc50m,");
// crea un mapa personalizado a partir de la capa WMS y del
// mapa normal de Google Maps
mapaCombi = new GMapType(
[G_NORMAL_MAP.getTileLayers()[0], capaGeo],
G_NORMAL_MAP.getProjection(),
"WMS");
// agrega el mapa personalizado al visor
mapa.addMapType(mapaCombi);
}
}

El resultado será parecido al siguiente:


 Ejemplo 4: dos mapas WMS procedentes de una única fuente combinadosEl ejemplo siguiente combina dos mapas procedentes del servicio WMS del ICC: el topográfico
1:25000 y el geológico 1:50000. Sólo mostramos la función initialize, porque el
resto del código no cambia respecto al ejemplo n.º 2.

function initialize() {
var mapa;
var capaTopo;
var capaGeo;
var mapaCombi;
if (GBrowserIsCompatible()) {
mapa = new GMap2(document.getElementById("elemento_mapa"));
mapa.setCenter(new GLatLng(41.5580, 1.5906), 7);
mapa.setUIToDefault();
// crea la capa WMS del mapa topográfico
capaTopo = crearCapaWms(7, 12, 1.0,
"http://shagrat.icc.es/lizardtech/iserv/ows?",
"mtc50m,");
// crea la capa WMS del mapa geológico
capaGeo = crearCapaWms(7, 15, 0.40,
"http://shagrat.icc.es/lizardtech/iserv/ows?",
"mgc50m,");
// crea un mapa personalizado a partir de las dos capas WMS
mapaCombi = new GmapType(
[capaTopo, capaGeo],
G_NORMAL_MAP.getProjection(), "WMS");
// agrega el mapa personalizado al visor
mapa.addMapType(mapaCombi);
}
}

 El resultado será parecido al siguiente:




Bibliografía
Oracle, "The Java(tm) Tutorials", http://download.oracle.com/javase/tutorial/. 
Oracle, "Java(tm) 2 Platform Standard Edition 5.0 API Specification", http:// download.oracle.com/javase/1.5.0/docs/api/.
Personalización SIG, Albert Gavarró Rodríguez , Universidad Oberta  de Catalunya, España 2011


martes, 11 de noviembre de 2014

Instalación y Configuración API de ESRI en servidor Jboss 7.1 final

Instalación de la API de ArcGIS para JavaScript Library en Windows
Las instrucciones siguientes se supone que va a instalar la biblioteca de API de ArcGIS JavaScript en la siguiente ubicación en un servidor Web (Jboss 7.1 final ) , "http: // <myserver> /arcgis_js_api/library/3.12/" donde <myserver> es el nombre de dominio de su web sitio. Después de copiar los archivos a su servidor Web, tendrá que modificar algunos archivos para incluir la dirección URL para el servidor y el directorio que usted está planeando instalar.
  1. Copia \ arcgis_js_api \ biblioteca y todo su contenido desde el DVD a su servidor Web. En este ejemplo, los archivos se copian en: C:\jboss-as-7.1.1.Final\welcome-content\arcgis_js_api\ biblioteca
Instale el Build Normal o compacto

Opciones de configuración para la acumulación normal de:
  1. Abrir en C:\jboss-as-7.1.1.Final\welcome-content\ arcgis_js_api \ library \ 3.12 \ 3.12 \ Init.js en un editor de texto y buscar el texto "[HOSTNAME_AND_PATH_TO_JSAPI] ' , y reemplace este texto con "<myserver> /arcgis_js_api/library/3.12/ 3,12 / ". 
  2. Abrir C:\jboss-as-7.1.1.Final\welcome-content \ arcgis_js_api \ library \ 3.12 \ 3.12 \ dojo \ dojo.js en un editor de texto y buscar el texto "[HOSTNAME_AND_PATH_TO_JSAPI] ' , y reemplace este texto con "<myserver> / arcgis_js_api / biblioteca / 3.12 / 3.12 / "
Opciones de configuración para construcción compacta:
  1. Abrir C:\jboss-as-7.1.1.Final\welcome-content \ arcgis_js_api \ library \ 3.12 \ 3.12compact \ Init.js en un editor de texto y buscar el texto "[HOSTNAME_AND_PATH_TO_JSAPI]" , y reemplazar cada instancia de este texto con "<myserver> / arcgis_js_api / biblioteca / 3.12 / 3.12compact / "
  2. Abrir C:\jboss-as-7.1.1.Final\welcome-content \ arcgis_js_api \ library \ 3.12 \ 3.12compact \ dojo.js en un editor de texto y buscar el texto "[HOSTNAME_AND_PATH_TO_JSAPI] ' , y reemplace este texto con "<myserver> /arcgis_js_api/library/3.12 /3.12compact/ "
Prueba de la Instalación
Ahora usted debería ser capaz de acceder a la biblioteca de ArcGIS JavaScript de su servidor Web utilizando el siguiente URL (s):
    http: // <myserver> /arcgis_js_api/library/3.12/3.12/init.js
    http: // <myserver> /arcgis_js_api/library/3.12/3.12compact/init.js
Pruebe su instalación. Usted puede utilizar el siguiente código de prueba para validar su biblioteca JSAPI instalar.

<! DOCTYPE HTML PUBLIC "- // W3C // DTD HTML 4.01 // EN" "http://www.w3.org/TR/html4/strict.dtd">
<Html>
  <Head>
    <Meta http-equiv = "Content-Type" content = "text / html; charset = utf-8" />
    <Title> Simple Map </ title>
    <Link rel = "stylesheet" type = "text / css" href = "http: // <myserver> /arcgis_js_api/library/3.12/3.12/dijit/themes/tundra/tundra.css" />
    <Link rel = "stylesheet" type = "text / css" href = "http: // <myserver> /arcgis_js_api/library/3.12/3.12/esri/css/esri.css" />
    <Script type = "text / javascript" src = "http: // <myserver> /arcgis_js_api/library/3.12/3.12/init.js"> </ script>
    <Script type = "text / javascript">
      dojo.require ("esri.map");
      función init () {
        var myMap = new esri.Map ("mapDiv");
        // En cuenta que si usted no tiene acceso a Internet, entonces usted tendrá que apuntar esta URL a su propio servicio de caché local accesible.
        myTiledMapServiceLayer var = new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/NGS_Topo_US_2D/MapServer");
        myMap.addLayer (myTiledMapServiceLayer);
      }
      dojo.addOnLoad (init);
    </ Script>
  </ Head>
  <Body class = "tundra">
    <Div id = estilo "mapDiv" = "width: 900px; altura: 600px; border: 1px solid # 000;"> </ div>
  </ Body>
</ Html>

miércoles, 24 de septiembre de 2014

Programación y Personalización SIG. Programación SIG en entornos web

1.1. La Web y el HTML

La World Wide Web, que se abrevia WWW y se conoce también como la Web, es un sistema de páginas enlazadas mediante el concepto de hipertexto. El hipertexto es un texto que refiere a otro texto al que el lector puede tener acceso inmediato. El lenguaje tradicional y predominante sobre el que se sustenta la Web y que tiene capacidades de hipertexto es el HTML (HyperText Markup
Language, ‘lenguaje de marcas de hipertexto’). 

Hasta hace relativamente poco era necesario conocer el lenguaje HTML para poder publicar una página web en Internet. Si bien el HTML es un lenguaje muy directo, en el que buena parte del código es el contenido propiamente dicho del documento, como contrapartida es engorroso de escribir. Así, por ejemplo, para mostrar una palabra en negrita, es necesario intercalar en el texto
más de media docena de caracteres extras.

1.2. Elementos y etiquetas

El lenguaje HTML se utiliza para describir la estructura y el contenido de un documento, así como para complementar el texto con objetos (por ejemplo, mapas) e imágenes. 

Un típico código HTML está formado por elementos que configuran las distintas partes del documento. Generalmente, estos elementos están delimitados por una etiqueta de inicio y otra de fin, que se escriben siempre entre corchetes angulares ("<" y ">").

Por ejemplo, la línea siguiente:

<p>La WWW nació en el CERN.</p>

define un elemento (párrafo) cuyo contenido es “La WWW nació en el CERN.”. Como podemos ver, las etiquetas de inicio y fin (<p> y </p> respectivamente) delimitan el contenido del párrafo. Además, la etiqueta de fin es igual que la de inicio pero precedida por una barra (“/”).

1.3. Estructura mínima de un documento HTML

Un documento HTML bien formado debe presentar siempre la siguiente estructura mínima:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="es">
<head>
<title>Título del documento</title>
</head>
<body>
Contenido del documento.
</body>
</html>

Como podemos observar, la estructura mínima de un documento HTML está formada por cinco elementos:
• DOCTYPE. Especifica la versión del lenguaje HTML que obedece el documento (en el ejemplo, la 4.01).
• HTML. Es el elemento raíz, el que define el documento HTML en sí. Contiene obligatoriamente los elementos head y body. Como puede apreciarse en el ejemplo, el elemento html puede contener el atributo lang, que define el idioma del documento (“es” de español).
• HEAD. Define la cabecera del documento, cuyo cometido es alojar información
sobre el mismo. El título, las palabras clave y otros datos que no se consideran parte del contenido del documento irán dentro de este elemento.
• TITLE. Define el título del documento.
• BODY. Define el contenido del documento. Este elemento contendrá otros que definirán el  contenido del documento

1.4. Definición del contenido
El contenido de un documento HTML puede definirse mediante tres tipos de elementos:
• Estructurales. Son aquellos que describen la estructura del texto. En HTML tenemos elementos estructurales para definir títulos, párrafos, tablas, enumeraciones, etc. Normalmente, los navegadores aplican diferentes estilos de presentación a cada elemento.
• De presentación. Son aquellos que describen el aspecto del texto, independientemente de su función. Los elementos que definen negritas, cursivas, texto enfatizado, etc. son elementos de presentación.
• De hipertexto. Son aquellos que permiten enlazar con otros documentos mediante la creación de hipervínculos. Son los más importantes dada la naturaleza hipertextual de la Web.

2. Google Maps

Google Maps es la herramienta SIG en línea de Google. Permite explorar mapas en 2D de casi cualquier parte del mundo. La popularidad de la que goza Google Maps en la actualidad se debe principalmente a su buen rendimiento, su vasta cartografía y la posibilidad de incorporar toda esta tecnología a cualquier sitio web mediante el uso de la API* (de Application Programming Interface,
‘interfaz de programa de aplicación’) de Google Maps. En los apartados siguientes, veremos cómo incorporar un mapa a nuestra página y cómo hacer uso de la API para trabajar sobre él.

2.1. Incorporar un mapa en una página
La forma más sencilla de incorporar un mapa en nuestra página es utilizando el web de Google Maps y, una vez seleccionada la ubicación que deseamos mostrar, incorporar el código HTML que nos proporciona Google a nuestra página. 

Veámoslo paso a paso. En primer lugar, debemos seleccionar una ubicación en maps.google.es. Esto se puede hacer mediante la caja de búsqueda o navegando por el mapa.

En segundo lugar, hemos de seleccionar la opción Enlazar y copiar el código HTML que aparece en la caja “Pegar HTML para insertar en sitio web”.

El tercer y último paso será incorporar este código en nuestra página HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Nationaal Park De Hoge Veluwe</title>
</head>
<body>
<p>El <em>Nationaal Park De Hoge Veluwe</em> (el Parque
Nacional <em>De Hoge Veluwe</em> es un parque nacional
neerlandés situado en la provincia de Gelderland, cerca
de las ciudades de Ede, Arnhem y Apeldoorn.</p>
<iframe width="425" height="350" frameborder="0"
scrolling="no" marginheight="0" marginwidth="0"
src="http://maps.google.com/?hl=es&amp;ie=UTF8 
&amp;ll=52.075286,5.889359&amp;spn=0.261235,0.698318 
&amp;z=11&amp;output=embed">
</iframe><br />
<small><a href="http://maps.google.com/?hl=es 
&amp;ie=UTF8&amp;ll=52.075286,5.889359 
&amp;spn=0.261235,0.698318&amp;z=11&amp;source=embed"
style="color:#0000FF;text-align:left">Ver mapa más
grande</a></small>
</body>
</html>

2.2. La API de Google Maps

Afortunadamente, Google Maps nos ofrece muchas más posibilidades que las que hemos visto hasta ahora. Sin embargo, éstas se obtienen a costa de la facilidad de uso, pues se requieren unos mínimos conocimientos de programación para poder sacarles partido.
A esta funcionalidad adicional se accede por medio de la API de Google Maps, mediante un conjunto de tecnologías agrupadas bajo la denominación AJAX (Asynchronous JAvascript and XML, ‘JavaScript asíncrono y XML’). Como su nombre indica, AJAX está compuesto por dos tecnologías:

• JavaScript. Es un lenguaje muy parecido a Java que se usa para alterar documentos HTML de forma dinámica. Es importante remarcar que no es Java; sólo está basado en él. 
• XML. Es un lenguaje usado para el intercambio de datos (sigla de eXtensible Markup Language, ‘lenguaje de marcas extensible’). Es una forma genérica de escribir documentos maximizando su simplicidad, su generalidad y su usabilidad.
Ambas tecnologías, integradas en un documento HTML, permiten obtener mapas y datos de los servidores de Google Maps y mostrarlos en la página. 

2.2.1. Crear un mapa
La función más elemental que nos ofrece la API de Google Maps es crear un mapa. El mapa se mostrará de forma muy parecida a cuando se copia el código HTML del sitio de Google Maps: centrado en un punto y con un nivel de zoom determinado. Además, se mostrarán una serie de controles mínimos que nos permitirán desplazarnos por el mapa, variar su ampliación y seleccionar el tipo de mapa mostrado. 

<!DOCTYPE html "-//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>
<meta http-equiv="content-type"
content="text/html; charset=utf-8"/>
<title>Universitat Oberta de Catalunya</title>
<script src="http://maps.google.com/maps?file=api 
&amp;v=2&amp;key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
type="text/javascript"></script>
<script type="text/javascript">
function InicializarMapa() {
var mapa;
var centro;
if (GBrowserIsCompatible()) {
mapa = new GMap2(
document.getElementById("elemento_mapa"));
centro = new GLatLng(41.414829, 2.133003);
mapa.setCenter(centro, 17);
mapa.setUIToDefault();
}
}
</script>
</head>
<body onload="InicializarMapa()" onunload="GUnload()">
<div id="elemento_mapa"
style="width: 500px; height: 300px"></div>
</body>
</html>

Como podemos observar, el código es una mezcla entre HTML y JavaScript. El código JavaScript (que hemos resaltado convenientemente mediante recuadros) se incluye mediante el elemento script y siempre va situado en la cabecera del documento (head). Observad el uso del atributo “type” (‘tipo’) delelemento script, que identifica el código como JavaScript.

También es importante observar las similitudes entre Java y JavaScript. Quizá la diferencia más notable sea la ausencia de tipos. Todas las variables son del mismo tipo, aunque como ya veremos, internamente puedan tener atributos distintos. Consecuentemente, las variables se declaran usando la fórmula var nombre_variable y las funciones, function nombre_función.

Veamos los pasos que hay que seguir para mostrar un mapa en nuestra página: en primer lugar, es necesario crear un elemento HTML que albergue el mapa. Aunque en la práctica hay diversos elementos que pueden desempeñar esta función, es recomendable utilizar div, porque es el elemento más neutro. Al elemento utilizado debemos darle un nombre mediante el atributo “id” (de identifier, ‘identificador’) y, adicionalmente, un tamaño, que especificaremos mediante los atributos estilísticos width (ancho) y height (alto), y que será el tamaño del mapa medido en píxeles. En el ejemplo, se ha creado el elemento mediante el código siguiente: 

<div id="elemento_mapa"
style="width: 500px; height: 300px"></div>

Como se puede observar, al elemento se le ha llamado “elemento_mapa”, y se le han atribuido las dimensiones iniciales de 500 por 300 píxeles. 

Una vez creado el elemento que albergará el mapa, debemos escribir el código JavaScript que se encargará de inicializarlo y mostrarlo. Para llevar a cabo esta tarea, hemos de realizar tres acciones:
 
• incluir el código de la API de Google Maps, 
• escribir una función que se encargue de inicializar el mapa, y
• llamar a la función de inicialización cuando el navegador termine de dibujar la página.
 
Veámoslas una a una:
 
Incluir el código de la API de Google Maps
Mediante la primera acción, damos acceso a nuestro código a la API de Google Maps. Esta acción se realiza en el primer bloque de código JavaScript:

<script src="http://maps.google.com/maps?file=api 
&amp;v=2&amp;key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
type="text/javascript"></script>

Por regla general, este código siempre será el mismo. Su única peculiaridad es el valor “key” (que en el ejemplo ha sido reemplazado por varias equis), que variará de un lugar web a otro y que se debe obtener de Google mediante un proceso de registro gratuito*. Una vez hecho esto, el código JavaScript de nuestra página podrá acceder a las funciones de la API de Google Maps

Escribir una función que se encargue de inicializar el mapa

La segunda acción crea el mapa sobre el elemento HTML seleccionado y lo inicializa, estableciendo el centro y el nivel de zoom iniciales. En el ejemplo, esta acción la lleva a cabo la función InicializarMapa en el segundo bloque de código JavaScript:
<script type="text/javascript">
function InicializarMapa() {
var mapa;
var centro;
if (GBrowserIsCompatible()) {
mapa = new GMap2(
document.getElementById("elemento_mapa"));
centro = new GLatLng(41.414829, 2.133003);
mapa.setCenter(centro, 17);
mapa.setUIToDefault();
}
}
</script>

Como se puede observar, en primer lugar instanciamos un objeto “GMap2”, que es el mapa en sí, ubicándolo en el elemento HTML “elemento_mapa”, que es el que hemos creado al principio con este objetivo. Después, establecemos el centro y el nivel de zoom iniciales del mapa, mediante la función setCenter de la clase “GMap2”. Como primer argumento, esta función requiere un objeto
“GLatLng”, que no es más que una coordenada geográfica expresada en función de su latitud y su longitud (según el sistema de coordenadas WGS84). El segundo elemento es un entero, que puede variar entre 0 y 19, por los niveles de zoom mínimo y máximo respectivamente. 

La llamada a la función GBrowserIsCompatible evita la ejecución del código en caso de que se detecte que el navegador utilizado no es compatible con Google Maps.

Llamar a la función de inicialización cuando el navegador termine de dibujar la página
 
Finalmente, sólo queda indicar al navegador cuándo se debe inicializar el mapa o, lo que es lo mismo, cuándo debe ejecutarse la función InicializarMapa.

Mientras un navegador carga una página HTML y la construye, se obtienen, a la vez, imágenes externas y otros scripts que puedan formar parte de la página. Durante este proceso de carga, el entorno puede no ser lo bastante estable para Google Maps, y ello podría conducir a un comportamiento errático de la aplicación. Google recomienda inicializar el mapa sólo cuando la página haya sido cargada completamente. 

Para ello, utilizaremos el atributo “onload” del elemento HTML body. En él podemos introducir código JavaScript que se ejecutará cuando la página haya sido cargada completamente. En nuestro caso, pondremos una llamada a la función InicializarMapa:

<body onload="InicializarMapa()" onunload="GUnload()">

De la misma forma, cuando se descarga la página, cosa que sucede cuando se cambia a otra, llamaremos a la función GUnload de la API de Google Maps para liberar correctamente los recursos que haya consumido el mapa. El resultado será el siguiente:



Bibliografía
Oracle, "The Java(tm) Tutorials", http://download.oracle.com/javase/tutorial/. 
Oracle, "Java(tm) 2 Platform Standard Edition 5.0 API Specification", http:// download.oracle.com/javase/1.5.0/docs/api/.
Personalización SIG, Albert Gavarró Rodríguez , Universidad Oberta  de Catalunya, España 2011