[2/10]Eh puis, il y a les coordonnées GPS et les images

Je continuais à oeuvrer l’amélioration du monde. Malheureusement, ce n’était pas encore aujourd’hui que j’allais sortir car pour prendre des photos, il fallait que je sache où aller. Le bon côté, c’était que dans les listes wiki, il y avait un paramètre « coordonnées GPS » (la 6e colonne). Le bug, c’était que tout était à zéro. De plus, plusieurs communes avaient le même problème.

De nouveau, Bruxelles manquait à l’appel et de nouveau, je devais faire valdinguer mes doigts sur mon clavier. En cherchant un peu : avec python, CTRL-V CTRL-C, j’arrivais à qqch de plus ou moins correct.

#!/usr/bin/python

from geopy.geocoders import Nominatim
import sys
import time

geolocator = Nominatim()

def do_geocode(address):
    try:
        return geolocator.geocode(address)
    except Exception:
        print("Raise GeoCode")
        time.sleep(10)
        return do_geocode(address)


print("StartCode  "+ ",".join(sys.argv))

with open(sys.argv[1]) as f:
        content = f.readlines()

for i,l in enumerate(content):
        if l.strip().endswith("{{Coord|0|0|format=dms|type:landmark}}") :
                if  content[i-1].strip() != "|" :       
                        k = content[i-1].split(',')[0].strip().replace("[", "").replace("[","")+ " Bruxelles"  

                        location = do_geocode(k)
                        if location == None : 
                                print ("NO DATA FOUND : " + str(i)+"/"+str(len(content)),content[i])
                                continue                                
                        content[i] = "| {{Coord|%.6f|%.6f|format=dms|type:landmark}}\n"%(location.latitude, location.longitude)
                        print(str(i)+"/"+str(len(content)),content[i])
                else :
                        print ("STREET EMPTY : " + str(i)+"/"+str(len(content)),content[i])
with open('New_'+sys.argv[1], 'w') as fp:
        fp.write("".join(content))

Je savais que ce n’était pas parfait, mais cela faisait le job. Bien sûr, il y avait encore des erreurs, mais j’affinerais plus tard. Non, ce qui me gênait, c’était la génération sur carte. En cliquant sur le lien OpenStreetMap en bas, je tombais sur cela.

osm
Non mais quand on y pense, c’est grand Bruxelles, cela va jusqu’au Bénin !

Qu’est ce qui n’allait pas, me direz-vous ?

  • Les noms, c’étaient les ID. Autant dire inutilisables.
  • Il y avait une coordonnée en (0,0). Cela faisait con, ça ne centrait pas la carte.

Allez hop, c’était reparti pour un nouveau script.

#!/usr/bin/python

import sys
with open(sys.argv[1]) as f:
        content = f.readlines()

for i,l in enumerate(content):
        if l.strip().endswith("{{Coord|0|0|format=dms|type:landmark}}") :
                content[i]  = "| \n"
                continue
        if l.strip().endswith("format=dms|type:landmark}}") :
                if  content[i-6].strip() != "|" :       
                        content[i] = l.split("}}")[0]
                        k = content[i-6].split(',')[0].strip().replace("[", "").replace("]","").replace("|","").strip()  
                        content[i] += "|name="+k+"}}\n"

with open('To_New_'+sys.argv[1], 'w') as fp:
        fp.write("".join(content))

Et là, magie….

ss.png

Chaque petit point bleu qui apparaissait était un instantané à prendre. Il y avait quelques erreurs, mais comme base de travail, je pouvais considérer cela comme suffisant.

Puis, il y a les images

Enfin j’arrivais à la dernière brique. Les dernières lignes me nettoyaient le tableau ayant déjà des photos. Wikipédia avait mis en place quelque chose de pratique, le bac à sable. Un endroit où je pouvais faire tous les tests que je voulais, et j’en profitais le plus que je pouvais.

#!/usr/bin/python
import sys


with open(sys.argv[1]) as f:
        content = f.readlines()

for i,l in enumerate(content):
        if l.strip() ==  "|-" :
                if content[i+10].strip() == '|' \
                        or content[i+10].find('Defaut 2.svg') > -1 \
                        or content[i+10].find('Defaut.svg') > -1:
                        continue
                content[i] = ''
                content[i+1] = ''
                content[i+2] = ''
                content[i+3] = ''
                content[i+4] = ''
                content[i+5] = ''
                content[i+6] = ''
                content[i+7] = ''
                content[i+8] = ''
                content[i+9] = ''
                content[i+10] = ''

u = 1;
for i,l in enumerate(content):
        if l.strip() ==  "|-" :
                content[i+1] = '|'+str(u)+'\n'
                u+=1

with open('To_New_'+sys.argv[1], 'w') as fp:
        fp.write("".join(content))

Ouip, ce code était tapé avec les pieds, mais pas envie de m’emmerder, je fatiguais. Une fois lancé, tourné et sauvegardé, il restait 1000 endroits à photographier, dont tous ceux à Bruxelles. Ça faisait beaucoup, surtout que beaucoup d’endroits avaient déjà été faits. Il me fallait autre chose, un moyen de trouver les photos par rapport aux noms.

En regardant la politique de nommage des images sur Wikipédia, je remarquais que les noms des photos étaient basés sur le nom ou bien sur le nom de la rue. J’étais de nouveau parti pour 3 heures de coding, lisant la documentation, l’API et les exemples que je pouvais trouver sur internet (spécial dédicace aux deux lignes suivantes) :

  g = lambda x: len([y for y in allNum if x.find(y) > -1 ]) > 0
  result = [x for x in result if g(x)]

Mais le résultat était là. Et après quelques instants, tadaaaa… ! J’arrivais à un peu moins de 500 endroits dans Bruxelles et les 19 communes.

LastStep.png
L’ensemble des points à photographier. Première version.

Conclusion

Semaine coding, encore. La préparation était longue mais nécessaire. Par contre, je pensais que le projet irait plus vite. Je me rendis compte que cela allait prendre pas mal de temps. Nous étions mi-décembre et toujours pas un pied dehors. Plus que six semaines dont deux de fêtes…

Concernant Wikipédia, je suis étonné que les wikitables, les tableaux Wikipédia, n’ont rien pour filtrer et travailler. Wikipédia avait été fait pour des petits changements, pas pour travailler avec des listes. Il faut bidouiller pour tout ce qui est génération de données et cela, je ne l’avais pas prévu.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s