Ir al contenido

Wikiproyecto:La Rioja/mapa municipal/obtener mapa

De Wikipedia, la enciclopedia libre
Resultado de ejecutar mapaMunicipios.py 'EsMunicipio="SI" AND Comarca="Haro"' con versión de script 0.3
Imagen generada con mapaMunicipios.py --all con versión de script 0.5 y subida mediante bot

Este script hecho en python permite obtener mapas de La Rioja basándose en un fichero svg de dicha comunidad autónoma y mediante los datos recopilados en un fichero csv con los municipios que cumplan la condición pasada como parámetro coloreados.

El script funciona en Debian y Ubuntu con solo instalar el paquete "python-pysqlite2" para ejecutarlo en windows ver forma de instalación

Forma de uso

[editar]

Ésta es la forma más simple de usar el script, en el parámetro query puede indicarse la consulta deseada usando los campos de la tabla que se crea en el método prepararTablas, el resultado será un fichero llamado mapa.svg en el directorio donde se ejecute el script:

  • ./mapaMunicipios.py --query='Comarca="Arnedo"'

Parámetros opcionales

[editar]
  • --sourcemap: Con el fin de poder colorear municipios con diferentes colores se ha añadido este parámetro que permite basarse en un mapa local en vez de descargarlo de wikipedia
  • --resultmap: Nombre del fichero resultado de la ejecución del script
  • --nodownloaddata: Para ganar en agilidad, si ya tenemos descargado el fichero de datos municipales esta opción permite ejecutar el script usando el que esté en la carpeta local en vez de bajarlo de wikipedia.
  • --color: Permite indicar el color con el que se colorearán los municipios que cumplan la consulta. Pueden indicarse los colores típicos de html o el valor hexadecimal del color deseado. Si no se indica el parámetro se usará el degradado por defecto.

Ejemplo: Estas instrucciones prepararán el mapa de las diferentes Comarcas coloreadas cada una de forma diferente

./mapaMunicipios.py --query='Comarca="Calahorra"' --color="Red"  --resultmap="mapa.svg"
./mapaMunicipios.py --nodownloaddata --query='EsMunicipio="SI" AND Comarca="Haro"' --color="Green" --sourcemap="mapa.svg" --resultmap="mapa.svg"
./mapaMunicipios.py --nodownloaddata --query='EsMunicipio="SI" AND Comarca="Logroño"' --color="Blue" --sourcemap="mapa.svg" --resultmap="mapa.svg"
./mapaMunicipios.py --nodownloaddata --query='EsMunicipio="SI" AND Comarca="Nájera"' --color="Yellow" --sourcemap="mapa.svg" --resultmap="mapa.svg"
./mapaMunicipios.py --nodownloaddata --query='EsMunicipio="SI" AND Comarca="Ezcaray"' --color="Olive" --sourcemap="mapa.svg" --resultmap="mapa.svg"
./mapaMunicipios.py --nodownloaddata --query='EsMunicipio="SI" AND Comarca="Santo Domingo de la Calzada"' --color="Brown" --sourcemap="mapa.svg" --resultmap="mapa.svg"
./mapaMunicipios.py --nodownloaddata --query='EsMunicipio="SI" AND Comarca="Anguiano"' --color="Magenta" --sourcemap="mapa.svg" --resultmap="mapa.svg"
./mapaMunicipios.py --nodownloaddata --query='EsMunicipio="SI" AND Comarca="Cameros"' --color="Lime" --sourcemap="mapa.svg" --resultmap="mapa.svg"
./mapaMunicipios.py --nodownloaddata --query='EsMunicipio="SI" AND Comarca="Cervera"' --color="Orange" --sourcemap="mapa.svg" --resultmap="mapa.svg"
./mapaMunicipios.py --nodownloaddata --query='EsMunicipio="SI" AND Comarca="Arnedo"' --color="Purple" --sourcemap="mapa.svg" --resultmap="mapa.svg"

También se puede llamar al script con el parámetro --all que preparará en una carpeta llamada mapas un mapa por cada municipio y un fichero llamado files.txt para poder subir la carpeta de mapas automáticamente a commons con el script commons file upload service.

  • ./mapaMunicipios.py --all

