Vés al contingut

Usuari:PereBot/robot fa mapes cobertura viquipèdies

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

Els mapes generats amb aquest programa són a Especial:Cerca_per_prefix/User:PereBot/cobertura

# -*- coding: utf-8 -*-
# Genera un mapa amb el nombre d'items de Wikidata amb enllaç a cawiki
# sobre el total d'items de Wikidata.

import sys
sys.path.append('C:\core')
import pywikibot
from pywikibot import pagegenerators
from pywikibot.compat import catlib
import re,urllib,urllib2,math,time

# Actualitza informe
def putinforme(pag,afegit,sumari,signa=False,afegeix=True):
    if pag.exists():
        textinforme=paginforme.get()+u"\n"+afegit
    else:
        textinforme=afegit
    if not afegeix:
        textinforme=afegit
    if signa:
        textinforme=textinforme+u"\n--~~~~\n"
    paginforme.put(textinforme,sumari)
    return

# Obre una pàgina web i la llegeix
# L'argument és l'adreça (una cadena de text)
def llegeix(adreca):
    pllista=urllib.urlopen(adreca)
    contingut=pllista.read()
    return contingut

# Tria la imatge del punt segons el nombre d'articles
def figura(cat,total):
    if total==0:
        fig=u"White pog.svg"
    elif cat>0.95*total:
        fig=u"Green 008000 pog.svg"
    elif cat>0.75*total:
        fig=u"Green 00ff00 pog.svg"
    elif cat>0.5*total:
        fig=u"Yellow ffff00 pog.svg"       
    elif cat>0.25*total:
        fig=u"Orange pog.svg"
    elif cat>0.05*total:
        fig=u"Red ff0000 pog.svg"
    else:
        fig=u"Dark Red 800000 pog.svg"
    return fig

# Dades de la Plantilla:Location map Earth
def mapaterra():
    name=u"Terra"
    top    = 90
    bottom = -90
    left   = -180
    right  = 180
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Zimbabwe
def mapazimbabwe():
    name=u"Zimbabwe"
    top    = -15.2
    bottom = -22.8
    left   = 24.8
    right  = 33.6
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Argentina
def mapaargentina():
    name=u"Argentina"
    top    = -21.0
    bottom = -56.5
    left   = -76.5
    right  = -52.5
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Brasil
def mapabrasil():
    name=u"Brasil"
    top    = 6.0
    bottom = -34.0
    left   = -74.5
    right  = -32.0
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Uruguai
def mapauruguai():
    name=u"Uruguai"
    top    = -29.86
    bottom = -35.19
    left   = -58.71
    right  = -52.89
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Corea del Sud
def mapaxina():
    name=u"Xina"
    top    = 54
    bottom = 18
    left   = 73
    right  = 135
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Corea del Sud
def mapacoreasud():
    name=u"Corea del Sud"
    top    = 38.9
    bottom = 33.0
    left   = 124.5
    right  = 132.0
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Ucraïna
def mapaucraina():
    name=u"Ucraïna"
    top    = 52.7
    bottom = 44.1
    left   = 21.5
    right  = 40.7
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Síria
def mapasiria():
    name=u"Síria"
    top=37.6
    bottom=32.0
    left=34.9
    right=42.7
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Croàcia
def mapacroacia():
    name   = u"Croàcia"
    top=46.8
    bottom=42.1
    left=13.1
    right=19.9
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Bèlgica
def mapabelgica():
    name   = u"Bèlgica"
    top=51.8
    bottom=49.2
    left=2.2
    right=6.9
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Noruega
def mapanoruega():
    name   = u"Noruega"
    top=71.5
    bottom=57.6
    left=4.1
    right=31.6
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Àustria
def mapaaustria():
    name=u"Àustria"
    top    = 49.2
    bottom = 46.3
    left   = 9.4
    right  = 17.2
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Itàlia
def mapaitalia():
    name=u"Itàlia"
    top    = 47.4
    bottom = 35.3
    left   = 6.2
    right  = 19.0
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Espanya
def mapaesp():
    name=u"Espanya"
    top    = 44.4
    bottom = 34.7
    left   = -9.9
    right  = 4.8
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Andalusia
def mapaandalusia():
    name=u"Andalusia"
    top= 38.869010
    bottom= 35.716589
    left=-7.640606
    right=-1.551795
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Bretanya
def mapabretanya():
    name=u"França Bretanya"
    top= 49.00
    bottom= 47.20 
    left= -5.25
    right= -0.90
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Lorena
def mapalorena():
    name=u"Lorena"
    top    = 50
    bottom = 47.5
    left   = 4.5
    right  = 8
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Alsàcia
def mapaalsacia():
    name=u"Alsàcia"
    top    = 49.15
    bottom = 47.35
    left   = 6.7
    right  = 8.35
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Pirineus
def mapapirineus():
    name   = u"Pirineus"
    top = 43.97
    bottom = 41.05
    left = -2.820
    right = 3.810
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Occitània
def mapaoc():
    name=u"Occitània"
    top    = 46.9
    bottom = 41.7
    left   = -2.7901 
    right  = 8.5464 
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Euskal Herria
def mapaeuskalherria():
    name=u"Euskal Herria"
    top=43.584166
    bottom=41.88222
    left=-3.453056
    right=-0.565
    return name,top,bottom,left,right

