<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>Jorge Iván Meza Martínez &#187; GIS</title> <atom:link href="http://blog.jorgeivanmeza.com/tag/gis/feed/" rel="self" type="application/rss+xml" /><link>http://blog.jorgeivanmeza.com</link> <description>The Fire Within Me: &#34;knowledge will set you free&#34;</description> <lastBuildDate>Tue, 31 Jan 2012 18:18:13 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>Convertir coordenadas geográficas grados-minutos-segundos a notacional decimal (3)</title><link>http://blog.jorgeivanmeza.com/2011/06/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3</link> <comments>http://blog.jorgeivanmeza.com/2011/06/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3/#comments</comments> <pubDate>Mon, 27 Jun 2011 22:35:10 +0000</pubDate> <dc:creator>jimezam</dc:creator> <category><![CDATA[Desarrollo de software]]></category> <category><![CDATA[Software geográfico]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[coordinates]]></category> <category><![CDATA[GIS]]></category> <category><![CDATA[Hipergalaxia]]></category> <category><![CDATA[JavaScript]]></category> <guid
isPermaLink="false">http://blog.jorgeivanmeza.com/?p=29416</guid> <description><![CDATA[Introducción. Después de encontrar dos métodos (A y B) para la conversión de coordenadas entre formatos decimal y grados, minutos y segundos, encontré en el libro HTML5 Geolocation de Anthony T. Holdener III la implementación de dos funciones en Javascript &#8230; <a
href="http://blog.jorgeivanmeza.com/2011/06/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<h2>Introducción.</h2><p>Después de encontrar dos métodos (<a
href="http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal/" target="_blank">A</a> y <a
href="http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-2-version-simple/" target="_blank">B</a>) para la conversión de coordenadas entre formatos decimal y grados, minutos y segundos, encontré en el libro <a
href="http://oreilly.com/catalog/0636920020004" target="_blank">HTML5 Geolocation</a> de <a
href="http://anthonyth3.wordpress.com/" target="_blank">Anthony T. Holdener III</a> la implementación de dos funciones en Javascript que realizan con precisión este procedimiento y que me parecieron muy intersantes.  Este corto libro es en general muy interesante y recomiendo su lectura.</p><h2>Conversión de coordenadas: formato decimal a grados-minutos-segundos.</h2><pre class="javascript">/**
 * Convierte una coordenada en formato decimal a su correspondiente
 * versión en formato grados-minutos-segundos.
 *
 * @param	Float	Valor real de la coordenada.
 * @param	Int	Tipo de la coordenada {Coordenada.LATITUD, Coordenada.LONGITUD}.
 * @return	Array	['grados', 'minutos', 'segundos', 'direccion', 'valor'].
 */
function dec2gms(valor, tipo)
{
	grados    = Math.abs(parseInt(valor));
	minutos   = (Math.abs(valor) - grados) * 60;
	segundos  = minutos;
	minutos   = Math.abs(parseInt(minutos));
	segundos  = Math.round((segundos - minutos) * 60 * 1000000) / 1000000;
	signo     = (valor &lt; 0) ? -1 : 1; 	direccion = (tipo == Coordenada.LATITUD) ?
                    ((signo &gt; 0) ? 'N' : 'S') :
	            ((signo &gt; 0) ? 'E' : 'W');
	if(isNaN(direccion))
		grados = grados * signo;
	return {
		'grados'   : grados,
		'minutos'  : minutos,
		'segundos' : segundos,
		'direccion': direccion,
		'valor'    : grados + "\u00b0 " + minutos + "' "+ segundos +
		             "\"" + ((isNaN(direccion)) ? (' ' + direccion) : '')
	};
}</pre><p>Por ejemplo.</p><pre class="javascript">var x = 48.853;
r1 = dec2gms(x, Coordenada.LATITUD);
alert('Conversion dec2gms = ' + r1.valor);</pre><h2>Conversión de coordenadas: formato grados-minutos-segundos a decimal.</h2><pre class="javascript">/**
 * Convierte una coordenada en formato grados-minutos-segundos a su
 * correspondiente versión en formato decimal.
 *
 * @param	Float	Grados de la coordenada.
 * @param	Float	Minutos de la coordenada.
 * @param	Float	Segundos de la coordenada.
 * @param	String	Sentido de la coordenada {Coordenada.NORTE,
					Coordenada.SUR, Coordenada.ORIENTE,
					Coordenada.OCCIDENTE}
 * @return	Array	['decimal', 'valor'].
 */
function gms2dec(grados, minutos, segundos, direccion)
{
	if(direccion)
	{
		signo     = (direccion.toLowerCase() == 'w' ||
		             direccion.toLowerCase() == 's') ?
		            -1 : 1;
		direccion = (direccion.toLowerCase() == 'w' ||
		             direccion.toLowerCase() == 's' ||
		             direccion.toLowerCase() == 'n' ||
		             direccion.toLowerCase() == 'e') ?
		            direccion.toLowerCase() : '';
	}
	else
	{
		signo     = (grados &lt; 0) ? -1 : 1;
		direccion = '';
	}
	dec = Math.round((Math.abs(grados) + ((minutos * 60) + segundos) / 3600) * 1000000) / 1000000;
	if(isNaN(direccion) || direccion == '')
		dec = dec * signo;
	return {
		'decimal': dec,
		'valor'  : dec + "\u00b0" + ((isNaN(direccion) || direccion == '') ? (' ' + direccion) : '')
	};
}</pre><p>Por ejemplo.</p><pre class="javascript">var xg = 48;
var xm = 51;
var xs = 10.8;
r2 = gms2dec(xg, xm, xs, Coordenada.NORTE);
alert('Conversion gms2dec = ' + r2.valor);</pre><h2>Código fuente y demostración.</h2><p>Obtenga el código fuente del artículo junto con la ejecución de la demostración en la siguiente ubicación.</p><p
style="padding-left: 30px;"><a
href="http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.3/" target="_blank">http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.3/</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.jorgeivanmeza.com/2011/06/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Como acceder a la geolocalización desde Javascript</title><link>http://blog.jorgeivanmeza.com/2011/06/como-acceder-a-la-geolocalizacion-desde-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-acceder-a-la-geolocalizacion-desde-javascript</link> <comments>http://blog.jorgeivanmeza.com/2011/06/como-acceder-a-la-geolocalizacion-desde-javascript/#comments</comments> <pubDate>Sun, 26 Jun 2011 16:33:44 +0000</pubDate> <dc:creator>jimezam</dc:creator> <category><![CDATA[Desarrollo de software]]></category> <category><![CDATA[Móvil]]></category> <category><![CDATA[Software geográfico]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[geolocation]]></category> <category><![CDATA[GIS]]></category> <category><![CDATA[Hipergalaxia]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[W3C]]></category> <guid
isPermaLink="false">http://blog.jorgeivanmeza.com/?p=28827</guid> <description><![CDATA[Introducción. La geolocalización es la posibilidad de conocer cual es la ubicación física de un dispositivo.  Esta ubicación es geográfica, es decir, se define especialmente mediante sus correspondientes valores de latitud y longitud. Los dispositivos pueden obtener esta información desde &#8230; <a
href="http://blog.jorgeivanmeza.com/2011/06/como-acceder-a-la-geolocalizacion-desde-javascript/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<h2>Introducción.</h2><p>La geolocalización es la posibilidad de conocer cual es la ubicación física de un dispositivo.  Esta ubicación es geográfica, es decir, se define especialmente mediante sus correspondientes valores de latitud y longitud.</p><p>Los dispositivos pueden obtener esta información desde diferentes fuentes, las cuales estarán relacionadas a su vez con precisión de estos datos.  Los orígenes mas comúnes para la información de geolocalización de un dispositivo son los siguientes.</p><ol><li>Utilizando un GPS (<em>Global Positioning System</em>).</li><li>Mediante su identificación en celdas GSM/CDMA.</li><li>Mediante su dirección IP.</li><li>Mediante la dirección MAC de WiFi y Bluetooth.</li><li>Especificado por el usuario manualmente.</li></ol><p>Estos métodos se encuentran disponibles para las aplicaciones nativas que pueden acceder libremente al hardware del dispositivo, sin embargo ahora también es posible acceder a esta información desde una aplicación web utilizando Javascript gracias a la integración del <a
href="http://www.w3.org/2008/geolocation/" target="_blank">API de geolocalización de la W3C</a> en los navegadores mas recientes (incluyendo los móviles).</p><ul><li>Firefox (3.5+)</li><li>Chrome (5.0+)</li><li>Internet Explorer (9.0+)</li><li>Safari (5.0+)</li><li>Opera (10.6+)</li><li>iPhone (3.1+)</li><li>Android (2.0+)</li><li>BlackBerry (6+)</li></ul><p>Para dar soporte a navegadores antíguos se requiere que se utilice una capa adicional como <a
href="http://gears.google.com/" target="_blank">Google Gears</a> que supla la falencia de esta tecnología.</p><p>En este artículo se explicará el API necesario para acceder al API de geolocalización mediante el uso del lenguaje Javascript utilizando un navegador moderno como los mencionados.</p><h2>Verificar el soporte</h2><p>El primer paso debe ser siempre verificar si el navegador web en el cual se despliega la aplicación tiene o no el soporte para esta tecnología, a partir de este resultado se deberá decidir que hacer.</p><pre class="javascript">if(navigator.geolocation)
{
    // Se cuenta con el soporte para geolocalización, entonces ...
}
else
{
    // No se cuenta con soporte para geolocalización, manejar la situación.
}</pre><h2>Solicitar la ubicación al navegador.</h2><p>El siguiente paso consiste directamente en solicitarle al navegador web cual es la ubicación del dispositivo.  El llamado a esta función es asíncrono, es decir, no retorna inmediatamente un valor sino que invoca a una función específica (<em>callback</em>) cuando este se obtiene.  Así mismo, como el conocer la ubicación de un dispositivo (y por ende su usuario) tiene implicaciones en la privacidad de las personas, la especificación dispone que el usuario esté siempre facultado para aceptar o negar el acceso a esta información.  Por este motivo los navegadores desplegarán barras como la mostrada a continuación solicitando la confirmación final.</p><div
id="attachment_28875" class="wp-caption aligncenter" style="width: 581px"><a
href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/06/Selection_021.png"><img
class="size-full wp-image-28875" title="Selection_021" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/06/Selection_021.png" alt="Permitir el acceso a la información de geolocalización en Chrome" width="571" height="38" /></a><p
class="wp-caption-text">Permitir el acceso a la información de geolocalización en Chrome</p></div><p>A continuación se muestra la invocación general de la función para obtener la geolocalización del dispositivo.</p><pre class="javascript">navigator.geolocation.getCurrentPosition(onSuccessGeolocating,
                                         onErrorGeolocating,
                                         options);</pre><p>Los dos primeros parámetros corresponden a funciones Javascript que se ejecutarán según se tenga éxito o no durante el proceso de geolocalización (se analizarán a continuación), el tercer parámetro es opcional y corresponde con uno o varios de los modificadores descritos.</p><table
