Usuari:PereBot/robot puja coordenades a Wikidata

De la Viquipèdia, l'enciclopèdia lliure
# -*- coding: utf-8 -*-
# Programa per preparar l'escript per pujar a Wikidata les coordenades.
# Les instruccions les imprimeix a la pantalla per copiar-les i enganxar-les
# al Quickstatements.

import sys
sys.path.append('C:\compat')
sys.path.append('C:\compat\userinterfaces')
import wikipedia,catlib,re,pagegenerators
import re

#El programa comença aquí
site=wikipedia.getSite('ca')
cat=catlib.Category(site,u"Articles amb coordenades sense coordenades a Wikidata")
arts=cat.articlesList(recurse=False)
resultat=u""
for pag in pagegenerators.PreloadingGenerator(arts):
    print pag.title()
    text=pag.get()
    textm=text.lower()
    if u'Infotaula patrimoni cultural' in pag.templates():
        trobats=re.findall(u"((lat|long)_dec.*?(\n|\|))",text)
        print trobats
        lat=False
        lon=False
        for tros in trobats:
            #print tros
            tros=tros[0]
            tros=tros.replace(u"<!--coordenades de patmapa ajustades automàticament-->",u"")
            #print tros
            numtext=re.sub(u"[long_decat \|\n\r\t=]",u"",tros)
            #print numtext
            if u"lat_dec" in tros:
                lat=numtext
            if u"long_dec" in tros:
                lon=numtext
        print lat,lon
    elif u'Infotaula de teatre' in pag.templates():
        trobats=re.findall(u"((latitud|longitud).*?(\n|\|))",text)
        print trobats
        lat=False
        lon=False
        for tros in trobats:
            #print tros
            tros=tros[0]
            tros=tros.replace(u"<!--coordenades de patmapa ajustades automàticament-->",u"")
            #print tros
            numtext=re.sub(u"[longituda \|\n\r\t=]",u"",tros)
            #print numtext
            if u"latitud" in tros:
                lat=numtext
            if u"longitud" in tros:
                lon=numtext
        print lat,lon
    elif u'VPHISMILCAT Localització militar' in pag.templates() or u'Localització militar' in pag.templates():
        trobats=re.findall(u"((lat|long?)_(deg|min|seg).*?(\n|\|))",text)
        print trobats
        lat=0
        lon=0
        for tros in trobats:
            deltalon=0
            deltalat=0
            #print tros
            tros=tros[0]
            #print tros
            numtext=re.sub(u"[long_decatmis \|\n\r\t=]",u"",tros)
            print numtext
            if not re.search(u"[0-9]",numtext):
                numtext=u"0"
            print numtext
            if u"lat_deg" in tros:
                deltalat=float(numtext)
            if u"lon_deg" in tros:
                deltalon=float(numtext)
            if u"lat_min" in tros:
                deltalat=float(numtext)/60
            if u"lon_min" in tros:
                deltalon=float(numtext)/60
            if u"lat_seg" in tros:
                deltalat=float(numtext)/3600
            if u"lon_seg" in tros:
                deltalon=float(numtext)/3600
            if lon<0 and deltalon>0:
                deltalon=-deltalon
            if lat<0 and deltalat>0:
                deltalat=-deltalat
            if lon>0 and deltalon<0:
                lon=-lon
            if lat>0 and deltalat<0:
                lat=-lat
            lat=lat+deltalat
            lon=lon+deltalon
        print lat,lon
    elif  u'Coord' in pag.templates():
        if re.search(u"\{\{ ?[Cc]oord ?\|",text):
            print u"Confirmat que hi ha la plantilla coord"
        else:
            print u"PROBLEMA: Hi ha la plantilla coord però no la troba"
            continue
        if re.search(u"\[\[categoria ?: ?(muntanyes|serres|platges|ries|llacs|embassaments)",textm):
            pass
        elif re.search(u"\[\[categoria ?: ?((arque)?bisbats|ciutats|barris|entitats de població|municipis|prefectures|estats)",textm):
            pass
        elif re.search(u"\[\[categoria ?: ?(castells|esglésies|edificis|molins|masies|possessions|teatres|cementiris)",textm):
            pass
        elif re.search(u"\[\[categoria ?: ?(places|jaciments|zones|monuments|patrimoni monumental|creus de terme)",textm):
            pass
        elif re.search(u"\[\[categoria ?: ?(rius|rieres|torrets|cursos d'aigua|corrents d'aigua)",textm): #Aquests es posen segons si hi ha desembocadura a Wikidata
            pass
        elif u'Indret' in pag.templates() or u'Platja' in pag.templates():
            pass
        elif u"Infotaula patrimoni cultural" in pag.templates() or u"Infotaula d'espais naturals" in pag.templates():
            pass
        else:
            print u"No té les categories previstes per buscar coordenades"
            continue
        trobats=re.findall(u"\{\{ ?[Cc]oord ?\|.*\}\}",text)
        print trobats
        trossos=re.split(u"\|",trobats[0].replace(u"}}",u""))
        print trossos
        if len(trossos)>=9:
            if re.search(u"N",trossos[4]):
                slat=1
            elif re.search(u"S",trossos[4]):
                slat=-1
            else:
                slat=0
            if re.search(u"E",trossos[8]):
                slon=1
            elif re.search(u"[OW]",trossos[8]):
                slon=-1
            else:
                slon=0
        else:
            slon=slat=0
        if slon*slat<>0:
            try:
                lat=float(trossos[1])+float(trossos[2])/60+float(trossos[3])/3600
                lon=float(trossos[5])+float(trossos[6])/60+float(trossos[7])/3600
                lat=lat*slat
                lon=lon*slon
            except ValueError:
                print u"Coordenades amb valors no numèrics"
                continue
        else:
            if len(trossos)>=7:
                if re.search(u"N",trossos[3]):
                    slat=1
                elif re.search(u"S",trossos[3]):
                    slat=-1
                else:
                    slat=0
                if re.search(u"E",trossos[6]):
                    slon=1
                elif re.search(u"[OW]",trossos[6]):
                    slon=-1
                else:
                    slon=0
            if slon*slat<>0:
                try:
                    lat=float(trossos[1])+float(trossos[2])/60
                    lon=float(trossos[4])+float(trossos[5])/60
                    lat=lat*slat
                    lon=lon*slon
                except ValueError:
                    print u"Coordenades amb valors no numèrics"
                    continue
            else:
                if len(trossos)>=5:
                    if re.search(u"N",trossos[2]):
                        slat=1
                    elif re.search(u"S",trossos[2]):
                        slat=-1
                    else:
                        slat=0
                    if re.search(u"E",trossos[4]):
                        slon=1
                    elif re.search(u"[OW]",trossos[4]):
                        slon=-1
                    else:
                        slon=0
                if slon*slat<>0:
                    try:
                        lat=float(trossos[1])
                        lon=float(trossos[3])
                        lat=lat*slat
                        lon=lon*slon
                    except ValueError:
                        print u"Coordenades amb valors no numèrics"
                        continue
                else:
                    if len(trossos)>=3:
                        if len(trossos)>3:
                            try:
                                nores=float(trossos[3])
                                print "tercer valor numèric. coordenades amb format no previst."
                                continue
                            except ValueError:
                                pass
                        try:
                            lat=float(trossos[1])
                            lon=float(trossos[2])
                        except ValueError:
                            print u"Coordenades amb valors no numèrics"
                            continue
                    else:
                        print u"Coordenades amb format no previst"
                        continue
    else:  #No és un dels articles on té previst buscar coordenades
        continue
    if lat==False or lon==False:
        print "no trobades latitud i longitud"
        continue
    try:
        pagdata=wikipedia.DataPage(pag)
        cont=pagdata.get()
        #print cont
    except wikipedia.NoPage:
        print u"No hi ha pàgina a Wikidata"
        continue
    qitem=pagdata.title()
    print u"id de Wikidata:",qitem
    hihacoord=False
    numcoord=0
    for prop in cont["claims"]:
        #print u"PROP:",prop
        #print u"M:",prop["m"]
        print u"P:",prop["m"][1]
        if prop["m"][1]==625:
            print u"ja hi ha coordenades a Wikidata"
            hihacoord=True
            numcoord=numcoord+1
        if prop["m"][1]==403:
            print u"hi ha desembocadura"
            continue
        if prop["m"][1]==159:
            print u"hi ha ubicació de la seu"
            continue
        if prop["m"][1]==279:
            print u"és subclasse" #ERROR A MARCAR
            continue
    if hihacoord:
        if numcoord>1:
            print u"[[d:{}]] ([[{}]]) té coordenades duplicades".format(qitem,pag.title()) #ERROR A MARCAR
        continue
    linia=u"{}\tP625\t@{}/{}\tS143\tQ199693".format(qitem,lat,lon)
    print linia
    resultat=resultat+u"\n"+linia
print u"Resultat:"
print resultat
wikipedia.stopme()