La Base Topográfica Nacional 1:25000, más conocida como BTN25, es algo así como nuestro mapa de mapas, es la fuente principal de la cartografía MTN25 que forma el mejor y más completo conjunto de datos geográficos vectoriales de España. No voy a entrar en detalle sobre la información pero si tienes curiosidad puedes echarle un vistazo a esta entrada de nuestro blog: La nueva Base Topográfica Nacional BTN25.
El caso es que el ser un conjunto de datos tan completo hace que su distribución y manipulación pueda ser tediosa debido a la ingente cantidad de información que contiene. En este sentido hay que tener en cuenta que:
- La unidad de descarga es un archivo ZIP por cada hoja MTN25
- Contiene hasta 88 capas de información geográfica
En resumen, que el acceso a la BTN25 se hace por hoja MTN25 y que dentro de cada hoja encontraremos muchas capas vectoriales. Si vamos a trabajar dentro de una de esas hojas no hay problemas. Lo complicado viene cuando necesitamos más de una. Por ejemplo, si necesitamos información sobre la CCAA de Aragón nos enfrentamos a 431 de esas hojas.
La descarga de información no es un problema, podemos usar al aplicación java que el IGN facilita y descargar masivamente toda la información que necesitemos. Eso sí, una vez descargada nos enfrentamos a múltiples carpetas, cada una albergando información sobre una hoja.
Esto me ha ocurrido recientemente. ¿Qué hice? Crear un script en PyQGIS para:
- Recorrer la estructura de carpetas
- Filtrar ficheros por nombre y extensión
- Aplicar una función de geoproceso para agrupar la información que me interesaba
#Importación de módulos
import os, fnmatch, processing
path = ‘RutaCarpetaDatos’
#Extensión de los ficheros shapefile
pattern = ‘.shp’
#Patrón para identificar capas. Esto responde al nombre de la capa que queremos agrupar para todas las hojas
info = [‘*CARRETERA*’,‘*AUTO*’]
#Lista de capas que quiero combinar
listShapes = «»
#Variable para controlar si estamos accediendo a la primera hoja
first = 1
#Bucle para recorrer carpetas y listar ficheros
for root, dirs, files in os.walk(path):
for filename in files:
if filename.endswith(pattern):
for i in info:
if fnmatch.fnmatch(filename, i):
if first ==1:
listShapes = str(root+‘\\’+filename)
first += 1
else:
listShapes = listShapes+‘;’+root+‘\\’+filename
#Geoproceso para unir capas
processing.runalg(«qgis:mergevectorlayers»,listShapes,path+‘/roads.shp’)
Espero que este script os sirva para realizar este proceso con mayor facilidad, nos vemos en el siguiente post!
Autor: Marcos Rodrigues.
En primer lugar, felicidades por la herramienta, porque puede ser muy útil para gestionar información de varias hojas cartográficas, no sólo en España si no en diversidad de países.
Tengo un caso parecido con la información del IGN de Colombia, pero no me funciona el script y no sé que estoy haciendo mal.
Quiero obtener y mergear todas las capas de ríos de varias hojas cartográficas. Las hojas se ordenan en carpetas y dentro de cada una hay una carpeta de Hidrografía, que es la que tiene los .shp de los ríos.
El script utilizado queda del siguiente modo:
import os, fnmatch, processing
path = ‘D:DATOS_PARTIDAigntopo’
pattern=’.shp’
info=[‘*hidr_queb_l*’]
listShapes=»»
first=1
for root, dirs, files in os.walk(path):
for filename in files:
if filename.endswith(pattern):
for i in info:
if fnmatch.fnmatch(filename,i):
if first==1:
listShapes=str(root+’\’+filename)
first+=1
else:
listShapes=listShapes+’;’+root+’\’+filename
#Geoproceso para unir capas
processing.runalg(«qgis:mergevectorlayers»,listShapes,path+»roads.shp»)
¿Observas algún error?
Hola Alfonso, gracias por el comentario,
He revisado el código y creo que para que funcione en tu caso habría que hacer una ligera adaptación.
El código tal cual está funciona solo si hay un solo nivel de carpetas en las que buscar la información. En tu caso esto no es así, sino que hay una carpeta intermedia llamada «Hidrografia». Existen dos soluciones, una más elegante y funcional que la otra.
Podemos reciclar una de las funcionalidades de os.walk que permite recorrer de forma recursiva directorios (está es la ideal)
Podemos modificar listShapes=str(root+’\’+filename) por listShapes=str(root+’\Hidrogradia\’+filename)
Esto debería funcionar.
Ya nos cuentas que tal te ha ido.
Un saludo