border="0" align="center"><tbody><tr
style="background-color: #99d0ff;"><td
style="text-align: center;"><strong>Opción</strong></td><td
style="text-align: center;"><strong>Tipo</strong></td><td
style="text-align: center;"><strong>Valor por defecto</strong></td><td
style="text-align: center;"><strong>Descripción</strong></td></tr><tr><td><span
style="font-family: 'courier new', courier;">enableHighAccuracy</span></td><td>Booleano</td><td
style="text-align: center;"><span
style="font-family: 'courier new', courier;">false</span></td><td>Intenta obtener la información mas precisa que sea posible.  Debe tenerse en cuenta que esta opción también toma mas tiempo y probablemente consume una mayor cantidad de batería del dispositivo.</td></tr><tr><td><span
style="font-family: 'courier new', courier;">maximumAge</span></td><td>Entero</td><td
style="text-align: center;"><span
style="font-family: 'courier new', courier;"> 0</span></td><td>Acepta como resultado el último valor histórico siempre y cuando este no sea mas antíguo que el valor especificado en milisegundos.</td></tr><tr><td><span
style="font-family: 'courier new', courier;">timeout</span></td><td>Entero</td><td
style="text-align: center;"><span
style="font-family: 'courier new', courier;"> 0</span></td><td>Espera máximo la cantidad de milisegundos especificada antes de abortar el procedimiento.</td></tr></tbody></table><p>A continuación se muestra un ejemplo de implementación de esta función.  En este se definen las funciones <span
style="font-family: 'courier new', courier;">onSuccessGeolocating</span> y <span
style="font-family: 'courier new', courier;">onErrorGeolocating</span> para determinar la implementación del manejo de éxito y error respectivamente de la geolocalización, y define además que se intente realizar el procedimiento con la mayor precisión posible, se acepten valores en caché con máximo 5 segundos de antiguedad y se espere máximo 10 segundos para terminar el procedimiento.</p><pre class="javascript">navigator.geolocation.getCurrentPosition(onSuccessGeolocating,
                                         onErrorGeolocating,
                                         {
                                       		enableHighAccuracy: true,
                                       		maximumAge:         5000,
                                       		timeout:            10000
                                         });</pre><h2>Establecer que hacer con la información de geolocalización.</h2><p>Si el procedimiento fue exitoso, se define la función <span