# Dades de la Plantilla:Mapa de localització als Països Catalans
def mapappcc():
    name=u"Països Catalans"
    top=43.500000
    bottom=37.220000
    left=-2.480000
    right=5.700000
    return name,top,bottom,left,right

# Dades de la Plantilla:Mapa de localització Pirineus Orientals
def mapapirineusorientals():
    name   = u"Pirineus Orientals districtes"
    top=42.999860
    bottom=42.299861
    left=1.649861
    right=3.299861
    return name,top,bottom,left,right

# Dades de la Plantilla:Mapa de localització Aragó
def mapaarago():
    name   = u"Aragó"
    top= 43.055249
    bottom= 39.750129
    left=-2.282836
    right=0.858865
    return name,top,bottom,left,right

# Dades de la Plantilla:Mapa de localització Andorra
def mapaand():
    name   = u"Andorra relleu"
    top    = 42.675
    bottom = 42.4
    left   = 1.3875
    right  = 1.8125
    return name,top,bottom,left,right

# Dades de la Plantilla:Mapa de localització Mallorca
def mapamallorca():
    name   = u"Mallorca"
    top= 40.218
    bottom=39.012
    left=2.224
    right=3.671
    return name,top,bottom,left,right

# Dades de la Plantilla:Mapa de localització Mallorca
def mapapalma():
    name   = u"Palma"
    top= 39.5961
    bottom=39.5563
    left=2.6216
    right=2.6741
    return name,top,bottom,left,right

# Dades de la Plantilla:Mapa de localització Pitiüses
def mapapit():
    name   = u"Pitiüses"
    top    = 39.123
    bottom = 38.636
    left   = 1.1527
    right  = 1.654444
    return name,top,bottom,left,right

# Dades de la Plantilla:Mapa de localització País Valencià 2
def mapaval():
    name=u"País Valencià 2"
    top=40.830435
    bottom=37.445000
    left=-1.891800
    right=1.180300
    return name,top,bottom,left,right

# Dades de la Plantilla:Mapa de localització Catalunya
def mapacat():
    name=u"Catalunya"
    top=43.112262
    bottom=40.23813
    left=-0.15000
    right=3.95000
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Baixa Cerdanya
def mapabaixacerdanya():
    name  = u"Baixa Cerdanya"
    top   = 42.55
    bottom= 42.25
    left  = 1.54
    right = 2.0
    return name,top,bottom,left,right

# Dades de la Plantilla:Location map Barcelona
def mapabcn():
    name  = u"Barcelona"
    top    =41.448
    bottom =41.345
    left   =2.087
    right  =2.245
    return name,top,bottom,left,right

