OpenStreetMap: Taller de desarrollo y administración
Esquema general y fundamentos
Sistema de coordenadas y proyección ● WGS 84 ● SRS (Spherical Mercator) ● En el zoom 0 sólo hay una “tile” de 256x256
En el siguiente zoom... ● Cada “tile” se divide en 4 (/zoom/x/y.png)/zoom/x/y.png
Ejercicio 0 ● ¿Cuantas “tiles” tendría, teóricamente, el zoom 18, que es el máximo de la capa “Mapnik”?
¿Cómo añadir un mapa de OSM a una página web?
Mapa estático ● Función “exportar” de la página principalexportar ● APIs externas: ● Static Maps API Static Maps API ● MapOf MapOf ● StaticMap StaticMap ● MapQuest MapQuest
Ejercicio 1 ● Crea una página web que contenga un mapa estático aproximadamente de la zona de Bilbao de un tamaño de 400 x 400 px
iframe ● Accesible también desde la opción de “exportar” (HTML para pegar) ● Permite añadir un marcador (opciones mlon y mlat)
Usando la API de Google Maps var osmMapType = new google.maps.ImageMapType({ getTileUrl: function(coord, zoom) { return " g/" + zoom + "/" + coord.x + "/" + coord.y + ".png"; }, tileSize: new google.maps.Size(256, 256), isPng: true, alt: "OpenStreetMap layer", name: "OpenStreetMap" });
Ejercicio 2 ● Crea una página web que contenga un mapa deslizante de la zona de Bilbao usando la API de Google Maps
OpenLayers ● Libre y gratuita incluso para uso comercial (licencia BSD) ● Permite mostrar mapas y otros elementos superpuestos ● API profesional y altamente personalizable ● Descargable desde
Código básico function initializeMap() { map = new OpenLayers.Map("map"); map.addLayer( new OpenLayers.Layer.OSM()); map.zoomToMaxExtent(); } […]
Ejercicio 3 ● Mostrar una página web con un mapa deslizante (400 x 300 px) usando OpenLayers
Afinando un poco más (I) // configuramos mapa map = new OpenLayers.Map("map", { controls: [ new OpenLayers.Control.Navigation(), new OpenLayers.Control.PanZoomBar(), new OpenLayers.Control.LayerSwitcher({'ascending':false}), new OpenLayers.Control.Attribution() ], numZoomLevels: 19 }); //anyadimos capas base var mapnik = new OpenLayers.Layer.OSM("Mapnik"); var tilesAtHome = new " map.addLayers([mapnik,
Afinando un poco más (II) // calculamos coordenada var lonLat = new OpenLayers.LonLat( , ).transform( new OpenLayers.Projection("EPSG:4326"), // de WGS84 map.getProjectionObject() // a Mercator Esferico ); var zoom = 16; // anyadimos marcador var markers = new OpenLayers.Layer.Markers("Marcadores"); map.addLayer(markers); markers.addMarker(new OpenLayers.Marker(lonLat)); //centramos mapa map.setCenter(lonLat, zoom);
Ejercicio 4 ● Crear, con OpenLayers, una página web con un marcador en el Guggenheim, de forma que se pueda hacer zoom y arrastrar la imagen, y elegir entre la capa Mapnik y Cycle Map
OSM API / XML
Protocolo ● Está documentado en: ● Cambia según necesidades (el actual data de abril del 2009, y solo añadió características nuevas) ● Es una API REST ● Es una API de edición, no de consulta
Esquema de datos […]
Comunicación con el servidor ● Obtener datos de un área: ● GET /api/0.6/map?bbox=left,bottom,right,top ● Crear un elemento: ● PUT /api/0.6/[node|way|relation]/create ● Leer un elemento: ● GET /api/0.6/[node|way|relation]/#id ● Actualizar un elemento: ● PUT /api/0.6/[node|way|relation]/#id ● Borrar un elemento: ● DELETE /api/0.6/[node|way|relation]/#id
Ejercicio 5 ● Ejecuta JOSM en consola y observa como muestra todas las comunicaciones con el servidor de OSM ● Descarga una región del mapa ● Copia el comando (URL) ejecutado por JOSM y pégalo en un navegador ● Guarda el resultado en disco y ábrelo con un editor de texto
Nominatim
Nominatim ● Es un indexador de nombres, teniendo en cuenta su localización geográfica y administrativa ● Se usa para búsquedas rápidas en la página principal ● Puede testearse en: ● Documentación en: natimhttp://wiki.openstreetmap.org/wiki/Nomi natim
Búsqueda de nombres ● Interfaz REST en formato JSON (o html, o xml) ● Ejemplo: ● q=Bilbao&format=json q=Bilbao&format=json [{"place_id":"151062",[…], "lat":" ", "lon":" ", "display_name":"Bilbao, Vizcaya, España, Europa", "class":"place", "type":"city", […]}, […]]
Búsqueda inversa ● Como la búsqueda normal, pero te devuelve la dirección de un par de coordenadas latitud / longitud ● Ejemplo: ● lat= &lon= &format=json lat= &lon= &format=json {[…], "display_name":"On Federico Moyuaren plaza, Zurbaranbarri, Bilbao, Vizcaya, 48011, España", […]}
Ejercicio 6 ● Crear un mapa desplazable con OpenLayers que incluya un cuadro de diálogo que permita la búsqueda de nombres y los muestre en el mapa
Overpass API / XAPI
Uso ● Es una API de consulta (sólo lectura) ● Esta desfasada unos días respecto a la base de datos principal ● Tiene más opciones y permite consultas más potentes que la API de edición ● Permite filtrar por bbox y/o por etiquetas
Ejemplos ● Todas los generadores nucleares del mundo: [power=generator][generator:source=nuclear] [power=generator][generator:source=nuclear] ● Escuelas de (aproximadamente) Madrid: [bbox=-3.845,40.321,-3.584,40.526][amenity=school] [bbox=-3.845,40.321,-3.584,40.526][amenity=school]
Ejercicio 7 ● Descárgate un mapa OSM de los parques de Donostia ● Encuentra una manera de obtener todos los molinos de viento del mundo
PostGIS
Instalación y uso básico $ sudo aptitude install postgresql-9.1 postgresql-9.1- postgis $ sudo -u postgres sh > createuser -DRS jynus > createdb -O jynus openstreetmap $ psql openstreetmap
Dumps ● Descargables desde planet.osm.org, o cualquiera de sus mirrors (incluyen extractos o conversiones) ● Geofabrik Geofabrik ● Cloudmade Cloudmade ● Se generan semanalmente, pero existen diffs semanales, diarios y de minutos ● Actualmente ocupa 18 GB comprimido con bzip2
osmosis ● Es la herramienta “oficial” para serializar y deserializar la base de datos en y desde XML ● Es un programa de línea de comandos java ● Mantiene la estructura tal y como en la original BBDD, con la posibilidad de importar/exportar o no el histórico
Instalación y uso ● Descarga de: build/osmosis-latest.zip build/osmosis-latest.zip ● Ejemplo de uso (importación a una base de datos para la API): $ osmosis --read-xml file="planet.osm" --write-apidb host="x" database="openstreetmap" user="x" password="x" ● Más detalles:
osm2pgsql ● Permite generar una estructura optimizada para el renderizado ● Es “con pérdida” (no apta para routing u otras aplicaciones) ● Instalación $ sudo aptitude -t unstable install osm2pgsql
Ejercicio 8 ● Descarga un mapa de la zona de Bilbao ● Impórtalo a una base de datos PostgreSQL, manteniendo el esquema original de la base de datos ● Obtén cuantas calles comienzan por la letra “Z” y lístalas ordenadas alfabéticamente
“The Rails port” ● Es el software que da soporte a la interfaz web en openstreetmap.org (gestión de usuario, trazas, diarios, slippy map, visualización de los datos y conjuntos de cambios, etc.) ● Está programada en Ruby on Rails y se apoya en la base de datos Postgres
Renderizadores
Osmarender (I)
Osmarender (II) ● Fue el primer renderizador que se usó ● Permite el rendering mediante (distribuido en red) ● Inicialmente era un conversor a SVG que se renderizaba con Inkscape ● Suele dibujar más características que Mapnik
Mapnik (I)
● Era (y sigue siendo) un proyecto aparte de renderizado de mapas de alta calidad con software libre ● El renderizado se hace en OSM a partir de la base de datos completa, aunque permite hacerlo directamente desde un.osm ● El aspecto es configurable mediante hojas de estilo
Preparación para el renderizado $ wget /export/osm2pgsql/ sql?format=raw -O sql $ psql -d gis -f./ sql $ sudo /etc/init.d/postgresql restart $ wget latest.osm.bz2 $ mkdir world_boundaries && cd world_boundaries $ wget htt://tile.openstreetmap.org/world_boundaries- spherical.tgz $ wget $ wget htt://tile.openstreetmap.org/shoreline_300.tar.bz2 $ wget ta.com/download/10m/cultural/10m-populated-places.zip $ wget ta.com/download/110m/cultural/110m-admin-0-boundary- lines.zip $ osm2pgsql -m -d gis planet-latest.osm.bz2
Renderizado con Mapnik $./generate_xml.py --host localhost --user jynus --dbname openstreetmap --symbols./symbols/ --world_boundaries./world_boundaries/ --port password '' $ MAPNIK_MAP_FILE="osm.xml" MAPNIK_TILE_DIR="tiles/"./generate_tiles.py
mod_tile ● Es un módulo de Apache que permite renderizar “al vuelo” las teselas ● Sólo están pre-renderizados los zooms más bajos, los otros se crean o actualizan bajo demanda
Ejercicio 9 ● Descarga un archivo.osm de la zona de Bilbao ● Descarga e instala el software Mapnik y todas sus dependencias ● Renderiza los datos descargados, pero cambia las autopistas para que aparezcan de color rojo con los bordes verdes ● Muéstralo las teselas generadas en un mapa deslizante