Nota: Para poder utilizar el script perl y que suba las imágenes con la codicación adecuada hay que cambiar las líneas "$eckey=encode('utf8',$key);" por "$eckey=$key;" y "wpUploadDescription=>encode('utf8',$file{$key})," por "wpUploadDescription=>$file{$key},"



Para más información ver discusión



#! /usr/bin/env python
# -*- coding: utf-8 -*-

#ATENCIÓN!! Para la ejecución de este script es necesario el paquete python-pysqlite2 que se encuentra en 
# repositorios debian y ubuntu. Ha sido probado solo en Linux.

# crearMapas.py: Crea mapas de La Rioja coloreando los municipios que cumplan la condición pasada como parámetro.
# versión:    0.6.1
# autor:      BigSus
# fecha:      17 sep 2006
# Este script viene sin ningún tipo de garantías
# 
#    Copyright (C) 2006 BigSus
# 
#     This program is free software; you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation; either version 2 of the License, or
#     (at your option) any later version.
# 
#     This program is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
# 
#     You should have received a copy of the GNU General Public License
#     along with this program; if not, write to the Free Software
#     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

import os
import codecs
import sys
import datetime
import getopt

from pysqlite2 import dbapi2 as sqlite

ver="v0.6.1"
version="Creador de Mapas " + ver + " by BigSus"
info="Crea mapas de La Rioja (España) coloreando los municipios que cumplan la condición pasada como parámetro."

def prepararTablas():
	cursor = con.cursor()
	#Creación de tabla municipios
        cursor.execute('CREATE TABLE municipios (id INTEGER PRIMARY KEY, EsMunicipio VARCHAR(2), Población VARCHAR(50), Municipio VARCHAR(50), PartidoJudicial VARCHAR(50), ZonaSalud VARCHAR(50), Comarca VARCHAR(50), Región VARCHAR(50), Gentilicio VARCHAR(50), Fundación VARCHAR(50), Patrón VARCHAR(75), Superficie VARCHAR(10), NucleosPoblación INTEGER, AldeasDeMunicipio VARCHAR(150), Latitud VARCHAR(15), Longitud VARCHAR(15), Altitud INTEGER, CodigoPostal VARCHAR(50), DistanciaALogroño INTEGER, DistanciaACabecera INTEGER, Alcalde VARCHAR(70), Partido VARCHAR(50), Hermanado VARCHAR(100), Web VARCHAR(50), Poblac1900 INTEGER, Poblac1910 INTEGER, Poblac1920 INTEGER, Poblac1930 INTEGER, Poblac1940 INTEGER, Poblac1950 INTEGER, Poblac1960 INTEGER, Poblac1970 INTEGER, Poblac1981 INTEGER, PobOLD1991 INTEGER, Poblac1986 INTEGER, Poblac1987 INTEGER, Poblac1988 INTEGER, Poblac1989 INTEGER, Poblac1990 INTEGER, Poblac1991 INTEGER, Poblac1992 INTEGER, Poblac1993 INTEGER, Poblac1994 INTEGER, Poblac1995 INTEGER, Poblac1996 INTEGER, Poblac1998 INTEGER, Poblac1999 INTEGER, Poblac2000 INTEGER, Poblac2001 INTEGER, Poblac2002 INTEGER, Poblac2003 INTEGER, Poblac2004 INTEGER, Poblac2005 INTEGER, Densidad2005 VARCHAR(10), Presupuesto2005 VARCHAR(15))')
	cursor.lastrowid
	con.commit()	

#Obtención de datos municipales de La Rioja
def descargarDatos(nombreDestino):
	os.system("wget -q -O "+nombreDestino+" http://es.wikipedia.org/wiki/Wikiproyecto:La_Rioja/datos_municipales")

#Obtención de mapa base de La Rioja
def descargarMapa(nombreDestino):
	os.system("wget -q -O "+nombreDestino+" http://es.wikipedia.org/wiki/Wikiproyecto:La_Rioja/mapa_municipal")

