[Python] R: R: Elenco strade italiane per comune

Alberto Abate alberto.abate a gmail.com
Mer 4 Gen 2012 16:18:14 CET


Riprendo il discorso inserendo l'evoluzione delle mie ricerche...

  import simplejson
>
>   import requests
>
>
>>   address = 'Galatina'
>
>   latlng = 40.1775244,18.1696415
>
>   coda = '&sensor=false'
>
>   params_address = 'address=' + address + coda
>
>   params_latlng = 'latlng=' + str(latlng) + coda
>
>   print params_address
>
>
>>   #r = requests.get('http://www.google.com', proxies={"http":"
>> http://myproxy:3129"})
>
>
>
>   r = requests.get('
>> http://maps.google.com/maps/api/geocode/json?'+params_address)
>
>   if r.status_code == requests.codes.ok:
>
>     ris = simplejson.loads(r.content)
>
>
>
>     #print ris
>
>     address_components = ris['results'][0]['address_components']
>
>
>
>     for address in address_components:
>
>       #print address['long_name'], address['short_name'], address['types']
>
>
>
>       if address['types'] == [u'locality', u'political']:
>
>         comune = address['long_name']
>
>
>>       if address['types'] == [u'administrative_area_level_2',
>> u'political']:
>
>         provincia = address['long_name']
>
>         cod_prov = address['short_name']
>
>
>>       if address['types'] == [u'administrative_area_level_1',
>> u'political']:
>
>         regione = address['long_name']
>
>
>>       if address['types'] == [u'country', u'political']:
>
>         stato = address['long_name']
>
>         cod_stato = address['short_name']
>
>
>>       if address['types'] == [u'postal_code']:
>
>         cap = address['long_name']
>
>
>>     print comune, provincia, cod_prov, cap
>
>     print regione, stato, cod_stato
>
>
>>
>>     max_lat = ris['results'][0]['geometry']['bounds']['northeast']['lat']
>
>     min_lat = ris['results'][0]['geometry']['bounds']['southwest']['lat']
>
>
>>     max_lng = ris['results'][0]['geometry']['bounds']['northeast']['lng']
>
>     min_lng = ris['results'][0]['geometry']['bounds']['southwest']['lng']
>
>
>>     print 'min_lat',min_lat
>
>     print 'max_lat',max_lat
>
>     print 'min_lng',min_lng
>
>     print 'max_lng',max_lng
>
>
>>
>>     strade = []
>
>     i = 0
>
>     step = 0.0010000
>
>
>>     """
>
>     for lat in frange(min_lat, max_lat, step):
>
>       for lon in frange(min_lon, max_lon, step):
>
>         indirizzo = Geocoder.latlng_to_address(lat, lon)
>
>         # sleep(5)
>
>         if indirizzo not in strade:
>
>           strade.append(str(lat)+'_'+str(lon)+'_'+indirizzo)
>
>           i += 1
>
>
>>     print 'Count: ',i
>
>
>>     strade.sort()
>
>     for s in strade:
>
>       print s
>
>
>>     """
>
>
>
Commento qualcosa:

@ Pietro
> In che senso non sono affidabili? in che formato lo vorresti? un json
> con: provincia, comune, vie?
> magari parlandone con la comunity di osm lo possiamo fare...

sono inaffidabili nel senso che i nomi delle strade sono davvero pochi e
ogni file di regione
pesa 130 mb, un po' troppi per analizzarli in modo semplice e controllare
aggiornamenti...
Non so, mi sembra davvero complesso, con i file osm.

@ Salvadori Giordano

> Buono il metodo ma la limitazione è effettivamente un “po’ bloccante”.****

> Potresti però fare le richieste con Ip diversi (metodo con i proxy) in
modo che Google non > ti blocchi non riconoscendoti come lo stesso utente.**
**

> Da quale pkg si installa api che viene richiesto in import dall’esempio
con cloudmade???

In effetti sto pensando proprio di usare una lista di proxy per bypassare
il limite delle
2500/day richieste.
Ho trovato questo modulo python: si chiama requests e semplifica di molto
una richiesta nel mio caso json dalle api di google.

http://docs.python-requests.org/en/latest/

Come vedete nel codice ho messo una riga commentata che preannuncia la
possibilità di gestire le chiamate con proxy...
Devo solo trovare una lista di proxy anonimi da provare.

Usando il modulo simplejson riesco a trasformare la richiesta in un
dizionario che leggo
facilmente.
Con "requests" e "simplejson" evito di usare il modulo "pygeocoder" che mi
sta simpatico
per facilità d'uso, ma in effetti non fa altro che incapsulare la chiamata
che faccio
facilmente con requests in json (ma spulciando la documentazione vedo che
va bene anche per html)


Ho usato cloudmade, ma occorre registrarsi al sito per ottenere una key da
inserire nel codice. Come vedi dal codice sopra, "api" è importato da
"cloudmade" stesso;
se installi cloudmade lo trovi dentro. Io uso easy_install è molto comodo
per installare
moduli in python


per effettuare delle query sulle api di google non occorre autenticarsi, ma
si può
fare liberamente restando sotto le 2500 richieste al giorno.

Per quanto riguarda rest di viamichelin mi pare che si escluda da solo per
il fatto
che sia a pagamento...

Sono un po' in dubbio sul metodo di scansione dei bounds, troppo
inefficiente...
Ok, mi sa che ho parlato pure troppo,
torno a studiare...

Qualunque consiglio è ben accetto
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20120104/676ecf54/attachment-0001.html>


Maggiori informazioni sulla lista Python