style="font-family: 'courier new', courier;">onSuccessGeolocating</span> referenciada en el paso inmediatamente anterior, en ella se establece que se deberá hacer con la información obtenida.</p><pre class="javascript">function onSuccessGeolocating(position)
{
    // ...
}</pre><p>El objeto <span
style="font-family: 'courier new', courier;">Position</span> que se recibe a través de los parámetros de la función incluye la siguiente información.</p><table
border="0" align="center"><tbody><tr
style="background-color: #99d0ff;"><td
style="text-align: center;"><strong>Atributo</strong></td><td
style="text-align: center;"><strong>Descripción</strong></td></tr><tr><td><span
style="font-family: 'courier new', courier;">coords</span></td><td>Información de la ubicación obtenida</td></tr><tr><td><span
style="font-family: 'courier new', courier;">timestamp</span></td><td>Información del momento en que fue obtenida la información</td></tr></tbody></table><p>A su vez, el objeto <span
style="font-family: 'courier new', courier;">Coordinates</span> incluye la siguiente información en su interior.</p><table
border="0" align="center"><tbody><tr
style="background-color: #99d0ff;"><td
style="text-align: center;"><strong>Atributo</strong></td><td
style="text-align: center;"><strong>Descripción</strong></td></tr><tr><td><span
style="font-family: 'courier new', courier;">latitude</span></td><td>Valor de la latitud de la ubicación del dispositivo medida en grados decimales</td></tr><tr><td><span
style="font-family: 'courier new', courier;">longitude</span></td><td>Valor de la longitud de la ubicación del dispositivo medido en grados decimales</td></tr><tr><td><span
style="font-family: 'courier new', courier;">altitude</span></td><td>Valor de la altura geográfica de la ubicación del dispositivo medida en metros</td></tr><tr><td><span
style="font-family: 'courier new', courier;">accuracy</span></td><td>Precisión de la latitud y longitud medida en metros</td></tr><tr><td><span
style="font-family: 'courier new', courier;">altitudeAccuracy</span></td><td>Precisión de la altitud medida en metros</td></tr><tr><td><span
style="font-family: 'courier new', courier;">heading</span></td><td>Dirección en la que se mueve el dispositivo.  Medida en grados desde 0 hasta 360. Su valor será NaN cuando el dispositivo se encuentra inmóvil o null si esta característica no es soportada</td></tr><tr><td><span
style="font-family: 'courier new', courier;">speed</span></td><td>Valor de la longitud de la ubicación del dispositivo</td></tr></tbody></table><p>Esto significa que la información básica de la ubicación del dispositivo esta finalmente almacenada en <span
style="font-family: 'courier new', courier;">position.coords.latitude</span> y <span
style="font-family: 'courier new', courier;">position.coords.longitude</span>.</p><p><span
style="font-size: 20px; font-weight: bold;">Establecer que hacer en caso de error.</span></p><p>En algunas ocasiones la geolocalización puede fallar, por ejemplo cuando se utiliza el GPS pero no se cuenta con la información de suficientes satélites o cuando el usuario impide el procedimiento.  Para manejar esta conducta se define la función <span
style="font-family: 'courier new', courier;">onErrorGeolocating</span> referenciada durante la invocación de <span
style="font-family: 'courier new', courier;">navigator.geolocation.getCurrentPosition</span>.</p><pre class="javascript">function onErrorGeolocating(error)
{
    // ...
}</pre><p>La información del error puede obtenerse del objeto <span
style="font-family: 'courier new', courier;">PositionError</span> recibido por parámetro el cual cuenta con los siguientes atributos en su interior.</p><table
border="0" align="center"><tbody><tr
style="background-color: #99d0ff;"><td
style="text-align: center;"><strong>Atributo</strong></td><td
style="text-align: center;"><strong>Descripción</strong></td></tr><tr><td><span
style="font-family: 'courier new', courier;">code</span></td><td>Código numérico que referencia al tipo de error sucedido.  Su valor corresponde con una de las siguientes constantes&nbsp;</p><p><span
style="font-family: 'courier new', courier;">PERMISSION_DENIED</span>: no se permitió o no se tienen suficientes privilegios para acceder al servicio de geolocalización.</p><p><span
style="font-family: 'courier new', courier;">POSITION_UNAVAILABLE</span>: el dispositivo no pudo determinar correctamente su ubicación.</p><p><span
style="font-family: 'courier new', courier;">TIMEOUT</span>: el intento de geolocalización tomó mas tiempo del permitido (opción <span
style="font-family: 'courier new', courier;">timeout</span>).</td></tr><tr><td><span
style="font-family: 'courier new', courier;">message</span></td><td>Texto que describe el error sucedido.  Este mensaje se utiliza para depuración en desarrollo, no se debe utilizar para mostrarse al usuario final.</td></tr></tbody></table><p>A continuación se muestra un ejemplo básico de implementación de esta función.</p><pre class="javascript">function onErrorGeolocating(error)
{
	switch(error.code)
	{
		case error.PERMISSION_DENIED:
			alert('ERROR: User denied access to track physical position!');
		break;
		case error.POSITION_UNAVAILABLE:
			alert("ERROR: There is a problem getting the position of the device!");
		break;
		case error.TIMEOUT:
			alert("ERROR: The application timed out trying to get the position of the device!");
		break;
		default:
			alert("ERROR: Unknown problem!");
		break;
	}
}</pre><h2>El prototipo.</h2><p>Como demostración de esta API se incluye el siguiente prototipo el cual intenta obtener la ubicación actual del usuario y desplegarla en un mapa de Google Maps.  Se recomienda consultar su código fuente para complementar los contenidos de este artículo.</p><p
style="text-align: center;">&nbsp;</p><div
id="attachment_28925" class="wp-caption aligncenter" style="width: 829px"><a
href="http://demo.jorgeivanmeza.com/JavaScript/GeolocationDemo/0.1/"><img
class="size-large wp-image-28925  " title="Selection_020" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/06/Selection_020-1024x648.png" alt="Demostración de geolocalización con Javascript" width="819" height="518" /></a><p
class="wp-caption-text">Demostración de geolocalización con Javascript</p></div><h2>Enlaces.</h2><ul><li>Demostración de geolocalización con Javascript.<br
/> <a
href="http://demo.jorgeivanmeza.com/JavaScript/GeolocationDemo/" target="_blank">http://demo.jorgeivanmeza.com/JavaScript/GeolocationDemo/</a></li><li>Geolocation Working Group en W3C.<br
/> <a
href="http://www.w3.org/2008/geolocation/" target="_blank">http://www.w3.org/2008/geolocation/</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.jorgeivanmeza.com/2011/06/como-acceder-a-la-geolocalizacion-desde-javascript/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>En dónde estoy y hacia dónde me dirijo ? (versión Bing)</title><link>http://blog.jorgeivanmeza.com/2011/04/en-donde-estoy-y-hacia-donde-me-dirijo-version-bing/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=en-donde-estoy-y-hacia-donde-me-dirijo-version-bing</link> <comments>http://blog.jorgeivanmeza.com/2011/04/en-donde-estoy-y-hacia-donde-me-dirijo-version-bing/#comments</comments> <pubDate>Wed, 13 Apr 2011 03:35:36 +0000</pubDate> <dc:creator>jimezam</dc:creator> <category><![CDATA[Desarrollo de software]]></category> <category><![CDATA[Software geográfico]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[Bing]]></category> <category><![CDATA[geolocalización]]></category> <category><![CDATA[georreferenciación]]></category> <category><![CDATA[GIS]]></category> <category><![CDATA[Hipergalaxia]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Maps]]></category> <category><![CDATA[rutas]]></category> <guid
isPermaLink="false">http://blog.jorgeivanmeza.com/?p=15287</guid> <description><![CDATA[Introducción. Después de implementada una primera versión de este prototipo utilizando el servicio de Google Maps, encontré una seria limitación en la funcionalidad que requería para el experimento: Google Maps no permite trazar rutas entre marcadores en Colombia.  Esta característica &#8230; <a
href="http://blog.jorgeivanmeza.com/2011/04/en-donde-estoy-y-hacia-donde-me-dirijo-version-bing/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<h2>Introducción.</h2><p>Después de implementada una primera versión de este <a
href="http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/" target="_blank">prototipo utilizando el servicio de Google Maps</a>, encontré una seria limitación en la funcionalidad que requería para el experimento: Google Maps no permite trazar rutas entre marcadores en Colombia.  Esta característica es funcional en otros paises y por esto implementé la posibilidad de <em>teletransportarse</em> para probarla, sin embargo en Colombia no es posible.</p><p>Investigando encontré que Bing Maps, servicio de mapas similar de Microsoft, si permite realizar el trazado de rutas entre marcadores en Colombia.  Así que en la noche de ayer me dí a la tarea de revisar el API de este proveedor y de crear un nuevo prototipo con él.</p><p>Efectivamente el trazado de rutas funciona muy bien.  Con respecto a la comparación de los servicios encontré el API de Bing Maps fácil de entender y con buena documentación en Internet y provee todas las características que se habían utilizado en el prototipo anterior.  Como desventajas aparentes he encontrado que las rutas trazadas parecen no variar (además del tiempo de recorrido) independientemente si se realizan conduciendo o caminando, y el servicio de geocodificación parece ser mucho mas limitado que el de Google.</p><h2>El prototipo.</h2><div
id="attachment_15288" class="wp-caption aligncenter" style="width: 670px"><a
href="http://demo.jorgeivanmeza.com/BingMaps/WhereAmI/0.1/"><img
class="size-full wp-image-15288  " title="Selection_001" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/04/Selection_001.png" alt="Prototipo de aplicación - Where am I and where am I heading to ?" width="660" height="425" /></a><p
class="wp-caption-text">Prototipo de aplicación - Where am I and where am I heading to ?</p></div> ]]></content:encoded> <wfw:commentRss>http://blog.jorgeivanmeza.com/2011/04/en-donde-estoy-y-hacia-donde-me-dirijo-version-bing/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>En dónde estoy y hacia dónde me dirijo ? (versión Google)</title><link>http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=en-donde-estoy-y-hacia-donde-me-dirijo-version-google</link> <comments>http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/#comments</comments> <pubDate>Wed, 16 Mar 2011 18:10:49 +0000</pubDate> <dc:creator>jimezam</dc:creator> <category><![CDATA[Desarrollo de software]]></category> <category><![CDATA[Software geográfico]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[geolocalización]]></category> <category><![CDATA[georreferenciación]]></category> <category><![CDATA[GIS]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[Hipergalaxia]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Maps]]></category> <category><![CDATA[rutas]]></category> <guid
isPermaLink="false">http://blog.jorgeivanmeza.com/?p=14813</guid> <description><![CDATA[Introducción. Esta semana decidí experimentar un poco mas con la versión 3 del API de Google Maps que fue liberado hace relativamente poco.  Esta vez, quise hacer un prototipo sencillo pero interesante que integrara las principales funcionalidades que el servicio &#8230; <a
href="http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<h2>Introducción.</h2><p>Esta semana decidí experimentar un poco mas con la versión 3 del API de Google Maps que fue liberado hace relativamente poco.  Esta vez, quise hacer un prototipo sencillo pero interesante que integrara las principales funcionalidades que el servicio de Google Maps ofrece en los navegadores web actuales.</p><p>En este caso utilicé los mapas, la geocodificación y el trazado de rutas de Google y el servicio de geolocalización basada en el navegador web para obtener la siguiente funcionalidad.</p><ul><li>El servicio de geolocalización del navegador web permite situar al usuario en el espacio sin el uso de un GPS, esto gracias a una aproximación que aparentemente depende de la infraestructura del ISP.  A través de este servicio hace un par de meses lograba una geolocalización casi precisa de mi casa, mientras que recientemente sugiere que vivo en Cali/Valle, una ciudad que queda a unas 3 horas de viaje.</li><li>El servicio de mapas permite situar gráficamente dos puntos: uno el del usuario geolocalizado y otro, un punto de destino que se elige libremente con el botón izquierdo del ratón.</li><li>El servicio de rutas de Google permite trazar el camino necesario para llegar desde el punto de orígen hasta el punto de destino distinguiendo si el recorrido se hace caminando o conduciendo un vehículo.  Este servicio se complementa con el servicio de direcciones que determina las indicaciones que se deben seguir para llegar efectivamente al destino elegido.</li><li>El último servicio utilizado corresponde con el de geocodificación que permite convertir el nombre de una ubicación (una ciudad por ejemplo) a su correspondiente coordenada geográfica (latitud y longitud).  Esto se utiliza para el sistema de <em>teletransportación</em> del usuario que permite ubicarlo en cualquier lugar que se especifique.</li></ul><p>El aprovechamiento de estos APIs desde Javascript fue muy simple de implementar y fácilmente se desarrolló el prototipo.  Desafortunadamente Google no cuenta con el servicio de trazado de rutas en Colombia, motivo por el cual estoy revisando los servicios ofrecidos por BingMaps y OpenStreetMaps para continuar mi experimentación.</p><h2>El prototipo.</h2><div
id="attachment_14821" class="wp-caption aligncenter" style="width: 670px"><a
href="http://demo.jorgeivanmeza.com/GMaps/WhereAmI/"><img
class="size-full wp-image-14821" title="screenshot" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/03/screenshot.png" alt="Prototipo de aplicación - Where am I and where am I heading to ?" width="660" height="423" /></a><p
class="wp-caption-text">Prototipo de aplicación - Where am I and where am I heading to ?</p></div><h2>Enlaces.</h2><ul><li>Prototipo funcional del proyecto.<br
/> <a
href="http://demo.jorgeivanmeza.com/GMaps/WhereAmI/" target="_blank">http://demo.jorgeivanmeza.com/GMaps/WhereAmI/</a></li><li>W3C Geolocation API specification.<br
/> <a
href="http://dev.w3.org/geo/api/spec-source.html" target="_blank">http://dev.w3.org/geo/api/spec-source.html</a></li><li>Google Maps API Family.<br
/> <a
href="http://code.google.com/apis/maps/index.html" target="_blank">http://code.google.com/apis/maps/index.html</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Convertir coordenadas geográficas grados-minutos-segundos a notacional decimal (2): versión simple</title><link>http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-2-version-simple/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-2-version-simple</link> <comments>http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-2-version-simple/#comments</comments> <pubDate>Sat, 02 Oct 2010 18:24:35 +0000</pubDate> <dc:creator>jimezam</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[Software geográfico]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[converter]]></category> <category><![CDATA[coordinates]]></category> <category><![CDATA[GIS]]></category> <category><![CDATA[Hipergalaxia]]></category> <category><![CDATA[notation]]></category> <guid
isPermaLink="false">http://blog.jorgeivanmeza.com/?p=9852</guid> <description><![CDATA[Introducción. El método que utilizo habitualmente para realizar la conversión entre notaciones de coordenadas se basa en el método descrito anteriormente y es mas simple aunque aparentemente tiene un ligeramente mayor margen de pérdida de decimales en los cálculos. A &#8230; <a
href="http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-2-version-simple/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<h2>Introducción.</h2><p>El método que utilizo habitualmente para realizar la conversión entre notaciones de coordenadas se basa en el <a
href="http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal/" target="_blank">método descrito anteriormente</a> y es mas simple aunque aparentemente tiene un ligeramente mayor margen de pérdida de decimales en los cálculos.</p><p>A continuación se describe rápidamente las fórmulas matemáticas utilizadas para estos cálculos y se presentan los enlaces para la aplicación de deomstración y el formulario en Excel para pruebas.</p><h2>Procedimiento.</h2><h3>Notación Grados-Minutos-Segundos a notación decimal.</h3><p
style="padding-left: 30px;"><span
style="font-family: courier new,courier;">latitude_sign = (latitude_dir == "N") ? 1 : -1;<br
/> latitude  = (latitude_deg  + (latitude_min / 60.0)  + (latitude_sec / 60.0 / 60.0))  * latitude_sign;<br
/> </span></p><p
style="padding-left: 30px;"><span
style="font-family: courier new,courier;">longitude_sign = (longitude_dir == "E") ? 1 : -1;</span><br
/> <span
style="font-family: courier new,courier;">longitude = (longitude_deg + (longitude_min / 60.0) + (longitude_sec / 60.0 / 60.0)) * longitude_sign;</span></p><p><span
style="font-family: courier new,courier;"> </span></p><h3>Notación Decimal a notación Grados-Minutos-Segundos.</h3><p
style="padding-left: 30px;"><span
style="font-family: courier new,courier;">latitude_deg = Math.floor(Math.abs(latitude));<br
/> latitude_min = Math.floor((Math.abs(latitude) &#8211; latitude_deg) * 60);<br
/> latitude_sec = Math.ceil(((Math.abs(latitude) &#8211; latitude_deg) * 60 &#8211; latitude_min) * 60);<br
/> latitude_dir = (latitude_sign &gt; 0) ? "N" : "S";</span></p><p
style="padding-left: 30px;"><span
style="font-family: courier new,courier;">longitude_deg = Math.floor(Math.abs(longitude));<br
/> longitude_min = Math.floor((Math.abs(longitude) &#8211; longitude_deg) * 60);<br
/> longitude_sec = Math.ceil(((Math.abs(longitude) &#8211; longitude_deg) * 60 &#8211; longitude_min) * 60);<br
/> longitude_dir = (longitude_sign &gt; 0) ? "E" : "W";</span></p><h2>Enlaces.</h2><ul><li>Clase CoordConverter en Javascript.<br
/> <a
href="http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.1a/" target="_blank">http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.1a/</a></li><li>Aplicación de demostración de la conversión de coordenadas.<br
/> <a
href="http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.1a/test.html" target="_blank">http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.1a/test.html</a></li><li>Formulario de demostración de la conversión de coordenadas en Excel.<br
/> <a
href="http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.1a/CoordinatesConverter_0.1a.xls" target="_blank">http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.1a/CoordinatesConverter_0.1a.xls</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-2-version-simple/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Convertir coordenadas geográficas grados-minutos-segundos a notacional decimal</title><link>http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal</link> <comments>http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal/#comments</comments> <pubDate>Sat, 02 Oct 2010 03:21:21 +0000</pubDate> <dc:creator>jimezam</dc:creator> <category><![CDATA[Software]]></category> <category><![CDATA[Software geográfico]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[converter]]></category> <category><![CDATA[coordinates]]></category> <category><![CDATA[GIS]]></category> <category><![CDATA[Hipergalaxia]]></category> <category><![CDATA[notation]]></category> <guid
isPermaLink="false">http://blog.jorgeivanmeza.com/?p=9816</guid> <description><![CDATA[Historial. Versión 0.2 Versión mejorada apropiando el código de  Anthony T. Holdener.(mayor precisión en los cálculos)  Versión 0.1a Simplificación de los cálculos realizados. Versión 0.1 Basado en la implementación de la aplicación de FCC.(este artículo)  Introducción. Finalmente pude encontrar el método &#8230; <a
href="http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<h2>Historial.</h2><table
border="1" align="center"><tbody><tr><td><a
href="http://blog.jorgeivanmeza.com/2011/06/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3/">Versión 0.2</a></td><td>Versión mejorada apropiando el código de  Anthony T. Holdener.<br
/>(mayor precisión en los cálculos) </td></tr><tr><td><a
href="http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-2-version-simple/">Versión 0.1a</a></td><td>Simplificación de los cálculos realizados.</td></tr><tr><td>Versión 0.1</td><td>Basado en la implementación de la aplicación de FCC.<br
/>(este artículo) </td></tr></tbody></table><h2>Introducción.</h2><p>Finalmente pude encontrar el método para convertir las coordenadas geográficas desde la notación grados-minutos-segundos a la notación decimal y viceversa.  La <a
href="http://www.fcc.gov/mb/audio/bickel/DDDMMSS-decimal.html" target="_blank">aplicación de la FCC para esta conversión</a> me ayudó bastante.</p><p>La utilidad de esta conversión radica en que muchas veces se manejan las coordenadas en el formato GMS (latitud <span
style="font-family: courier new,courier;">5<sup>o</sup>4'59"</span> norte y longitud <span
style="font-family: courier new,courier;">75<sup>o</sup>30'0"</span> oeste) mientras que muchas páginas web y aplicaciones (incluído Google Maps) requieren la información en la notación decimal (latitud <span
style="font-family: courier new,courier;">5.083056</span> y longitud <span
style="font-family: courier new,courier;">-75.5</span>).</p><p>Durante los experimentación se creó una clase en Javascript que expone dos métodos simplificados para realizar estas conversiones.  Los cálculos pueden ser fácilmente migrados a otros lenguajes de programación ya que sólo utilizan funciones matemáticas como <span
style="font-family: courier new,courier;">floor</span>, <span
style="font-family: courier new,courier;">abs</span> y <span
style="font-family: courier new,courier;">round</span> además de los operadores aritméticos.</p><h2>Demostración.</h2><p>Para la prueba y demostración de la clase Javascript se desarrolló un formulario muy sencillo que permite realizar la transformación de coordenadas geográficas entre las dos notaciones mencionadas.</p><p><div
id="attachment_9817" class="wp-caption aligncenter" style="width: 820px"><a
href="http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.1/test.html"><img
class="size-full wp-image-9817" title="Selection_016" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2010/10/Selection_016.png" alt="Demostración de la conversión de coordenadas" width="810" height="359" /></a><p
class="wp-caption-text">Demostración de la conversión de coordenadas</p></div><p>En la demostración puede verificar las coordenadas enunciadas anteriormente las cuales corresponden con la ciudad de Manizales/Caldas/Colombia.</p><p
style="padding-left: 30px;">Notación GMS.</p><blockquote><ul><li>latitud: <span
style="font-family: courier new,courier;">5<sup>o</sup>4'59" N</span></li><li>longitud: <span
style="font-family: courier new,courier;">75<sup>o</sup>30'0" W</span></li></ul></blockquote><p
style="padding-left: 30px;">Notación decimal.</p><blockquote><ul><li>latitud: <span
style="font-family: courier new,courier;">5.083056</span></li><li>longitud: <span
style="font-family: courier new,courier;">-75.5</span></li></ul></blockquote><h2>Enlaces.</h2><ul><li>Clase CoordConverter en Javascript.<br
/> <a
href="http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/" target="_blank">http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/</a></li><li>Aplicación de demostración de la conversión de coordenadas.<br
/> <a
href="http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.1/test.html" target="_blank">http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.1/test.html</a></li><li>Degrees, Minutes, Seconds and Decimal Degrees Latitude/Longitude Conversions de la FCC.<br
/> <a
href="http://www.fcc.gov/mb/audio/bickel/DDDMMSS-decimal.html" target="_blank">http://www.fcc.gov/mb/audio/bickel/DDDMMSS-decimal.html</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal/feed/</wfw:commentRss> <slash:comments>8</slash:comments> </item> <item><title>Introducción a StaticMaps de Google</title><link>http://blog.jorgeivanmeza.com/2008/10/introduccion-a-staticmaps-de-google/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introduccion-a-staticmaps-de-google</link> <comments>http://blog.jorgeivanmeza.com/2008/10/introduccion-a-staticmaps-de-google/#comments</comments> <pubDate>Wed, 29 Oct 2008 03:47:38 +0000</pubDate> <dc:creator>jimezam</dc:creator> <category><![CDATA[Desarrollo de software]]></category> <category><![CDATA[Móvil]]></category> <category><![CDATA[Software geográfico]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[GIS]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[GoogleMaps]]></category> <guid
isPermaLink="false">http://www.jorgeivanmeza.com/blog/?p=854</guid> <description><![CDATA[Introducción StaticMaps es una herramienta de Google que nos permite integrar en nuestras aplicaciones a imagenes estáticas de su cartografía de una manera muy simple.  Como se puede inferir, para utilizarlos es necesario que la aplicación tenga acceso a Internet &#8230; <a
href="http://blog.jorgeivanmeza.com/2008/10/introduccion-a-staticmaps-de-google/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<h5>Introducción</h5><p><strong>StaticMaps</strong> es una herramienta de <strong>Google</strong> que nos permite integrar en nuestras aplicaciones a imagenes estáticas de su cartografía de una manera muy simple.  Como se puede inferir, para utilizarlos es necesario que la aplicación tenga acceso a Internet y su acceso se realiza a través de un requerimiento HTTP convencional con ciertos parámetros que se verán a continuación y que permiten refinar el contenido de la imagen del mapa producido.</p><p>Esta herramienta la he utilizado varias veces en diferentes tipos de proyectos como <a
href="http://www.jorgeivanmeza.com/blog/2008/07/07/mi-primer-moblet/" target="_blank">Mi Primer Moblet</a> (móviles), <a
href="http://www.jorgeivanmeza.com/blog/2008/09/09/demostracion-de-georreferenciacion-al-estilo-web-20/" target="_blank">GeoReferenciación con Java</a> (escritorio) y la demostración de <a
href="http://www.jorgeivanmeza.com/blog/2008/09/03/desarrollo-de-sistemas-multiagentes/" target="_blank">MandarinaSocial</a> (agentes de software).</p><p>Para su uso se requiere que el desarrollador registre de manera gratuita el dominio desde donde se va a utilizar el servicio.  El registro se materializa a través de una <em>llave de API</em> particular.  Esta llave se solicita a través del siguiente enlace.</p><p
style="padding-left: 30px;"><a
href="http://code.google.com/apis/maps/signup.html" target="_blank">http://code.google.com/apis/maps/signup.html</a></p><p>El servicio se restringe a un máximo de 1000 requerimientos únicos diarios, siendo este límite aplicado por solicitante (ubicación) y no por llave lo que disminuye el impacto de esta restricción, mas aún cuando las solicitudes repetidas de la misma imagen no son tomadas en cuenta para la estadística de la cuota.</p><p>Un primer acercamiento a la herramienta consiste en jugar un poco con ella utilizando el <a
href="http://gmaps-samples.googlecode.com/svn/trunk/simplewizard/makestaticmap.html" target="_blank">Static Map Wizard</a>.</p><h5>Forma de acceso</h5><p>Como se mencionó anteriormente, la solicitud se inicia requiriendo un URL con ciertos parámetros a través de GET y el servicio retorna una imagen en un formato compatible con web que puede ser insertada en una página web con una etiqueta <span
style="font-family: courier new,courier;">&lt;img&gt;</span> o puede ser manipulada por una aplicación desarrollada en cualquier lenguaje de programación como Java o C#.</p><p>Los siguientes aspectos del StaticMap pueden ser parametrizados a través de los parámetros del URL.</p><ul><li>La ubicación del mapa.</li><li>El tamaño de la imagen generada.</li><li>El nivel de acercamiento.</li><li>El tipo de mapa.</li><li>El lugar de los marcadores.</li><li>El lugar de las rutas trazadas.</li></ul><h5>Estructura general del URL</h5><p>Esta es la estructura básica del URL sobre la cual se estructura el requerimiento del servicio.</p><p
style="padding-left: 30px;">http://maps.google.com/staticmap?<em>PARÁMETROS</em></p><p>La lista de <em>PARÁMETROS</em> consiste en varias secciones separadas entre sí por <span
style="font-family: courier new,courier;">&amp;</span> y que se encuentran construídas con un formato especial y que serán descritas a continuación.</p><p>Estos son los parámetros del servicio suceptibles de personalizarse.</p><ol><li><span
style="font-family: courier new,courier;">center.</span></li><li><span
style="font-family: courier new,courier;">zoom.</span></li><li><span
style="font-family: courier new,courier;">size.</span></li><li><span
style="font-family: courier new,courier;">format.</span></li><li><span
style="font-family: courier new,courier;">maptype.</span></li><li><span
style="font-family: courier new,courier;">markers.</span></li><li><span
style="font-family: courier new,courier;">path.</span></li><li><span
style="font-family: courier new,courier;">frame.</span></li><li><span
style="font-family: courier new,courier;">key.</span></li></ol><h5>Ubicaciones</h5><p>Las ubicaciones georreferenciadas son especificadas de la forma latitud y longitud como dos valores reales con 6 dígitos decimales de precisión y separados por una coma: 5.07,-75.521.</p><p>Los valores válidos de una latitud varían desde -90 hasta 90 grados mientras que los valores válidos para una longitud varía desde -180 hasta 180 grados.</p><h5>Parámetro Key</h5><p>Es obligatorio y se utiliza para especificar la llave del API que se obtuvo inicialmente.  <span
style="text-decoration: underline;">Sin esto, es imposible acceder al servicio.</span></p><p
style="padding-left: 30px;"><a
href="http://maps.google.com/staticmap?center=5.07,-75.521&amp;zoom=9&amp;size=500x300&amp;key=ABQIAAAAAa_xc3cplYGMwVbx_zW2chTWZSld1Wm-gV17JxrvtQa7WXWbRRTOL98qj5hk-yEw1n5LrYmEoAwzOg" target="_blank">http://maps.google.com/staticmap?center=5.07,-75.521&amp;zoom=5&amp;size=500&#215;300&amp;<strong>key=ABQIAAAAAa_xc3cplYGMwVbx_zW2chTWZSld1Wm-gV17JxrvtQa7WXWbRRTOL98qj5hk-yEw1n5LrYmEoAwzOg</strong></a></p><h5>Parámetro Center</h5><p>Es obligatorio pero se convierte en opcional bajo ciertas circunstancias.  Determina la ubicación al rededor de la cual se centrará el mapa generado.</p><p
style="padding-left: 30px;"><a
href="http://maps.google.com/staticmap?center=5.07,-75.521&amp;zoom=9&amp;size=500x300&amp;key=ABQIAAAAAa_xc3cplYGMwVbx_zW2chTWZSld1Wm-gV17JxrvtQa7WXWbRRTOL98qj5hk-yEw1n5LrYmEoAwzOg" target="_blank">http://maps.google.com/staticmap?<strong>center=5.07,-75.521</strong></a></p><p>El mapa anterior se encuentra centrado al rededor de las coordenadas de Manizales, Caldas.</p><h5>Parámetro Zoom</h5><p>Es obligatorio pero se convierte en opcional bajo ciertas circunstancias.  Determina el nivel de acercamiento al mapa.</p><p>Es definido por un número entero que varía entre 0 (menor) hasta 19 (máxima).  Debe tenerse en cuenta que no todos los niveles de acercamiento están disponibles para todos los tipos de mapas.</p><p
style="padding-left: 30px;"><a
href="http://maps.google.com/staticmap?center=5.07,-75.521&amp;zoom=11&amp;size=500x300&amp;key=ABQIAAAAAa_xc3cplYGMwVbx_zW2chTWZSld1Wm-gV17JxrvtQa7WXWbRRTOL98qj5hk-yEw1n5LrYmEoAwzOg" target="_blank">http://maps.google.com/staticmap?center=5.07,-75.521&amp;<strong>zoom=11</strong></a></p><p>El mapa anterior determina un nivel 11 de acercamiento sobre Manizales.</p><h5>Parámetro Size.</h5><p>Es obligatorio.  Especifica el tamaño de la imagen generada.</p><p>Su valor se especifica por un ancho y un alto separados por la letra '<span
style="font-family: courier new,courier;">x</span>' y su unidad es en pixels: 500&#215;300.  El valor máximo de estas dimensiones es 640&#215;480.</p><p
style="padding-left: 30px;"><a
href="http://maps.google.com/staticmap?center=5.07,-75.521&amp;zoom=11&amp;size=500x300&amp;key=ABQIAAAAAa_xc3cplYGMwVbx_zW2chTWZSld1Wm-gV17JxrvtQa7WXWbRRTOL98qj5hk-yEw1n5LrYmEoAwzOg" target="_blank">http://maps.google.com/staticmap?center=5.07,-75.521&amp;zoom=11&amp;<strong>size=500&#215;300</strong></a></p><p>La imagen generada a partir del requerimiento anterior tiene un ancho de 500px y un alto de 300px.</p><h5>Parámetro Format.</h5><p>Es opcional y determina el tipo de formato de la imagen generada.  Su selección depende de la relación tamaño/calidad deseada.  Si se omite, su valor por defecto es GIF.</p><p>Los posibles valores para este parámetro son los siguientes.</p><ul><li><span
style="font-family: courier new,courier;">gif </span>(por defecto).</li><li><span
style="font-family: courier new,courier;">jpg</span></li><li><span
style="font-family: courier new,courier;">jpg-baseline</span> (no progresivo)</li><li><span
style="font-family: courier new,courier;">png8 </span>(8 bits)</li><li><span
style="font-family: courier new,courier;">png32 </span>(32 bits)</li></ul><p
style="padding-left: 30px;"><a
href="http://maps.google.com/staticmap?center=5.07,-75.521&amp;zoom=11&amp;size=500x300&amp;format=png8&amp;key=ABQIAAAAAa_xc3cplYGMwVbx_zW2chTWZSld1Wm-gV17JxrvtQa7WXWbRRTOL98qj5hk-yEw1n5LrYmEoAwzOg" target="_blank">http://maps.google.com/staticmap?center=5.07,-75.521&amp;zoom=11&amp;size=500&#215;300&amp;<strong>format=png8</strong></a></p><p>El ejemplo anterior genera una imagen con formato PNG de 8 bits.</p><h5>Parámetro MapType.</h5><p>Es opcional y determina el tipo de cartografía a utilizarse para la generación de la imagen.  Si se omite, su valor por defecto es <span
style="font-family: courier new,courier;">roadmap</span>.</p><p>Los posibles valores para este parámetro son los siguientes.</p><ul><li><span
style="font-family: courier new,courier;">roadmap </span>(por defecto).</li><li><span
style="font-family: courier new,courier;">mobile</span>.  Presenta mejoras gráficas para la visualización en dispositivos móviles.</li><li><span
style="font-family: courier new,courier;">satellite</span>. Muestra las imagenes de satélite.</li><li><span
style="font-family: courier new,courier;">terrain</span>. Muesta el mapa del relieve y la vegetación.</li><li><span
style="font-family: courier new,courier;">hybrid</span>. Mezcla el contenido de los tipos <span
style="font-family: courier new,courier;">roadmap</span> y <span
style="font-family: courier new,courier;">satellite</span>.</li></ul><p
style="padding-left: 30px;"><a
href="http://maps.google.com/staticmap?center=5.07,-75.521&amp;zoom=11&amp;size=500x300&amp;format=png8&amp;maptype=hybrid&amp;key=ABQIAAAAAa_xc3cplYGMwVbx_zW2chTWZSld1Wm-gV17JxrvtQa7WXWbRRTOL98qj5hk-yEw1n5LrYmEoAwzOg" target="_blank">http://maps.google.com/staticmap?center=5.07,-75.521&amp;zoom=11&amp;size=500&#215;300&amp;format=png8&amp;<strong>maptype=hybrid</strong></a></p><p>El ejemplo anterior modifica el tipo de mapa visto hasta ahora (<span
style="font-family: courier new,courier;">roadmap</span>) y presenta un mapa estilo híbrido de la misma ubicación.</p><h5>Parámetro Markers.</h5><p>Es opcional y permite especificar y personalizar los marcadores que referenciarán ubicaciones importantes en el mapa.  Es posible especificar hasta 50 marcadores diferentes por mapa.</p><p>Cuando se especifica el parámetro <span
style="font-family: courier new,courier;">markers</span> no es necesario especificar a los parámetros <span
style="font-family: courier new,courier;">center</span> y <span
style="font-family: courier new,courier;">zoom</span> ya que estos se pueden calcular automáticamente.</p><p>La información de los marcadores se especifica con una cadena separada por '<span
style="font-family: courier new,courier;">|</span>' (<span
style="font-family: courier new,courier;">%7C</span>) de la siguiente manera.</p><p
style="padding-left: 30px;"><span
style="font-family: courier new,courier;">markers=infoMarcador1|infoMarcador2|infoMarcador3|&#8230;</span></p><p>La información de los marcadores incluye datos tanto de su ubicación como de su presentación.  Cada marcador se crea con la siguiente estructura.</p><p
style="padding-left: 30px;"><span
style="font-family: courier new,courier;">{latitud},{longitud},{tamaño}{color}{identificador}</span></p><p>El siginificado de cada uno de estos campos se describe a continuación.</p><ul><li><span
style="font-family: courier new,courier;">latitud </span>(requerido).  Latitud de la ubicación del marcador.</li><li><span
style="font-family: courier new,courier;">longitud </span>(requerido).  Longitud de la ubicación del marcador.</li><li><span
style="font-family: courier new,courier;">tamaño </span>(opcional).  Tamaño de la imagen del marcador.  Puede tomar uno de los siguientes valores.<ul><li><span
style="font-family: courier new,courier;">tiny</span></li><li><span
style="font-family: courier new,courier;">mid </span>(por defecto)</li><li><span
style="font-family: courier new,courier;">small</span></li></ul></li><li><span
style="font-family: courier new,courier;">color </span>(opcional).  Determina el color de la imagen del marcador.  Puede tomar una de las siguientes constantes.<ul><li><span
style="font-family: courier new,courier;">black</span></li><li><span
style="font-family: courier new,courier;">brown</span></li><li><span
style="font-family: courier new,courier;">green</span></li><li><span
style="font-family: courier new,courier;">purple</span></li><li><span
style="font-family: courier new,courier;">yellow</span></li><li><span
style="font-family: courier new,courier;">blue</span></li><li><span
style="font-family: courier new,courier;">gray</span></li><li><span
style="font-family: courier new,courier;">orange</span></li><li><span
style="font-family: courier new,courier;">red</span><span
style="font-family: courier new,courier;"> </span>(por defecto)</li><li><span
style="font-family: courier new,courier;">white</span></li></ul></li><li><span
style="font-family: courier new,courier;">identificador </span>(opcional).  Permite especificar un carácter alfanumérico y en minúsculas para identificar al marcador.  Debe tenerse en cuenta que este identificador sólo aplica para marcadores tamaño <span
style="font-family: courier new,courier;">mid</span>.  Su valor por defecto es el punto.</li></ul><p
style="padding-left: 30px;"><a
href="http://maps.google.com/staticmap?size=500x300&amp;format=png8&amp;maptype=hybrid&amp;markers=5.07,-75.521,midyellowm|4.813,-75.696,midbluep|4.534,-75.681,midreda&amp;key=ABQIAAAAAa_xc3cplYGMwVbx_zW2chTWZSld1Wm-gV17JxrvtQa7WXWbRRTOL98qj5hk-yEw1n5LrYmEoAwzOg" target="_blank">http://maps.google.com/staticmap?size=500&#215;300&amp;format=png8&amp;maptype=hybrid&amp;<strong>markers=5.07,-75.521,midyellowm|4.813,-75.696,midbluep|4.534,-75.681,midreda</strong></a></p><p>El ejemplo anterior muestra el mapa del eje cafetero colombiano resaltando sus ciudades con marcadores de la siguiente manera: Manizales (amarillo), Pereira (azul) y Armenia (rojo).</p><h5>Parámetro Path.</h5><p>Es opcional y permite especificar y personalizar rutas sobre el mapa que conectan a dos o mas puntos georreferenciados.  El límite es el de máximo 100 puntos por ruta.</p><p>El parámetro se define de manera similar a <span
style="font-family: courier new,courier;">markers</span> siguiendo el siguiente formato.</p><p
style="padding-left: 30px;"><span
style="font-family: courier new,courier;">path=tipoColor:#color,weight:pesoRuta|punto1|punto2|punto3|&#8230;</span></p><p>El siginificado de cada uno de estos campos se describe a continuación.</p><ul><li><span
style="font-family: courier new,courier;">tipoColor</span>.  Especifica el tipo de formato del color.  Puede tomar uno de los siguientes valores.<ul><li>rgb.  Esquema RGB estándar con valores de 24 bits de la forma <span
style="font-family: courier new,courier;">0xffffff</span>.  Su nivel de opacidad por defecto es de 50%.</li><li>rgba.  Utiliza valores de 32 bits de la forma <span
style="font-family: courier new,courier;">0xffffffff</span>.  El nivel de opacidad está dado por el cuarto byte (últimos dos carácteres) que conforman el canal alfa de transparencia.</li></ul></li><li><span
style="font-family: courier new,courier;">weight</span>.  Especifica el grosor de la ruta en pixels.</li></ul><p
style="padding-left: 30px;"><a
href="http://maps.google.com/staticmap?size=500x300&amp;format=png8&amp;maptype=hybrid&amp;markers=5.07,-75.521,midyellowm|4.813,-75.696,midbluep|4.534,-75.681,midreda&amp;path=rgb:0x0000ff,weight:5|5.07,-75.521|4.813,-75.696|4.534,-75.681&amp;key=ABQIAAAAAa_xc3cplYGMwVbx_zW2chTWZSld1Wm-gV17JxrvtQa7WXWbRRTOL98qj5hk-yEw1n5LrYmEoAwzOg" target="_blank">http://maps.google.com/staticmap?size=500&#215;300&amp;format=png8&amp;maptype=hybrid&amp;markers=5.07,-75.521,midyellowm|4.813,-75.696,midbluep|4.534,-75.681,midreda&amp;<strong>path=rgb:0x0000ff,weight:5|5.07,-75.521|4.813,-75.696|4.534,-75.681</strong></a></p><p>En este ejemplo se agrega una ruta azul entre Armenia &#8211; Pereira &#8211; Manizales sobre el ejemplo inmediatamente anterior.</p><h5>Parámetro Frame.</h5><p>Es opcional y especifica si la imagen resultante se debe o no mostrar con un borde azul de 5px y con 55% de opacidad a su alrededor.  Por defecto no se muestra.</p><p
style="padding-left: 30px;"><a
href="http://maps.google.com/staticmap?size=500x300&amp;format=png8&amp;maptype=hybrid&amp;markers=5.07,-75.521,midyellowm|4.813,-75.696,midbluep|4.534,-75.681,midreda&amp;path=rgb:0x0000ff,weight:5|5.07,-75.521|4.813,-75.696|4.534,-75.681&amp;frame=true&amp;key=ABQIAAAAAa_xc3cplYGMwVbx_zW2chTWZSld1Wm-gV17JxrvtQa7WXWbRRTOL98qj5hk-yEw1n5LrYmEoAwzOg" target="_blank">http://maps.google.com/staticmap?size=500&#215;300&amp;format=png8&amp;maptype=hybrid&amp;markers=5.07,-75.521,midyellowm|4.813,-75.696,midbluep|4.534,-75.681,midreda&amp;path=rgb:0x0000ff,weight:5|5.07,-75.521|4.813,-75.696|4.534,-75.681&amp;<strong>frame=true</strong></a></p><p>Enlaces:</p><ul><li><a
href="http://code.google.com/apis/maps/signup.html" target="_blank">Sign Up for the Google Maps API</a>.</li><li><a
href="http://code.google.com/apis/maps/documentation/staticmaps/" target="_blank">Static Maps API Developer's Guide</a>.</li><li><a
href="http://gmaps-samples.googlecode.com/svn/trunk/simplewizard/makestaticmap.html" target="_blank">Static Map Wizard</a>.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.jorgeivanmeza.com/2008/10/introduccion-a-staticmaps-de-google/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Departamentos y municipios de Colombia (Actualización 20080915)</title><link>http://blog.jorgeivanmeza.com/2008/09/departamentos-y-municipios-de-colombia-actualizacion-20080915/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=departamentos-y-municipios-de-colombia-actualizacion-20080915</link> <comments>http://blog.jorgeivanmeza.com/2008/09/departamentos-y-municipios-de-colombia-actualizacion-20080915/#comments</comments> <pubDate>Mon, 15 Sep 2008 05:46:16 +0000</pubDate> <dc:creator>jimezam</dc:creator> <category><![CDATA[Software geográfico]]></category> <category><![CDATA[Colombia]]></category> <category><![CDATA[GIS]]></category> <guid
isPermaLink="false">http://www.jorgeivanmeza.com/blog/?p=684</guid> <description><![CDATA[He venido actualizando la información de los departamentos y municipios de Colombia publicada anteriormente. Ahora se incluye a los municipios creados desde entonces (1102 registros actualmente).  Además me he dado a la tarea de georreferenciar (latitud/longitud) esta información para ser &#8230; <a
href="http://blog.jorgeivanmeza.com/2008/09/departamentos-y-municipios-de-colombia-actualizacion-20080915/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>He venido actualizando la información de los <a
href="http://blog.jorgeivanmeza.com/2007/05/28/departamentos-y-municipios-de-colombia/" target="_blank">departamentos y municipios de Colombia</a> publicada anteriormente.</p><p>Ahora se incluye a los municipios creados desde entonces (1102 registros actualmente).  Además me he dado a la tarea de georreferenciar (latitud/longitud) esta información para ser utilizada en futuros proyectos.  De momento me faltan 19 municipios cuyos nombres no coinciden.</p><p>La información se puede descargar de manera gratuita teniendo en cuenta que este es un trabajo en progreso por lo que no es necesariamente preciso.  Agradecería me informen las correcciones si alguien nota algún error en los datos.</p><p>Los archivos a continuación se encuentran en formato <a
href="http://en.wikipedia.org/wiki/Comma-separated_values" target="_blank">CSV</a> y su codificación es <a
href="http://en.wikipedia.org/wiki/Utf_8" target="_blank">UTF-8</a> lo que debe tenerse en cuenta para su correcta visualización.</p><ul><li><a
href="http://blog.jorgeivanmeza.com/wp-content/uploads/2008/09/departamentoscolombiacsv.txt" target="_blank">Departamentos de Colombia</a>: Código, Nombre, Latitud, Longitud.</li><li><a
href="http://blog.jorgeivanmeza.com/wp-content/uploads/2008/09/municipioscolombiacsv.txt" target="_blank">Municipios por Departamento</a>: Código, Nombre, Código del departamento, Nombre del departamento, Latitud, Longitud.</li></ul><p>La información se puede de la base de datos se puede consultar de manera gráfica utilizando el siguiente <em>mapplet</em> de mi autoría: <a
onclick="window.open('http://maps.google.com/maps/mpl?moduleurl=http://demo.jorgeivanmeza.com/GMaps/municipios/ultimo/mapplet.xml','','scrollbars=yes,resizable=yes,width=1024,height=768');return false;" href="http://maps.google.com/maps/mpl?moduleurl=http://demo.jorgeivanmeza.com/GMaps/municipios/ultimo/mapplet.xml" target="_blank">Mapa de departamentos y municipios colombianos</a>.</p><p>Enlace: <a
href="http://190.25.231.236/Divipola/Divipola.asp" target="_blank">Sistema de consulta de la división pollítico-administrativa de Colombia</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.jorgeivanmeza.com/2008/09/departamentos-y-municipios-de-colombia-actualizacion-20080915/feed/</wfw:commentRss> <slash:comments>28</slash:comments> </item> <item><title>GeoIPTool &#8211; de donde es esta IP ?</title><link>http://blog.jorgeivanmeza.com/2008/09/geoiptool-de-donde-es-esta-ip/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=geoiptool-de-donde-es-esta-ip</link> <comments>http://blog.jorgeivanmeza.com/2008/09/geoiptool-de-donde-es-esta-ip/#comments</comments> <pubDate>Fri, 12 Sep 2008 02:09:45 +0000</pubDate> <dc:creator>jimezam</dc:creator> <category><![CDATA[Internet]]></category> <category><![CDATA[Software]]></category> <category><![CDATA[Web]]></category> <category><![CDATA[GIS]]></category> <guid
isPermaLink="false">http://www.jorgeivanmeza.com/blog/?p=676</guid> <description><![CDATA[El servicio GeoIPTool permite identificar de manera gráfica de donde proviene cualquier dirección IP que se desee. Enlace: http://geoiptool.com/.]]></description> <content:encoded><![CDATA[<p>El servicio GeoIPTool permite identificar de manera gráfica de donde proviene cualquier dirección IP que se desee.</p><p><a
href="http://www.jorgeivanmeza.com/blog/wp-content/uploads/2008/09/geoiptool.png"><img
class="aligncenter size-full wp-image-677" title="geoiptool" src="http://www.jorgeivanmeza.com/blog/wp-content/uploads/2008/09/geoiptool.png" alt="" width="500" height="368" /></a></p><p>Enlace: <a
href="http://geoiptool.com/" target="_blank">http://geoiptool.com/</a>.</p> ]]></content:encoded> <wfw:commentRss>http://blog.jorgeivanmeza.com/2008/09/geoiptool-de-donde-es-esta-ip/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Demostración de georreferenciación al estilo web 2.0</title><link>http://blog.jorgeivanmeza.com/2008/09/demostracion-de-georreferenciacion-al-estilo-web-20/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=demostracion-de-georreferenciacion-al-estilo-web-20</link> <comments>http://blog.jorgeivanmeza.com/2008/09/demostracion-de-georreferenciacion-al-estilo-web-20/#comments</comments> <pubDate>Wed, 10 Sep 2008 02:43:37 +0000</pubDate> <dc:creator>jimezam</dc:creator> <category><![CDATA[Desarrollo de software]]></category> <category><![CDATA[Internet]]></category> <category><![CDATA[Software geográfico]]></category> <category><![CDATA[GeoNames]]></category> <category><![CDATA[GIS]]></category> <category><![CDATA[GoogleMaps]]></category> <category><![CDATA[Java]]></category> <guid
isPermaLink="false">http://www.jorgeivanmeza.com/blog/?p=652</guid> <description><![CDATA[No es que me sienta viejo aún, pero como me hubiera gustado que como ahora, hubieran existido tantas cosas y que hubieran estado al alcance de los desarrolladores cuando yo era estudiante hace un tiempo ya.  Gloriosa época de muchas &#8230; <a
href="http://blog.jorgeivanmeza.com/2008/09/demostracion-de-georreferenciacion-al-estilo-web-20/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>No es que me sienta viejo aún, pero como me hubiera gustado que como ahora, hubieran existido tantas cosas y que hubieran estado al alcance de los desarrolladores cuando yo era estudiante hace un tiempo ya.  Gloriosa época de muchas trasnochadas expermientando cositas, en particular con Java.</p><p>Desafortunadamente, en mi época de estudiante me tocó un mundo no tan interesante como el actual, ya que empezamos con C/C++ para MS-DOS y en esa época el reto adicional era mostrar imágenes en los programas y simular el ambiente 3D de ventanas con sólo las líneas y cuadrados del <a
href="http://en.wikipedia.org/wiki/Borland_Graphics_Interface" target="_blank">BGI </a> <img
src='http://blog.jorgeivanmeza.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /></p><p>Java llegó después y me tocó la época en que <em>todos</em> estabamos aprendiendo y las cosas emocionantes empezaron a llegar con el tiempo y con Internet.  Recuerdo que ya terminando mis clases, cuando abrí mis primeras direcciones de correo en USA.net y Hotmail, mis compañeros estuvieron renuentes por un buen tiempo porque no le veían la utilidad al correo electrónico o simplemente porque no tenían quien les escribiera.  Pero por suerte ya todo eso pasó.</p><p>Ahora hay muchas cosas, tantas que no alcanza el tiempo para buscarlas, estudiarlas y hacer algo con ellas.  Inclusive hay muchas cosas del mismo estilo.  Todo un mundo de delicias para escoger.  Lo que falta es tiempo.  El trabajo y el cansancio son malos amigos para la investigación.  Ahora, donde uno mire, hay cosas para probar y lo mejor de todo es que la mayoría son abiertas y grátis &#8230; digo libres (<em>free</em>), el límite es el tiempo y la pereza mental de las personas.</p><p>Hoy, a pesar de que tengo muchos informes atrasados, me dieron ganas de hacer una aplicación muy sencilla para demostrar un par de estas librerías que están allí, esperando que hagamos algo interesante con ellas.   Este ejemplo muy simple me tomó al rededor de 2 horas implementarlo y eso porque son muy lento para hacer las interfaces de usuario desde código.</p><p>Así surgió la <strong>demostración de georreferenciación al estilo web 2.0</strong> que permite visualizar el mapa de cualquier ubicación del mundo y ubicar sobre él marcadores georreferenciados.</p><p>Para esto utiliza los servicios de <a
href="http://maps.google.com/" target="_blank">Google Maps</a> para la generación de las imágenes y <a
href="http://www.geonames.org/" target="_blank">GeoNames </a>para la georreferenciación, es decir, para convertir las ubicaciones (<span
style="font-family: courier new,courier;">Manizales, Caldas, Colombia</span>) en sus respectivas duplas latitud/longitud para poder ser relacionadas geográficamente.</p><p><a
href="http://www.jorgeivanmeza.com/blog/wp-content/uploads/2008/09/screenshot.jpg"><img
class="aligncenter size-full wp-image-693" title="screenshot" src="http://www.jorgeivanmeza.com/blog/wp-content/uploads/2008/09/screenshot.jpg" alt="" width="500" height="375" /></a></p><p>En la parte izquierda se aprecia la lista con las ubicaciones seleccionadas que corresponden con las marcas rojas en el mapa, en la parte derecha está el mapa junto con tres barras de desplazamiento que regulan su presentación y en la parte inferior se encuentran los botones de opciones.</p><p>El demo le permite al usuario <strong>Agregar </strong>y <strong>Remover</strong> ubicaciones como puntos seleccionados.  Como se mencionó, estas se ingresan con los nombres de las ubicaciones y el sistema obtiene su ubicación geográfica a través de la consulta de un servicio web.  Es posible en cualquier momento,<strong> Centrar</strong> el mapa al rededor de cualquiera de los puntos seleccionados almacendos.</p><p>La manipulación del mapa se realiza con las barras de desplazamiento.  La naranja (derecha) corresponde con el zoom: hacia abajo aumenta, haciendo mayor el acercamiento del mapa.  La horizontal, azul, corresponde con la longitud y la vertical, verde, corresponde con la latitud.  Cuando se modifica cualquiera de estos valores se deberá solicitar la actualización del mapa presionando el botón <strong>Refrescar</strong>.</p><p>La aplicación ha sido desarrollada en Java por lo que su código es muy claro y modular.  En términos de la implementación, el acceso al <em>webservice</em> de GeoNames utiliza su propio API para el cual se descargaron dos archivos: <span
style="font-family: courier new,courier;">geonames-1.0-java5.jar</span> y <span
style="font-family: courier new,courier;">jdom-1.0.jar</span>.</p><p>La georrefernciación no podría ser más fácil.</p><pre lang="java">    public static GeoLocation locate(String location) throws Exception
    {
        GeoLocation result = new GeoLocation();
        // Creates the toponym searcher
        ToponymSearchCriteria searchCriteria = new ToponymSearchCriteria();
        // Sets the criteria based on the specified location
        searchCriteria.setQ(location);
        // Request the geolocalization to the webserver
        ToponymSearchResult searchResult = WebService.search(searchCriteria);
        // Gets the results
        List toponyms = searchResult.getToponyms();
        // Checks if there were results
        if(toponyms == null || toponyms.size() == 0)
            return null;
        // Gets the first result of all (could be many)
        Toponym first = toponyms.get(0);
        // Prepares the result with its information
        result.put("geoNameId",   first.getGeoNameId()   + "");
        result.put("name",        first.getName()        + "");
        result.put("latitude",    first.getLatitude()    + "");
        result.put("longitude",   first.getLongitude()   + "");
        result.put("countryCode", first.getCountryCode() + "");
        result.put("countryName", first.getCountryName() + "");
        return result;
    }</pre><p>La clase <span
style="font-family: courier new,courier;">GeoLocation</span> que utilizo para manejar el resultado no es mas que un <span
style="font-family: courier new,courier;">Hashtable&lt;String, String&gt;</span> con algunos adendos para facilitar su uso.</p><p>Por otro lado, la generación del mapa requiere aún menos ciencia aunque la realizo en dos pasos discretos que en general no incluyen nada extraño.</p><pre lang="java">    public String prepareUrl()
    {
		String markers = "";
		// Walks thru all the points to create its markers
		for(int i=0; i
<points.size(); i++)
		{
			// Reads the points one by one
			GeoLocation point = points.elementAt(i);
			// The markers will be green
			String color = "green";
			// Sets the point location information based on its longitude and latitude
			String pointLocation = point.get("latitude") + "," +
			                       point.get("longitude") + "," +
			                       color +
			                       point.get("name").toLowerCase().charAt(0);
			// Adds it to the markers accumulator
			markers += pointLocation + ((i < points.size() - 1) ? "%7C" : "");
		}
		// Prepares the full URL based on markers information, centered location, size, zoom and API key
		String url = "http://maps.google.com/staticmap?" +
		             "center=" + centerLatitude + "," + centerLongitude + "&#038;" +
		             "markers=" + markers + "&#038;" +
		             "zoom=" + zoomLevel + "&#038;" +
		             "size=" + sizeWidth + "x" + sizeHeight + "&#038;" +
		             "key=" + apiKey;
		// System.out.println(url);
		return url;
    }</pre><p>En el primer paso preparo el URL del consulta al servicio basado en información como la coordenada centro del mapa, el nivel de zoom, el tamaño de la imagen, los puntos seleccionados (marcadores) y la llave del API que debe ser privada y es única para cada sitio web (<a
href="http://en.wikipedia.org/wiki/Fqdn" target="_blank">FQDN</a>), aunque para el caso específico de aplicaciones de escritorio no es muy relevante a pesar de ser obligatoria.  La llave del API puede ser obtenida de manera gratuita por cualquier desarrollador desde esta <a
href="http://code.google.com/apis/maps/signup.html" target="_blank">dirección</a>.</p><pre lang="java">    public Image prepareImage(String url) throws Exception
    {
        Image image = ImageIO.read(new URL(url));
        return image;
    }</pre><p>El segundo paso se relaciona con consultar el servicio de Google utilizando el URL recién generado, leer los bytes que conforman la imagen y crear con ellos un objeto Image para ser mostrado posteriormente en la interfaz de usuario.  Con Java, este procedimiento es extremadamente sencillo: 1 línea de código.</p><p>Para su uso se deberá tener cuidado en el manejo de las posibles excepciones que pueda lanzar el requerimiento como por ejemplo, producto de un fallo de red.</p><pre lang="java">        // Gets the map image
        Image imageMap = mapService.getMap();
        // Checks if was received
        if(imageMap == null)
        {
            JOptionPane.showMessageDialog(this, "El mapa no se pudo recuperar.",
                    "Error recuperando mapa", JOptionPane.ERROR_MESSAGE);
            return;
        }
        // Puts the map on the gui
        map.setIcon(new ImageIcon(imageMap));</pre><p>Teniendo el objeto <span
style="font-family: courier new,courier;">Image</span> lo podemos poner en cualquier componente de AWT/Swing.  Por facilidad, yo utilizo un <span
style="font-family: courier new,courier;">JLabel </span>que incluye el soporte de íconos (<span
style="font-family: courier new,courier;">ImageIcon</span>) los cuales se basan en objetos de imagen.</p><p>Como se puede apreciar, la complejidad de la aplicación es muy baja por lo que reitero: <strong>la imaginación es el límite</strong>.</p><p>Es posible acceder a la aplicación desde web sin instalar ningún archivo local desde el siguiente <a
href="http://demo.jorgeivanmeza.com/Java/DemoGeoReferenceMap/0.1/DemoGeoReferenceMap.jnlp">enlace</a> o ejecutando el siguiente comando en una consola/símbolo del sistema operativo:</p><p><span
style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;$ javaws http://demo.jorgeivanmeza.com/Java/DemoGeoReferenceMap/0.1/DemoGeoReferenceMap.jnlp</span></p><p>Enlace:</p><ul><li><a
href="http://demo.jorgeivanmeza.com/Java/DemoGeoReferenceMap/0.1/DemoGeoReferenceMap_0.1.zip">Código fuente y binario de la aplicación de demostración</a> (incluye librerías de GeoNames requeridas).</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.jorgeivanmeza.com/2008/09/demostracion-de-georreferenciacion-al-estilo-web-20/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