def insertarMunicipios(sourceMap):
	cursor = con.cursor()
	estamos = 0
	#Abriendo fichero de datos municipales
	for linea in open(sourceMap):
		if linea=="<"+"pre>\n":
			estamos = 1 #Buscando comienzo de datos municipales
		elif linea=="<"+"/pre></div>\n":
			estamos = 0 #Encontrado fin de datos municipales
		elif estamos == 1: 
			estamos = 2
		elif estamos == 2: #Saltar las dos primeras lineas, es una ñapa, pero hasta encontrar una solución mejor ...
			estamos = 3
		elif estamos == 3:
			#Preparando la linea para insertar en la base de datos
			linea = linea.replace(";;",";null;").replace(";;",";null;")
			linea = linea.replace(";\n",";null\n")
			linea = linea.replace("\n","")
			linea = linea.replace(',',".")
			cursor.execute('INSERT INTO MUNICIPIOS VALUES (' + linea.replace(";",",") + ')')

def extraerMapaDeWeb(mapaOrigen):
	mapa = codecs.open(mapaOrigen, "r", "utf-8")
	out = file( mapaOrigen+'.tmp', "w" )
	estamos = 0
	for linea in mapa:		
                linea = linea.replace("&"+"lt;",u"<")
                linea = linea.replace("&"+"gt;",u">")
		if linea=="<"+"pre>\n":
			estamos = 1 #Buscando comienzo de mapa
		elif linea=="<"+"/pre></div>\n":
			estamos = 0 #Encontrado fin de mapa
		elif linea=="</svg>\n":
			out.write( linea.encode( "utf-8" ) )
		elif estamos == 1:
			out.write( linea.encode( "utf-8" ) )
	out.close()
	mapa.close()


#Para mover ficheros y demas mirar http://pydoc.org/1.6/os.html
def crearMapa(where,mapaOrigen,nombreResultado,color):
	cursor = con.cursor()
	print 'Creando mapa %s' % (nombreResultado)

	if(mapaOrigen=="webMapaWikipedia.dat"):
		extraerMapaDeWeb(mapaOrigen)
		mapaOrigen=mapaOrigen+'.tmp'
		estamos = 0
	else:
		estamos = 1
	mapa = codecs.open(mapaOrigen, "r", "utf-8")
	out = file( "mapa.tmp", "w" )

	for linea in mapa:	
		if linea=="</svg>\n":
			cursor.execute('SELECT id,Población FROM municipios WHERE ' + where)
			#Creación de grupo donde se insertarán los municipios que deban aparecer con otro color
			out.write( '  <g id="Selection" fill="'+color+'" stroke="black" stroke-width="1.3"> \n'.encode( "utf-8" ) )
			#Creando lineas de los municipios que cumplan la condición
			for (id, name) in cursor:
				print name
				mun = '  <use xlink:href="#%s" />\n' % (name.replace(" ","_"))
				out.write( mun.encode( "utf-8" ) )
			#Cierre de grupo y fin de fichero svg
			out.write( "  </g> \n".encode( "utf-8" ) )
			out.write( linea.encode( "utf-8" ) )
		else:
			out.write( linea.encode( "utf-8" ) )

	mapa.close()
	out.close()
	if(os.path.exists(nombreResultado)):
		os.remove(nombreResultado)
	os.rename("mapa.tmp",nombreResultado)

def descripcionCommons(nombreMunicipio):
	hoy = datetime.date.today()
	fecha = hoy.strftime("%d %B %Y")
	texto = "== Summary ==\n" +\
	"{{Information| \n" +\
	"|Description={{en|Localization of %s in La Rioja (Spain)}} {{es|Localización de %s en La Rioja (España)}} \n"+\
	"|Source=Based on [[:es:Wikiproyecto:La Rioja/mapa municipal|Municipal Map]] (modification of [[:Image:La Rioja - Mapa municipal.svg]]). Created with [[:es:Wikiproyecto:La_Rioja/mapa_municipal/obtener_mapa]] python script. \n"+\
	"|Date=%s \n"+\
	"|Author=[[User:Bigsus|BigSus]] modification of [[:es:Usuario:Tony_Rotondas|Emilio Gómez Fernández]] work \n"+\
	"|Permission=see below \n"+\
	"|other_versions= \n"+\
	"}} \n"
	return texto % (nombreMunicipio,nombreMunicipio,fecha)