# El programa comença aquí
nommapa,latmaxvora,latminvora,longminvora,longmaxvora=mapaand() # Poseu la funció que correspongui al mapa que vulgueu fer servir
fig={"ca":u"Nuvola Catalonia flag.svg", # Descomenteu les llengües de les viquipèdies que vulgueu considerar (més viquipèdies, més lent)
     "es":u"Nuvola Spain flag escudada.svg",
     "en":u"Nuvola United Kingdom flag.svg",
     "fr":u"Nuvola apps klettres.png",
     "it":u"Nuvola Italy flag.svg",
     "de":u"Nuvola German flag.svg",
     "nl":u"Nuvola Dutch flag.svg",
     #"ja":u"Nuvola Japan flag.svg",
     "zh":u"Nuvola Chinese flag.svg",
     #"zh-classical":u"Nuvola Taiwanese flag.svg",
     #"ko":u"Nuvola Korean flag.svg",
     "eu":u"Nuvola Basque Country flag.svg",
     #"ar":u"Green flag.svg",
     #"an":u"Flag Aragón.svg",
     #"ast":u"Flag of Asturias.svg",
     #"pt":u"Nuvola Portuguese flag.svg",
     #"gl":u"Nuvola Galician flag.svg",
     "oc":u"Icon of Occitania.svg",
     #"ru":u"Nuvola Russian flag.svg",
     #"pl":u"Nuvola Polish flag.svg",
     #"el":u"Nuvola Greek flag.svg",
     #"ro":u"Nuvola apps ro flag.png",
     #"br":u"Nuvola Brittany flag.svg",
     #"uk":u"Nuvola Ukrainian flag.svg",
     #"cs":u"Nuvola Czech flag.svg",
     #"hu":u"Nuvola Hungary flag.svg",
     #"sr":u"Nuvola Serbian flag.svg",
     #"sh":u"Serbo-Croatian language flag.gif",
     #"hr":u"Nuvola Croatian flag.svg",
     #"bs":u"Nuvola Bosnian flag.svg",
     #"sl":u"Nuvola Slovenian flag.svg",
     #"sk":u"Nuvola Slovakian flag.svg",
     #"sq":u"Nuvola Albanian flag.svg",
     #"he":u"Nuvola Israeli flag.svg",
     #"bg":u"Nuvola Bulgaria flag.svg",
     #"hy":u"Nuvola Armenian flag.svg",
     #"no":u"Nuvola Norwegian flag.svg",
     #"da":u"Nuvola Danish flag.svg",
     #"nn":u"Flag of Vestlandet.svg",
     #"sv":u"Nuvola Swedish flag.svg",    
     #"fo":u"Nuvola Faroese flag.svg",
     #"is":u"Nuvola Icelandic flag.svg",
     #"se":u"Sami flag.svg",
     #"fi":u"Nuvola Finnish flag.svg",    
     #"et":u"Nuvola Estonian flag.svg",
     #"lv":u"Nuvola Latvian flag.svg",
     #"lt":u"Nuvola Lithuanian flag.svg",
     #"az":u"Nuvola Azerbaijanian flag.svg",
     #"ka":u"Nuvola Georgian flag.svg",
     #"tr":u"Nuvola Turkish flag.svg",
     #"mk":u"Nuvola Macedonian flag.svg",
     #"be":u"Nuvola Belarus flag 1995.svg",
     #"lb":u"Nuvola Luxemburgish flag.svg",
     #"wa":u"Flag of Wallonia.svg",
     #"vls":u"West-Vlaams.JPG",
     #"als":u"Houptsyte.png",
     #"ga":u"Nuvola Irish flag.svg",
     #"lmo":u"Flag of Lombardy.svg",
     #"cy":u"Nuvola welsh flag simplified.svg",
     #"fa":u"Nuvola Iranian flag.svg",
     #"ku":u"Flag of Kurdistan.svg",
     #"uz":u"Nuvola Uzbek flag.svg",
     #"tk":u"Nuvola Turkmen flag.svg",
     #"kk":u"Nuvola Kazakh flag.svg",
     #"rm":u"Red ff0000 pog.svg",
     #"fur":u"Friuli Flag.svg",
     #"sc":u"Nuvola Sardinia flag.svg",
     #"pms":u"Flag of Piedmont.svg",
     #"co":u"Nuvola Corsica flag.svg",
     #"crh":u"Flag of the Crimean Tatar people.svg",
     #"bo":u"Flag of Tibet.svg",
     #"zh-min-nan":u"Minyu.png",
     #"zh-yue":u"Pukguy.png",
     #"mn":u"Nuvola Mongolian flag.svg",
     #"th":u"Nuvola Thai flag.svg",
     #"vi":u"Nuvola Vietnamian flag.svg",
     #"new":u"Nuvola Nepal flag.svg",
     #"hi":u"Nuvola Indian flag.svg",
     #"af":u"Nuvola South African flag.svg",
     }
