Vés al contingut

Usuari:PereBot/robot coordenades cantons

De la Viquipèdia, l'enciclopèdia lliure

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()