def crearMapasMunicipios():
	cursor = con.cursor()
	cursor.execute('SELECT id,Población FROM municipios WHERE EsMunicipio="SI"')
	if(os.path.exists("mapas")==False):
		os.mkdir('mapas') #Creo un directorio para introducir todos los mapas

	#Creo fichero para subir mapas con el script "http://commons.wikimedia.org/wiki/Commons:File_upload_service/Script"
	out = file( 'mapas/files.txt', "w" )
	out.write( '@== License == {{gfdl}} [[Category:La Rioja (Spain) Locator maps]]\n' )
	for (id,name) in cursor:		
		nombreMunicipio = name.encode( "utf-8" )
		nombreFichero = '%s - La Rioja (Spain) - Municipality Map.svg' % (nombreMunicipio)
		crearMapa('id=%i' % (id), 'webMapaWikipedia.dat', 'mapas/'+nombreFichero, "url(#GradientSelected)")

		out.write( '>'+nombreFichero+'\n' )
		out.write( descripcionCommons(nombreMunicipio) )
		
def usage():
	print version + "\n" + info
	print "uso: ./crearMapas.py [OPCIONES]\n \
Las opciones disponigles son:\n \
\t-Q  --query=CONSULTA\tCondición SQL con la que filtraremos los municipio a colorear\n \
\t-M  --sourcemap=MAPAORIGEN\tMapa base que será coloreado\n \
\t-N  --resultmap=NOMBREMAPA\t\tNombre del mapa resultante\n \
\t-X  --nodownloaddata\tNo descarga ningún dato de internet, usa los ya descargados\n \
\t-C  --color=COLORENINGLES\t\tNombre del color que rellenará los municipios que cumplan la consulta\n \
\t-h  --help\t\tMostrar ayuda\n \
\t-a  --all\t\tCrea un mapa para cada municipio de La Rioja\n \
\t-v  \t\t\tMuestra versión y termina\n \
\t-i  \t\t\tMuestra información y termina" 

#Comienzo del programa
def main(argv):
	sourcemap=""
	resultmap=""
	sourcedata="webDatosMunicipalesWikipedia.dat"
	color=""
	query=""
	downloaddata="S"
	try:
		parms,args = getopt.getopt(argv, "haivM:N:C:X:Q:", ["help","all", 
"sourcemap=","resultmap=","color=","query=","nodownloaddata"])
	except getopt.GetoptError:
		usage()
		sys.exit(2)
	for opt,value in parms:
		if opt in ("-h","--help"):
			usage()
			sys.exit(0)
		if opt in ("-a","--all"):
			usage()
			action="all"
		if opt=="-i":
			print info
			sys.exit(0)
		if opt=="-v":
			print version
			sys.exit(0)
		if opt in ("-M","--sourcemap"):
			sourcemap=value
		if opt in ("-N","--resultmap"):
			resultmap=value
		if opt in ("-C","--color"):
			color=value
		if opt in ("-X","--nodownloaddata"):
			downloaddata="N"
		if opt in ("-Q","--query"):
			query=value
			action="query"

	if resultmap=="":
		resultmap="mapa.svg"
	if sourcemap=="":
		sourcemap="webMapaWikipedia.dat"
		descargarMapa(sourcemap)
	if color=="":
		color="url(#GradientSelected)"


	if(downloaddata=="S"):		
		descargarDatos(sourcedata)

	prepararTablas()
	#Inserción de datos de municipios obtenidos de wikipedia
	insertarMunicipios(sourcedata)


	if action=="all":
		crearMapasMunicipios()
	elif action=="query":
		crearMapa(query,sourcemap,resultmap,color)

if __name__ =="__main__":
	#Creación de base de datos temporal
	con = sqlite.connect(":memory:")
	main(sys.argv[1:])