Usuari:PereBot/robot coordenades cantons
Aparença
Aquest programa fa servir coordenades de la {{infotaula de municipi de França}}. Per una versió més moderna que treu les coordenades de Wikidata vegeu Usuari:PereBot/robot coordenades comarques.
# -*- coding: utf-8 -*-
# Programa per posar les coordenades a un cantó francès
# calculant les coordenades mitjanes dels municipis que
# el componen. Els municipis els treu dels articles enllaçats
# de la secció "Municipis" o "Composició", i si no prova
# amb tots els enllaços de l'article. Les coordenades
# les llegeix de la infotaula de municipi de França.
# De moment no llegeix coordenades de la plantilla coord
# ni de l'enllaç extern al toolserver.
import re, sys
sys.path.append('C:\pywikipedia')
import wikipedia, catlib
#Dona l'enllaç a una pàgina en forma d'interviqui
#L'argument és un objecte pàgina
def enllac(pag):
return "[[:%s:%s]]" % (pag.site().lang, page.title())
# Munta la plantilla a partir de les coordenades
def plantcoord(lat, lon):
plant=u"{{coord|%s|%s|source:cawiki_type:adm3rd|display=title}}" % (lat, lon)
# print plant
return plant
# Treu les coordenades de la infotaula de municipi francès
# municipi=article del municipi (com a objecte pàgina)
# PER FER: FER SERVIR SPLIT PEL SIGNE = PER SEPARAR EL NOM DEL PARÀMETRE ABANS DE MIRAR QUIN PARÀMETRE ÉS
# PER FER: QUE ACCEPTI LES PLANTILLES LOCATION MAP I COORD
def coordmunfr(municipi):
if u'Infotaula de municipi de França' in municipi.templates():
print municipi,u"té la infotaula"
esmun=True
lat=""
lon=""
tempParam=municipi.templatesWithParams()
for i in range(0, len(tempParam)):
if tempParam[i][0]==u'Infotaula de municipi de França':
for j in range(0, len(tempParam [i][1])):
if u"latitud" in tempParam[i][1][j]: # or u"lat" in tempParam[i][1][j][0:3]:
lat = tempParam[i][1][j]
# print u"Latitud", lat
lat = float(lat.split("=")[1].strip())
print lat
if u"longitud" in tempParam[i][1][j]: # or u"long" in tempParam[i][1][j][0:4]:
lon = tempParam[i][1][j]
# print u"Longitud", lon
lon = float(lon.split("=")[1].strip())
print lon
if isinstance(lat, float) and isinstance(lon, float):
print u"Coordenades trobades"
else:
print u"No es pot llegir les coordenades de la infotaula"
esmun = False
lat = lon = ""
else:
print municipi,u"no té la infotaula de municipi francès"
esmun = False
lat = lon = ""
return lat, lon, esmun
#Retorna una llista amb els municipis d'un cantó
#L'argument és la pàgina del cantó (amb secció de municipis enllaçats)
def municipis(pagcant):
text=pagcant.get()
llista=[]
if not re.search(u"== ?Municipis ?==", text):
text=re.sub(u"== ?Composició ?==", u"== Municipis ==",text)
if re.search(u"== ?Municipis ?==", text):
fragments=re.split(u"== ?Municipis ?==", text)
# print fragments
text= fragments [1]
fragments=re.split(u"==", text)
# print fragments
text=fragments[0]
# print text
else:
print u"Sense secció de muncipis. Es tracten tots els enllaços de l'article com a municipis."
fragments=re.split(u"\]\]", text)
fragments=fragments[:-1]
for el in fragments:
el = re.sub(ur"\n", "", el)
el = re.sub(ur".*\[\[", "", el)
el = re.sub(ur"\|.*", "", el)
el = re.sub(ur"\]\].*", "", el)
# print el
if el[0]!=u"#":
pagmun=wikipedia.Page(site,el)
# print pagmun
if pagmun.exists():
if pagmun.isRedirectPage():
pagmun=pagmun.getRedirectTarget()
if pagmun.exists():
if not pagmun.isRedirectPage():
llista.append(pagmun)
else:
print u"Doble redirecció", pagmun
else:
print u"Enllaç vermell", pagmun
else:
print u"Cosa rara que no és un bon enllaç:", el
return catlib.unique(llista)
# Calcula les coordenades d'un cantó
# Argument és la pàgina del cantó
def coordcanto(pagcanto):
llistamun=municipis(pagcanto)
# print llistamun
nmunpot=len(llistamun)
nmun = slat = slon = 0
maxlat = -90
maxlon = -180
minlat = 90
minlon = 180
if len(llistamun) > 1:
for mun in llistamun:
latm, lonm, nhiha = coordmunfr(mun)
if nhiha:
nmun += 1
slat += latm
slon += lonm
if latm > maxlat:
maxlat = latm
if latm < minlat:
minlat = latm
if lonm > maxlon:
maxlon = lonm
if lonm < minlon:
minlon = lonm
if nmun > 0:
clat = slat / nmun
clon = slon / nmun
else:
nmun = 0
if nmun > 0:
print u"Coordenades del cantó {} {}basades en {} municipis de {} possibles".format(clat,clon,nmun,nmunpot)
print u"Dispersió lat: {} Dispersió lon: {}".format(maxlat-minlat, maxlon-minlon)
if nmun == 1:
print u"Cantó monomunicipal"
clat += 0.001
clon += 0.001
return plantcoord(clat,clon)
else:
print u"Falten municipis per poder calcular"
return ""
# Retorna les categories i articles d'una categoria, subcategories incloses.
# No torna a mirar les categories que ja ha mirat.
# Filtra pels noms de les categories fent servir una expressió regular.
def miracatfiltre(cat, catprevies=[], filtre=u""):
articles = cat.articlesList(recurse=False)
categories = cat.subcategoriesList(recurse=False)
for scat in categories:
print scat
# print u"Títol",scat.title()
if scat not in catprevies:
catprevies.append(scat)
if filtre == u"":
nopassa = False
print u"Filtre desactivat"
else:
nopassa = re.search(filtre, scat.title())
if not nopassa:
print u"Sí que es llegeix", scat
noucats, nouarts = miracatfiltre(scat, catprevies+categories, filtre)
categories += noucats
articles += nouarts
else:
print u"No es llegeix", scat
else:
print u"Aquesta ja la tinc vista"
articles = catlib.unique(articles)
return categories, articles
#Paraules amb les que comencen categories que tenen les pàgines que no necessiten coordenades (principalment biografies)
def catsnocoord():
cadena = u"Persones|Jugadors|Polítics|Escriptors|Pintors|Dibuixants"
cadena += u"|Poetes|Dramaturgs|Novel·listes|Autors|Traductors"
cadena += u"|Escultors|Arquitectes|Músics|Cantants|Actors|Compositors"
cadena += u"|Artistes|Cuiners"
cadena += u"|Esportistes|Futbolistes|Ciclistes|Nedadors|Entrenadors|Medallistes"
cadena += u"|Emperadors|Reis|Ducs|Grans ducs|Comtes|Vescomtes|Virreis|Nobles"
cadena += u"|Tsars|Electors|Prínceps|Infants|Barons|Diàdocs|Khans"
cadena += u"|Reines|Consorts|Emperadrius|Primeres dames"
cadena += u"|Cònsols|Tribuns|Pretors|Sàtrapes|Faraons"
cadena += u"|Governadors|Senyors|Marcgravis|Majordoms|Sobirans"
cadena += u"|Guanyadors|Exiliats|Militars|Comandants|Militars|Pilots"
cadena += u"|Socialistes|Comunistes|Feministes|Militants|Feixistes|Nazis"
cadena += u"|Activistes|Presidents|Ministres|Primers ministres|Diputats"
cadena += u"|Alcaldes|Consellers|Regidors"
cadena += u"|Empresaris|Dirigents"
cadena += u"|Periodistes|Directors|Advocats|Juristes"
cadena += u"|Científics|Economistes|Físics|Químics|Matemàtics"
cadena += u"|Historiadors|Arqueòlegs|Filòsofs"
cadena += u"|Alumnes|Professors"
cadena += u"|Papes|Religiosos|Bisbes|Monjos|Frares|Abats|Canonges|Sacerdots"
cadena += u"|Sants|Heretges|Beats|Déus"
cadena += u"|Jesuïtes|Benedictins|Dominics"
cadena += u"|Catalans|Anglesos|Escocesos|Gal·lesos"
cadena += u"|Víkings|Alemanys|Bavaresos|Prussians|Suïssos"
cadena += u"|Andalusins|Àrabs|Algerians|Egipcis"
cadena += u"|Imams|Musulmans|Emirs|Sultans|Companys"
cadena += u"|Discs|Cançons|Grups de música|Pel·lícules|Canals de televisió|Programes"
cadena += u"|Obres literàries|Obres de literatura|Obres teatrals|Llibres|Novel·les|Contes|Personatges"
cadena += u"|Dominis de primer|Monedes|Himnes|Banderes|Escuts|Tractats"
cadena += u"|Seleccions|Clubs|Partits|Jocs|Campionat|Condecoracions"
cadena += u"|Plantilles|Llistes|Articles destacats|Articles bons"
cadena += u"|Esport|Entitats" #Provisional. Treure quan no calgui.
cadena += u"|Corona d'Aragó|Sacre Imperi" #Provisional. Treure quan no calgui.
return cadena
# Funció que inserta la plantilla Coord (o un altre text) en una pàgina.
# Mira de posar-la davant de l'ORDENA i si no davant les categories.
# Els arguments són la pàgina i el text a afegir (habitualment la plantilla amb
# el seus paràmetres).
# Retorna el text amb la plantilla (o sense, si no ha trobat on posar-la).
#
def insertacoor(page,afegit):
if page.isRedirectPage():
page=page.getRedirectTarget()
text=page.get()
if re.search(u"\{\{ORDENA",text):
text=re.sub(u"\{\{ORDENA",afegit+u"\n{{ORDENA",text)
print u"Text afegit davant de l'ORDENA"
elif re.search(u"\[\[ ?[Cc]ategoria:",text):
text=re.sub(u"\[\[ ?[Cc]ategoria:",afegit+u"\n[[Categoria:",text,count=1)
print u"Text afegit davant de les categories"
else:
print u"No he trobat on afegir el text a [["+page.title()+u"]]"
return text
#El programa comença aquí
def principal():
catbuscar = u"Cantons d'Aquitània" #Posar aquí la categoria que es revisarà
missatge = "" #u" en el marc del [[Viquiprojecte:Unió Europea]]" #Missatge promocional. Canviar per "" la resta de l'any.
missatgeno = missatge # Missatge promocional per quan posa {{cal coor}}
calcoortxt = u"{{cal coor}}"
categoria = catlib.Category(site,catbuscar)
filtrecats = u"Categoria:(%s)" % catsnocoord()
cats, asc = miracatfiltre(categoria, filtre=filtrecats)
comptapotencial = len(asc)
print "Articles a la categoria: %s" %comptapotencial
#asc=asc[2:6] #Per fer només un grapat d'articles a la vegada
comptarevisar = len(asc)
informeno = ""
marcagh = u"//toolserver.org/~geohack/geohack.php"
comptaarticles = comptajaentenen = comptaposoplant = comptaposohack = \
comptanocalenllista = comptanocalencat = comptacalcoor = comptacalcoor0 = 0
for pag in asc:
comptaarticles += 1
print "%i/%i: %s" % (comptaarticles, comptarevisar, pag)
if pag.isRedirectPage(): #Precaució contra que hi hagi alguna redirecció categoritzada
pag=pag.getRedirectTarget()
if u"Cantó" in pag.title():
tottemp = pag.templates()
# print tottemp
if u'Coord' in tottemp:
print u"Ja té la plantilla coord"
comptajaentenen += 1
elif u"Llista d" in pag.title():
print u"És una llista. No li calen coordenades generals."
comptanocalenllista += 1
elif marcagh in pag.get(expandtemplates=True):
print u"Ja té coordenades però sense la plantilla coord"
comptajaentenen += 1
else:
resumno = enllac(pag)+u"\n"
coordexistent = False
plantxt = coordcanto(pag)
if len(plantxt)>6:
noutext = insertacoor(pag,plantxt)
noutext = re.sub(u"{{[Cc]al coor.*}}\n?",u"",noutext)
noutext = re.sub(u"\n\n+{{coord",u"\n\n{{coord",noutext)
# pagprova=wikipedia.Page(site,u"Usuari:PereBot/taller")
#canviar pagprova per pag a la línia següent per tenir versió funcional
pag.put(noutext, u"Bot posa al cantó la mitjana de les coordenades dels municipis%s" % missatge)
comptaposohack += 1
resumno=u""
else: # Si no ha pogut posar coordenades
if u"*" in resumno:
informeno += u"%s\n\n" % resumno
# Comença a posar cal coor, si cal.
if re.search(u"{{[Cc]al coor.*}}\n?", pag.get()):
print pag, u"Ja té {{cal coor}}"
comptacalcoor0 += 1
else:
print u"Li cal {{cal coor}} a",pag
comptacalcoor += 1
noutext = insertacoor(pag, calcoortxt)
pag.put(noutext, u"Bot posa %s%s" %(calcoortxt, missatgeno))
else:
print pag,u"no és un cantó"
resumestadistic=u"La [[:categoria:{}]] (un cop filtrada) té {} articles\n\n".format(catbuscarcomptapotencial)
resumestadistic += u"Revisats {} articles\n\n".format(comptaarticles)
resumestadistic += u"Ja tenien coordenades {} articles\n\n".format(comptajaentenen)
resumestadistic += u"No els calen coordenades a {} articles (llistes, persones, films, etc.)\n\n".format(comptanocalenllista+comptanocalencat)
resumestadistic += u"*Detectats pel nom (llistes): {} articles\n\n"+''.format(comptanocalenllista)
resumestadistic += u"*Detectats per les categories: {} articles\n\n"+''.format(comptanocalencat)
resumestadistic += u"Posades coordenades interpolant a {} articles\n\n".format(comptaposohack)
resumestadistic += u"Ja tenien cal coor {} articles\n\n"+''.format(comptacalcoor0)
resumestadistic += u"Posat cal coor a {} articles\n\n"+''.format(comptacalcoor)
queden = comptaarticles - comptajaentenen - comptaposoplant - comptaposohack - (comptanocalenllista + comptanocalencat)
resumestadistic += u"Queden {} articles sense coordenades\n\n".format(queden) # (comptant els que no tenen iw)\n\n"
resumestadistic += u"Des quals {} estan marcats amb cal coor\n\n".format(comptacalcoor+comptacalcoor0)
resumestadistic += u"Hi ha {} casos dubtosos\n\n".format(queden-comptacalcoor-comptacalcoor0)
print resumestadistic
informeno += u"\n%s" % resumestadistic
if informeno != "":
paginforme = wikipedia.Page(site,u"Usuari:PereBot/coordenades") # Pàgina on deixarà l'informe del que ha fet
informeno = u"\n=={}==\n{}\n--~~~~\n\n" % (catbuscar, informeno)
# paginforme.put(paginforme.get()+informeno,catbuscar)
if __name__ == '__main__':
site=wikipedia.getSite('ca')
wikipedia.stopme()