• Saltar a la navegación principal
  • Saltar al contenido principal
  • Saltar al pie de página
logo web Geoinnova

Geoinnova

Consultoría y Formación en SIG y Medio Ambiente

  • Geoinnova
    • Equipo
    • Coworking
    • Asociación
    • Alianzas Estratégicas
    • Visor de proyectos Geoinnova
  • SIG y Desarrollo
    • Plugins
    • QElectricGIS
    • Planero Web
  • Consultoría Territorial
    • Planes de Emergencia Municipales de Protección Civil
    • Planes Urbanos de Actuación Municipal – PUAM
    • Minimización del impacto territorial en suelo no urbanizable (Plan Especial)
    • Turismo sostenible
  • Consultoría Ambiental
    • Evaluación ambiental
      • Estudios ambientales para proyectos de energías renovables
      • Estudios de Impacto e Integración Paisajística
      • Evaluación Ambiental Estratégica de planes y programas
      • Estudio de Impacto Ambiental para proyectos
      • Educación Ambiental
    • Consultoría de Sostenibilidad ESG
      • Elaboración de Memorias de Sostenibilidad – RSC
      • Planes estratégicos de Sostenibilidad – Hoja de Ruta
      • Análisis del Ciclo de Vida del producto – ACV
      • Cálculo huella de carbono
      • Economía circular
  • Formación
    • Todos los cursos
    • Máster y Diplomas
    • Cursos de ArcGIS
    • Cursos de QGIS
    • Cursos de Teledetección
    • Cursos de Giswater
    • Cursos de Medioambiente
  • Divulgación
    • Blog
    • Tertulia Territorio Geoinnova
    • Noticias
    • Webinars
    • Geolibrería
  • Contacto
    • Soporte de Clientes – Tickets
SIG

Descargar tiles de OpenStreetMap con Python para su uso offline

30/01/2019 Deja un comentario

El teléfono móvil es uno de los dispositivos desde donde más se utilizan los mapas web por medio de conexión a una red de internet. Pero por suerte o desgracia las redes de telefonía no cubren el mundo entero. Los mapas como OpenStreetMap, tienen buena información de muchas zonas rurales y espacios naturales, senderos, pistas de tierra… Descargando los tiles desde un servidor, esas imágenes de 256*256 pixeles que forman los mapas online, y colocándolos en nuestro móvil, podemos usar esos mapas sin que tengamos cobertura. Para ello necesitaremos una aplicación que nos lea esos tiles en el móvil. La aplicación osmodroid por ejemplo.

Descarga del script de Python de Github

Para descargar los tiles usamos un script de Python de Tony Rewin ubicado en GitHub.

Debemos primero agradecer que Tony haya publicado el código y modificar ligeramente el script para hacerlo más versátil . Así queda nuestro script después de alguna pequeña modificación:

#!/usr/bin/python
from sys import argv
import os
import math
import urllib.request
import random
import os.path
import time
def deg2num(lat_deg, lon_deg, zoom):
    lat_rad = math.radians(float(lat_deg))
    n = 2.0 ** zoom
    xtile = int((float(lon_deg) + 180.0) / 360.0 * n)
    ytile = int((1.0 - math.log(float(math.tan(lat_rad) + 1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
    return xtile, ytile
def download_url(zoom, xtile, ytile):
    # Switch between otile1 - otile4
    #subdomain = random.randint(1, 4)
    url = "https://a.tile.openstreetmap.org/%d/%d/%d.png" % (zoom, xtile, ytile)
    dir_path = "tiles/%d/%d/" % (zoom, xtile)
    download_path = "tiles/%d/%d/%d.png" % (zoom, xtile, ytile)
    if not os.path.exists(dir_path):
        os.makedirs(dir_path)
    if (not os.path.isfile(download_path)):
        print ("downloading %r" % url)
        source = urllib.request.urlopen(url)
        content = source.read()
        source.close()
        destination = open(download_path,'wb')
        destination.write(content)
        destination.close()
    else: print ("skipped %r" % url)

def usage():
    print ("Usage: ")
    print ("osm_tiles_downloader <lat> <lon>")
def main(argv):
    try:
        script, latW, lonW, latE, lonE = argv
    except:
        usage()
        exit(2)
    maxzoom = 15 # redefine me if need so

    # from 0 to 6 download all
    for zoom in range(0,7,1):
        for x in range(0,2**zoom,1):
            for y in range(0,2**zoom,1):
                download_url(zoom, x, y)
    # from 7 to 15 ranges
    for zoom in range(7, int(maxzoom + 1), 1):
        xtile, ytile = deg2num(latW, lonW, zoom)
        print (xtile)
        final_xtile, final_ytile = deg2num(latE, lonE, zoom)
        print ("%d:%d-%d/%d-%d" % (zoom, xtile, final_xtile, ytile, final_ytile))
        for x in range(xtile, final_xtile + 1, 1):b
            print ("%d" % x)
            for y in range(ytile, final_ytile +1, 1):
                result = download_url(zoom, x, y)

main(argv)

Modificaciones del script para descargar las Tiles

Hemos adaptado el script de Tony Rewin a Python 3. Modificamos la manera en que importamos el módulo urllib2 que nos permite acceder a direcciones url, en la línea 6 de su código. También hay que incluir entre paréntesis el texto de la función print.

En esta página de OpenStreetMap explican detalladamente el funcionamiento de los mapas web y el almacenamiento de los tiles. La función deg2num que nos convierte los grados decimales a coordenadas de ubicación del tile está en esta página.

Otra modificación que hemos hecho al script original es la manera de determinar el área a descargar.

En el código original de GitHub, línea 59, vemos cómo hace el script para ubicar el área. El script sólo nos pide un par de coordenadas, línea 44 del código original. A esas coordenadas le resta y suma 0.1 grados decimales a la longitud y le resta y suma 0.05 a la latitud. En nuestro script indicamos el área con unas coordenadas NW y SE de un área concreta. En esta web podemos fácilmente determinar las coordenadas de un área.

En la línea 45 de nuestro código definimos las variables: latW, lonW, latE, lonE. Estas coordenadas en grados decimales son las que determinarán el área a descargar.

El script descarga todos los tiles desde el zoom 0 al 6. A partir del zoom 7 descarga solamente los del área seleccionada y hasta el zoom que le indiquemos. El zoom 0 es un tile de 256 x256 px en el que entra el mundo entero. El tile ../0/0/0.png de OSM es este:

OSM con Python Tiles

A partir de ahí, cada nivel de zoom dobla el número de tiles tanto en horizontal como en vertical. El número de tiles para cada zoom será:

número de tiles = 2 2xZoom

Todos los tiles de un nivel de zoom determinado se almacenan en la misma carpeta. Dentro de esta carpeta todos los tiles con la misma x se almacenan en la misma carpeta. Así, el tile ../4/3/9.png estará guardado en la carpeta 3 del zoom 4.

En esta página de maptiler se puede jugar con la ubicación y las coordenadas de los tiles y entender un poco mejor cómo funciona un mapa web.

Los mapas web usan la proyección Web Mercator. Se extendió su uso cuando Google Maps la adoptó in 2005. El sistema de coordenadas es el WGS84. La controversia con la proyección Web Mercator es debido a que asume la forma esférica y no la elipsoidal como el sistema se coordenadas WGS84.

La función download_url nos crea la estructura de carpetas donde irán ubicados los tiles según se vayan descargado.

El loop for zoom in range nos origina las url a descargar según los valores las coordenadas de nuestras variables. Le indicamos el nivel de zoom máximo que deseamos. A nivel 15 aparecen claramente visibles las pistas y caminos simbolizadas en OSM. Cada nivel cuadruplica en peso al anterior. Así que con un nivel 16 cuadruplicaríamos los datos a cargar en el móvil.

Tomando como muestra una zona como la de Bardenas Reales en Navarra el comando a ejecutar en la consola de Windows quedaría así:

python downloadOSMtiles.py 42.357339 -1.721082 41.958277 -1.276331

El script nos creará la estructura de carpetas organizadas por nivel de zoom en el directorio donde esté ubicado el script.

Y con mbutil podemos convertir los tiles que hemos generado a un único archivo .mbtile pero eso ya es otra historia.

Aprende con Geoinnova

Si quieres extender tus conocimientos de programación GIS en entornos web y diferenciarte profesionalmente, pégale un vistazo a nuestro Curso de Aplicaciones Web Mapping con GDAL, Geoserver y Leaflet, donde profesionales con gran experiencia en desarrollo te guiarán en el proceso de aprendizaje y de aplicación de las herramientas más conocidas en web mapping.

Autor: Gonzalo Echeverría

Etiquetas: web mapping

Apúntate a nuestra newsletter semanal

"*" señala los campos obligatorios

Consentimiento*
Este campo es un campo de validación y debe quedar sin cambios.

Información legal

Cumplimos el RGPD (Reglamenteo General de Protección de Datos) y esta en la primera información que debes saber. Responsable: Asociación Geoinnova. Finalidad: Apuntarte en nuestra base de datos para poder enviarte nuestra newsletter y cualquier otra información de interes. Legitimidad: Nos das tu consentimiento para comunicarnos contigo. Derechos: Tienes derecho a acceder, rectificar, limitar y suprimir tus datos. Para una información más ampliada entra a nuestra política de privacidad.

Artículos relacionados

100 herramientas y recursos SIG aplicados al medio ambiente
29/03/2022
Integración de Terre3 con OL6
Como integrar la API 3D TR3.js sobre OpenLayers 6
14/12/2020
Visor NATURALMENTE BENAMAHOMA
Trabajo Fin de Máster TGIS de Geoinnova: Visor web ayuntamiento de Grazalema
11/11/2020

Asociación Geoinnova

La Asociación Geoinnova fue creada en 2009 por profesionales del medio ambiente y del territorio. Tiene como objetivos principales desarrollar su actividad en los ámbitos de la Formación en SIG y Medio Ambiente, así como en la Consultoría de proyectos ligados al Urbanismo, Ordenación del Territorio, Medio Ambiente y Sistemas de Información Geográfica.

Interacciones con los lectores

¿Quieres comentarnos algo? Adelante! Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Footer

Menú Legal

  • Aviso Legal
  • Política de privacidad
  • Política de cookies
  • Términos y condiciones

Otras páginas de interes

  • Promociones y descuentos en formación
  • Formación bonificada FUNDAE
  • Verificador y descarga de Certificados de aprovechamiento

Contacto

Calle Luis Morondo Urra nº 8 Bajo A
31006 Pamplona (Navarra)
info@geoinnova.org
+34 948 117 137

Horario de atención

Lunes a Viernes - 09:00 a 14:00 y de 16:00 a 19:00.
Fines de semana y Festivos - Exclusivamente por mail.
Horario de Verano (01 de julio al 30 de agosto): De lunes a viernes de 8 a 15h.

Síguenos en Redes Sociales

Apúntate a nuestra newsletter

"*" señala los campos obligatorios

Consentimiento*
Este campo es un campo de validación y debe quedar sin cambios.

Entidad adherida a Confianza Online Certificado de inscripción en el Registro de huella de carbono, compensación y proyectos de absorción Logo Plazox

© 2023 · Desarrollada por Geoinnova en colaboración con OikosMSP

Gestionar el Consentimiento de las Cookies
Utilizamos tecnologías como las cookies para almacenar y/o acceder a la información del dispositivo. Lo hacemos para mejorar la experiencia de navegación y para mostrar anuncios personalizados. El consentimiento a estas tecnologías nos permitirá procesar datos como el comportamiento de navegación o las identificaciones únicas en este sitio. No consentir o retirar el consentimiento, puede afectar negativamente a ciertas características y funciones.
Funcional Siempre activo
El almacenamiento o acceso técnico es estrictamente necesario para el propósito legítimo de permitir el uso de un servicio específico explícitamente solicitado por el abonado o usuario, o con el único propósito de llevar a cabo la transmisión de una comunicación a través de una red de comunicaciones electrónicas.
Preferencias
El almacenamiento o acceso técnico es necesario para la finalidad legítima de almacenar preferencias no solicitadas por el abonado o usuario.
Estadísticas
El almacenamiento o acceso técnico que es utilizado exclusivamente con fines estadísticos. El almacenamiento o acceso técnico que es utilizado exclusivamente con fines estadísticos anónimos. Sin una requerimiento, el cumplimiento voluntario por parte de su proveedor de servicios de Internet, o los registros adicionales de un tercero, la información almacenada o recuperada sólo para este propósito no se puede utilizar para identificarlo.
Marketing
El almacenamiento o acceso técnico es necesario para crear perfiles de usuario para enviar publicidad, o para rastrear al usuario en un sitio web o en varios sitios web con fines de marketing similares.
Administrar opciones Gestionar los servicios Gestionar {vendor_count} proveedores Leer más sobre estos propósitos
Preferencias
{title} {title} {title}