3ENGINE

Programación y otros cachivaches

Etiqueta: programacion

Página 3/21

Tecnologia

Cómo crear un mapa con Leaflet y GeoJSON


Leaflet es una libreria de JavaScript de código abierto que permite construir aplicaciones de mapas web. Soporta HTML5, CSS3 y la mayoría de las plataformas móviles y de escritorio. Existen otras librerías, como OpenLayers o la API de Google Maps, pero Leaflet tiene la ventaja de ser muy compacta (carga rápido) y no requiere de conocimientos profundos de GIS.

leafleft

GeoJSON se encuentra dentro del grupo de los formatos de intercambio de datos geoespaciales mas extendidos. GeoJSON se basa en JSON. Permite la codificación de colecciones de estructuras de datos geográficos. Un objeto GeoJSON puede representar una geometría, una característica, o una colección de características. GeoJSON soporta los siguientes objetos geométricos: Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon, GeometryCollection, Feature, FeatureCollection.

geojson

Obtener los datos GeoJSON para la demo

Podemos crear nuestro propio geojson mediante la herramienta online geojson.io, pero para nuestra demo obtendremos los datos de ejemplo de algunos de los lugares que siguiendo la inicitiva Open Data, ofrecen datos públicos de forma libre para todo el mundo, sin restricciones de derechos de autor, de patentes o de otros mecanismos de control. Por ejemplo, descargamos los municipios de la isla de La Palma. Lo abrimos:

{
"type": "FeatureCollection",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [{
"type": "Feature",
"properties": {
"OBJECTID": 1,
"SUPERFICIE": 135741394.267612,
"PERIMETRO": 66918.002370,
"ID": 1,
"MUNICIPIO": "EL PASO",
"CODIGO": 38027,
[...]
},
"geometry": {
"type": "Polygon",
"coordinates": [[
[-17.884219, 28.616156], 
[-17.884263, 28.616166], 
[-17.884306, 28.616177],
[...]

«crs» indica el sistema de coordenadas de referencia utilizado. Usa WGS 84 como sistema de coordenadas, que es ampliamente utilizado por Google Maps, OpenStreetMaps, etc. «features» es una colección de características. Cada característica se compone de una colección de propiedades y una geometría, en este caso, un polígono.

Opcionalmente, para validar el GeoJson podemos utilizar por ejemplo geojsonlint. Esta herramienta online carga los datos en un mapa y valida que sean correctos.

Cómo crear un mapa con Leafleft y GeoJSON

Visualizar el contenido en un mapa con Leaflet

La manera mas sencilla de que Leaflet reconozca nuestros datos es convertirlos a código javascript. Aprovechando que JSON es compatible con javascript, esto es tan sencillo como editar el fichero, hacer que los datos GeoJSON estén asociados a una variable municipios y guardar el fichero con extensión .js:

var municipios = {
"type": "FeatureCollection",
[...]

El código es el siguiente, mas abajo comento el código:

<!DOCTYPE html>
<html>
<head>
<title>Municipios de La Palma</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css"/>
</head>
<body>
<div id="map" style="width: 600px; height: 400px"></div>
<script src="demo.js" type="text/javascript"></script>
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
<script>
var map = L.map('map').setView([28.68, -17.85], 10);

L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
   maxZoom: 18,
   attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, '+
   '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, '+
   'Imagery © <a href="http://cloudmade.com">CloudMade</a>',
   id: 'mapbox.light'
}).addTo(map);

function onEachFeature(feature, layer) {
  if (feature.properties && feature.properties.MUNICIPIO) {
     var popupContent = "<p>Municipio: " + feature.properties.MUNICIPIO + "</p>";
     layer.bindPopup(popupContent);
  };
};

function style(feature) {
   return {
     weight: 2,
     opacity: 1,
     color: 'white',
     dashArray: '3',
     fillOpacity: 0.7,
     fillColor: '#FEB24C'
   };
};

L.geoJson(municipios, {
   style: style,
   onEachFeature: onEachFeature
}).addTo(map);

</script>
</body>
</html>

  • Línea 11: aquí referenciamos al geojson con los municipios.
  • Línea 14: map es la clase principal de Leafleft. Indicamos las coordenadas iniciales y el nivel de zoom por defecto.
  • Línea 16: añadimos una capa (layer) con el mapa. En este caso usamos las imágenes (tiles) de OpenStreetMap (OSM). Además especificamos el nivel máximo de zoom. Existen otros servidores de mapas de OSM, hay una lista de ellos en la Wiki de OSM o utiliza un comparador de mapas como map compare service de bbbike.org
  • Línea 24: función que muestra un popup con el nombre del municipio.
  • Línea 31: función con el estilo de cada uno de los features de la capa GeoJSON.
  • Línea 42: aquí creamos una capa de tipo GeoJSON, donde le pasamos la variable con los datos, le indicamos el estilo y le pasamos la función a llamar cuando el ratón haga click en una feature.

Y así quedaría el resultado:

Cómo crear un mapa con Leaflet y GeoJSON

Leer directamente GeoJSON con jQuery

En el anterior ejemplo hemos convertido el GeoJSON en código javascript. Pero dependiendo de nuestras necesidades, a veces esto no es posible y necesitaremos leer directamente el fichero en formato GeoJSON. Para hacer esto haremos uso de jQuery. El código es el siguiente, mas abajo comento el código:

<!DOCTYPE html>
<html>
<head>
<title>Municipios de La Palma</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css"/>
</head>
<body>
<div id="map" style="width: 600px; height: 400px"></div>
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script>
var map = L.map('map').setView([28.68, -17.85], 10);

L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
   maxZoom: 18,
   attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, '+
   '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, '+
   'Imagery © <a href="http://cloudmade.com">CloudMade</a>',
   id: 'mapbox.light'
}).addTo(map);

function onEachFeature(feature, layer) {
  if (feature.properties && feature.properties.MUNICIPIO) {
     var popupContent = "<p>Municipio: " + feature.properties.MUNICIPIO + "</p>";
     layer.bindPopup(popupContent);
  };
};

function style(feature) {
   return {
     weight: 2,
     opacity: 1,
     color: 'white',
     dashArray: '3',
     fillOpacity: 0.7,
     fillColor: '#FEB24C'
   };
};

$.getJSON("demo.json", function(data){
   L.geoJson(data, {
      style: style,
      onEachFeature: onEachFeature
   }).addTo(map);
});

</script>
</body>
</html>

  • Línea 12: aquí referenciamos a la libreria jQuery.
  • Línea 42: esta función lee el GeoJson, y despues, como el ejemplo anterior, creamos una capa de tipo GeoJSON, donde le pasamos la variable con los datos, le indicamos el estilo y le pasamos la función a llamar cuando el ratón haga click en una feature.



Tecnologia

Opciones del plugin XML Tools para Notepad++


En una entrada anterior expliqué cómo instalar XML Tools para Notepad++ si daba algún problema. En este artículo me gustaría comentar brevemente las opciones del plugin XML Tools que ofrece este interesante plugin:

xml_menu

  • Enable XML syntax auto-check: cada vez que se salva el documento comprueba si se trata de un XML válido

xml_auto_check

  • Check XML syntax now: comprobar la sintaxis ahora
  • Enable auto-validation: cada vez que se salva el documento comprueba si el XML es compatible con el documento de esquema asociado (XSD), previamente comprueba si es un XML válido (Check XML syntax). Si el XML no hace referencia a un documento XSD abre un cuadro de diálogo para seleccionar uno:

xml_auto_validation

  • Validate now: validar compatibilidad ahora.
  • Tag auto-close : al activarlo, al añadir un tag al documento, añade automaticamente el tag de cierre.
  • Pretty Print … : formatea el XML para su facil lectura.
  • Linarize XML : formatea el XML en un única línea.
  • Current XML Path: informa del Path actual donde está situado el cursor.

xml_path

  • Evaluate Path expression: XPath es un lenguaje que permite construir expresiones que recorren y procesan un documento XML. Abre una ventana que permite evaluar expresiones sobre el documento actual:

xml_path_expr

  • XSL Transformation: XSLT es un lenguaje de programación declarativo que permite generar documentos a partir de documentos XML. Abre una ventana que permite aplicar una tranformación sobre el documento actual. De modo que si por ejemplo tengo este XML:
    <?xml version="1.0" encoding="UTF-8"?>
    <arboles>
    <arbol id="1">naranjo</arbol>
    <arbol id="2">limonero</arbol>
    </arboles>

    Y tengo un XSLT como este:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:template match='/'>
        <html>
            <xsl:apply-templates />
        </html>
      </xsl:template>
      <xsl:template match="arbol">
    <p><xsl:value-of select="@id"/>.<xsl:value-of select="."/></p>
      </xsl:template>
    </xsl:stylesheet>

    El resultado será:

    <html>
    <p>1.naranjo</p>
    <p>2.limonero</p>
    </html>
  • Convert selection XML to text / Convert selection text to XML : convierte un XML para hacerlo HTML compatible y viceversa.



Tecnologia

Colección de temas para el IDLE de Python


La verdad es que IDLE de Python es fantastico, pero el esquema de color que trae por defecto es un poco soso. Para facilitaros un poco la vida os dejo en descarga el fichero de configuración con una colección de temas para el IDLE recopilados por Google. Los temas que contiene son los siguientes:

  • Tango
  • Desert
  • Obsidiana
  • Solarized Dark
  • Solarized Light
  • Black
  • CodeIt
  • Codecademy UI
  • UbuntuLike

Sigue estos pasos para añadir los temas para el IDLE de Python:

  1. Cierra el IDLE de Python
  2. Descarga y descomprime config-highlight.cfg
  3. Buscar la carpeta /.idlerc y pega allí el fichero. Normalmente en Linux esta carpeta se encuentra en el directorio Home, mientras que en Windows es posible que se encuentre en la carpeta de configuración de usuario. Prueba a escribir la orden cd /D %userprofile%\.idlerc
  4. Abre de nuevo el IDLE de Python
  5. Vete a la pestaña highlight de la opción de menu Options > Configure IDLE y selecciona uno de los temas

temas para el IDLE de Python

6. Si seleccionastes el tema Obsidiana ahora tu IDLE debería parecerse a esto:

temas para el IDLE de Python




Tecnologia

Cómo mostrar un cuadro de dialogo para abrir un archivo en Microsoft Access


La versión de Microsoft Office Access 2003 y posteriores implementan el método FileDialog para mostrar un cuadro de dialogo para abrir un archivo en Microsoft Access.

Para poder hacer uso del método es importante referenciar a la Biblioteca de objetos de Microsoft Office XX.0, donde XX es el nombre de la versión interna instalada en tu PC de Office. Office11 es el nombre interno de Office 2003, Office12 de Office 2007 y Office14 para Office 2010 (Microsoft se saltó la version 13, simplemente porque el 13 es un número de mala suerte):

mostrar un cuadro de dialogo para abrir un archivo en Microsoft Access

Existen cuatro tipos de diálogos aunque no todos están soportados por Microsoft Access:

  • 1: msoFileDialogOpen (ppen dialog box)
  • 2: msoFileDialogSaveAs (save As dialog box)
  • 3: msoFileDialogFilePicker (picker dialog box)
  • 4: msoFileDialogFolderPicker (folder picker dialog box)

Ejemplo de código para seleccionar un archivo EXCEL:

  
  Dim OpenDialog As Object
  Set OpenDialog = Application.FileDialog(3) ' = msoFileDialogFilePicker (picker dialog box)
  OpenDialog.AllowMultiSelect = False
  OpenDialog.Title = "Seleccioni un document EXCEL..."
  OpenDialog.Filters.Clear
  OpenDialog.Filters.Add "EXCEL Files", "*.xlsm;*.xls;*.xlsx"
  OpenDialog.Filters.Add "All Files", "*.*"
  OpenDialog.Show

  MsgBox "Numero de archivos seleccionados: " & OpenDialog.SelectedItems.Count
  MsgBox OpenDialog.SelectedItems(1)

Ejemplo de código para seleccionar varios archivos EXCEL:

 
  Dim OpenDialog As Object
  Set OpenDialog = Application.FileDialog(3) ' = msoFileDialogFilePicker (picker dialog box)
  OpenDialog.AllowMultiSelect = True
  OpenDialog.Title = "Seleccioni un document EXCEL..."
  OpenDialog.Filters.Clear
  OpenDialog.Filters.Add "EXCEL Files", "*.xlsm;*.xls;*.xlsx"
  OpenDialog.Filters.Add "All Files", "*.*"
  OpenDialog.Show

  MsgBox "Numero de archivos seleccionados: " & OpenDialog.SelectedItems.Count
  For Each SelectedItem In OpenDialog.SelectedItems
        MsgBox SelectedItem
  Next