lleng=fig.keys()
print lleng
lleng.sort()
print lleng
nomslleng=str(lleng)
print nomslleng
fig["0"]=u"White pog.svg"
fig["="]=u"NUL logo.svg"
midamax=28
midamin=6
raditerra=6378
ample=800
ampletrama=45 # Canviar ample trama segons proporcions del mapa per no passar de 200-250 punts
puntshor=int(math.ceil(ample/ampletrama-0.5))
print "puntshor",puntshor
deltalong=(longmaxvora-longminvora)/puntshor
print "deltalong",deltalong
mitjalat=(latmaxvora+latminvora)/2
print "mitjalat",mitjalat
disthor=raditerra*math.pi*deltalong/180*math.cos(mitjalat/180*math.pi)
print "disthor",disthor
distvert=disthor*2/(3**0.5)
print "distvert",distvert
totdistvert=(latmaxvora-latminvora)*raditerra*math.pi/180
print "totdistvert",totdistvert
puntsvert=int(math.ceil(totdistvert/distvert-0.5))
print "puntsvert",puntsvert
deltalat=distvert/raditerra*180/math.pi
print "deltalat",deltalat
mitjalong=(longmaxvora+longminvora)/2
print "mitjalong",mitjalong
latinicial=mitjalat-deltalat*(puntsvert-1)/2
print "latinicial",latinicial
longinicial=mitjalong-deltalong*(puntshor-1)/2
print "longinicial",longinicial
dist=(disthor**2+(distvert/2)**2)**0.5/2
print "dist",dist
area=math.pi*dist**2
if area>2:
    factmida=(midamax-midamin)/area**(1.0/3.0)
else:
    factmida=(midamax-midamin)/10**(1.0/3.0)
tmapa={}
#Encapçalament mapes
llegenda=u"'''Viquipèdia amb més articles''' en un radi de {:.2f} km al voltant de cada punt (segons Wikidata)".format(dist)
llegenda=llegenda+u"<br/>Viquipèdies comparades: "+nomslleng
comtrama=u"<!-- ampletrama={} -->".format(ampletrama)
tmapar=comtrama+u"{{Location map+"+u"|{}|width={}|float=center|caption={}|places=".format(nommapa,ample,llegenda)+u"\n"
for l in lleng:
    llegenda=u"'''Items de Wikidata amb enllaç a {}wiki''' / '''Total items de Wikidata''' en un radi de {:.2f} km al voltant de cada punt".format(l,dist)
    llegenda=llegenda+u"<br/>Podeu convertir els valors en articles/km2 dividint per {:.2f} km2".format(area)
    tmapa[l]=comtrama+u"{{Location map+|"+nommapa+u"|width={}|float=center|caption={}|places=".format(ample,llegenda)+u"\n"
#Punts mapes
for x in range(0,puntshor):
    for y in range (0,puntsvert):
        ymod=y-0.25+0.5*(x%2)
        lon=longinicial+deltalong*x
        lat=latinicial+deltalat*ymod
        dirtot=u"https://wdq.wmflabs.org/api?q=around[625,{},{},{}]".format(lat,lon,dist)
        numtot=len(eval(llegeix(dirtot))["items"])
        #etiquetatot=u"[http://tools.wmflabs.org/wikidata-todo/autolist2.php?language=ca&project=wikipedia&category=&depth=12&wdq=around%5B625%2C{}%2C{}%2C{}%5D&mode=undefined&statementlist=&run=Run&label_contains=&label_contains_not=&chunk_size=10000 {}]".format(lat,lon,dist,numtot)
        midapunt=(midamin+factmida*numtot**(1.0/3.0))
        midaband=int(midapunt*1.2)
        midapunt=int(midapunt)
        maxa=0
        wmax=u"0"
        wempat=u""
        nempat=0
        nums={}
        for l in lleng:
            if numtot>0:
                dirl=u"https://wdq.wmflabs.org/api?q=around[625,{},{},{}]%20AND%20link[{}wiki]".format(lat,lon,dist,l)
                try:
                    numl=len(eval(llegeix(dirl))["items"])
                except IOError:
                    print u"error IOError; esperant 60 segons"
                    time.sleep(60)
                    try:
                        numl=len(eval(llegeix(dirl))["items"])
                    except:
                        continue
                except SyntaxError:
                    print u"error de sintaxi; esperant 60 segons"
                    time.sleep(60)
                    try:
                        numl=len(eval(llegeix(dirl))["items"])
                    except:
                        continue
            else:
                numl=0
            #etiquetacat=u"[http://tools.wmflabs.org/wikidata-todo/autolist2.php?language={}&project=wikipedia&category=&depth=12&wdq=around%5B625%2C{}%2C{}%2C{}%5D%20and%20link%5B{}wiki%5D&mode=undefined&statementlist=&run=Run&label_contains=&label_contains_not=&chunk_size=10000 {}]".format(l,lat,lon,dist,l,numl)
            #etiqueta=u"{}/<br/>{}".format(etiquetacat,etiquetatot)
            etiqueta=u"[http://tools.wmflabs.org/autolist/autolist1.html?lang={}&q=around%5B625%2C{:.6f}%2C{:.6f}%2C{:.6f}%5D {}<br/>{}]".format(l,lat,lon,dist,numl,numtot)
            imatge=figura(numl,numtot)
            if numtot>0:  # Per no posar els punts blancs i estalviar plantilles
                tmapa[l]=tmapa[l]+u"{{Location map~|"+nommapa+u"|"+u"lat={}|long={}|position=right|marksize={}|mark={}|label={}".format(lat,lon,midapunt,imatge,etiqueta)+u"}}\n"
            if numl>maxa:
                maxa=numl
                wmax=l
                wempat=l
                nempat=1
            elif numl==maxa and numl>0:
                wmax="="
                wempat=wempat+u"<br/>"+l
                nempat=nempat+1
            nums[l]=numl
        print u'{}/{}'.format(x,puntshor),lat,u'{}/{}'.format(y,puntsvert),lon,nums,wmax
        #Punt rànquing
        if numtot==0:
            wempat=wmax
        if wmax=="=" or wmax==u"0":
            if nempat>4:
                wempat="="
            etiqueta=u"[http://tools.wmflabs.org/autolist/autolist1.html?lang=ca&q=around%5B625%2C{:.6f}%2C{:.6f}%2C{:.6f}%5D {}]".format(lat,lon,dist,wempat)
            #etiqueta=u"[http://tools.wmflabs.org/wikidata-todo/autolist2.php?language=ca&project=wikipedia&category=&depth=12&wdq=around%5B625%2C{}%2C{}%2C{}%5D&mode=undefined&statementlist=&run=Run&label_contains=&label_contains_not=&chunk_size=10000 {}]".format(lat,lon,dist,wempat)
        else:
            etiqueta=u"[http://tools.wmflabs.org/autolist/autolist1.html?lang={}&q=around%5B625%2C{:.6f}%2C{:.6f}%2C{:.6f}%5D {}]".format(wmax,lat,lon,dist,wmax)
            #etiqueta=u"[http://tools.wmflabs.org/wikidata-todo/autolist2.php?language={}&project=wikipedia&category=&depth=12&wdq=around%5B625%2C{}%2C{}%2C{}%5D%20and%20link%5B{}wiki%5D&mode=undefined&statementlist=&run=Run&label_contains=&label_contains_not=&chunk_size=10000 {}]".format(wmax,lat,lon,dist,wmax,wmax)
        imatge=fig[wmax]
        if numtot>0: # Per no posar els punts blancs i estalviar plantilles
            tmapar=tmapar+u"{{Location map~|"+nommapa+u"|"+u"lat={}|long={}|position=right|marksize={}|mark={}|label={}".format(lat,lon,midaband,imatge,etiqueta)+u"}}\n"
#Tanca
tmapar=tmapar+u"}}\n"
for l in lleng:
    tmapa[l]=tmapa[l]+u"}}\n"
#Puja
site=pywikibot.getSite('ca')
paginforme=pywikibot.Page(site,u"Usuari:PereBot/cobertura/{}/ranking".format(nommapa))
putinforme(paginforme,tmapar,u"Rànquing de viquipèdies",afegeix=False)
for l in lleng:
    paginforme=pywikibot.Page(site,u"Usuari:PereBot/cobertura/{}/{}".format(nommapa,l))
    putinforme(paginforme,tmapa[l],u"Cobertura de les viquipèdies",afegeix=False)
pywikibot.stopme()