Ancoratges de bicicleta a Barcelona
Contingut
Introducció
L'ajuntament de Barcelona publica dades en format obert:
I les dades que estan geolocalitzades són susceptibles de ser impotades a OSM:
Tasques de l'importació de l'ajuntament de Barcelona
Punts d'ancoratges de bicicletes
Em centro en aquesta tasca:
- https://opendata-ajuntament.barcelona.cat/data/ca/dataset/punts-ancoratge-bicicletes
- http://ajuntament.barcelona.cat/bicicleta/ca
- mobilitat.ajuntament.barcelona.cat
El fitxer XML són 5MB, i s'actualitza cada setmana.
En el OSM aquests nodes estan definits pel tag:
Tag:amenity=bicycle_parking Tag Description name=* Larger areas of bike parking may be named. operator=* Cycle parking may be operated by some organisation. covered=* Parked bikes are protected from rain. access=* Public access is implied in most roadside cases. Some bike racks may be private with access limited to memberts of a university, company, or other organisation, possibly requiring keys or codes to access. capacity=* The number of bikes that can be parked here. fee=* In some places, one must pay to park one's bike. paid is a less widespread alias for this. bicycle_parking=* Details the type of bicycle parking (e.g. stands, wall loops...). cyclestreets_id=* A link to the ID (e.g. 12345) of the location describing a photo of the cycle parking in CycleStreets. Multiple IDs should be separated by semi-colons. maxstay=* Maximum time the bicycle is allowed to be parked at that place - given sometimes at covered parking-places. surveillance=* Closed-circuit television (CCTV) security cameras can be marked with this. See the linked page for details of the values in use. Depending on the layout, a separate node nearby may be enough.
Si em fixo en el XML, puc localitzar els parkings entre els tags row i /row:
<row pos="1368" num="1368"><item href="punt-d-ancoratge-de-bicicletes-pg-font-d-en-fargas-39_99400598884.html"><address label="Adreça"><![CDATA[Pg Font d'en Fargas 39]]></address> <city label="Població"><![CDATA[Barcelona]]></city> <code_url label="Web"><![CDATA[mobilitat.ajuntament.barcelona.cat]]></code_url> <district label="Districte"><![CDATA[Horta-Guinardó]]></district> <addresses><item><district><![CDATA[Horta-Guinardó]]></district> <barri><![CDATA[la Font d'en Fargues]]></barri> <city><![CDATA[Barcelona]]></city> <coordaddressx><![CDATA[30366.191]]></coordaddressx> <coordaddressy><![CDATA[86405.766]]></coordaddressy> <code_comarca><![CDATA[Barcelonès]]></code_comarca> <gmapx><![CDATA[41.424348190037]]></gmapx> <gmapy><![CDATA[2.1655367171792]]></gmapy> <address><![CDATA[Pg Font d'en Fargas 39]]></address> <streetnum><![CDATA[39]]></streetnum> </item></addresses><interestinfo><item><interinfo><![CDATA[mobilitat.ajuntament.barcelona.cat]]></interinfo> <intercode><![CDATA[00100003]]></intercode> <label><![CDATA[Web]]></label> </item></interestinfo><gmapx label="Lat"><![CDATA[41.424347]]></gmapx> <gmapy label="Long"><![CDATA[2.1655366]]></gmapy> <id label=""><![CDATA[99400598884]]></id> <name label="Nom"><![CDATA[Punt d'Ancoratge de Bicicletes * Pg Font d'en Fargas, 39]]></name> <type label="Tipus"><![CDATA[Entitats i equipaments]]></type> <pos label=""><![CDATA[1368]]></pos> <tp label=""><![CDATA[EQ]]></tp> </item></row>
Si ho netegem:
<row pos="1368" num="1368"> <item href="punt-d-ancoratge-de-bicicletes-pg-font-d-en-fargas-39_99400598884.html"> <address label="Adreça"><![CDATA[Pg Font d'en Fargas 39]]></address> <city label="Població"><![CDATA[Barcelona]]></city> <code_url label="Web"><![CDATA[mobilitat.ajuntament.barcelona.cat]]></code_url> <district label="Districte"><![CDATA[Horta-Guinardó]]></district> <addresses> <item> <district><![CDATA[Horta-Guinardó]]></district> <barri><![CDATA[la Font d'en Fargues]]></barri> <city><![CDATA[Barcelona]]></city> <coordaddressx><![CDATA[30366.191]]></coordaddressx> <coordaddressy><![CDATA[86405.766]]></coordaddressy> <code_comarca><![CDATA[Barcelonès]]></code_comarca> <gmapx><![CDATA[41.424348190037]]></gmapx> <gmapy><![CDATA[2.1655367171792]]></gmapy> <address><![CDATA[Pg Font d'en Fargas 39]]></address> <streetnum><![CDATA[39]]></streetnum> </item> </addresses> <interestinfo> <item> <interinfo><![CDATA[mobilitat.ajuntament.barcelona.cat]]></interinfo> <intercode><![CDATA[00100003]]></intercode> <label><![CDATA[Web]]></label> </item> </interestinfo> <gmapx label="Lat"><![CDATA[41.424347]]></gmapx> <gmapy label="Long"><![CDATA[2.1655366]]></gmapy> <id label=""><![CDATA[99400598884]]></id> <name label="Nom"><![CDATA[Punt d'Ancoratge de Bicicletes * Pg Font d'en Fargas, 39]]></name> <type label="Tipus"><![CDATA[Entitats i equipaments]]></type> <pos label=""><![CDATA[1368]]></pos> <tp label=""><![CDATA[EQ]]></tp> </item> </row>
Parsejar el document XML
script parsejar_ancoratges_v2.py:
from xml.dom import minidom #xmldoc = minidom.parse('ancoratge_min.xml') xmldoc = minidom.parse('PuntsAncoratgeBicicletes.xml') addresseslist = xmldoc.getElementsByTagName('addresses') #print(len(addresseslist)) num_item=1 gmapy=0 gmapx=0 address="" for r in addresseslist: #print(len(addresseslist)) if (r.nodeType != r.TEXT_NODE): items = r.childNodes #print(len(items)) for s in items: #print(s) if (s.nodeType != s.TEXT_NODE): dins_item = s.childNodes #print(len(dins_item)) for t in dins_item: if (t.nodeType != t.TEXT_NODE): if (t.tagName == 'gmapy'): gmapy = t.firstChild.nodeValue if (t.tagName == 'gmapx'): gmapx = t.firstChild.nodeValue if (t.tagName == 'address'): address = t.firstChild.nodeValue print "#" , str(num_item) print gmapy print gmapx print address print num_item += 1
... # 2998 2.1600532629808 41.376348053996 C Manso 19 # 2999 2.1568114112962 41.37668108035 Av Mistral 37 # 3000 2.1537192230105 41.378777681885 G.V. Corts Catalanes 445
Quants bicycle_parking hi ha?
Abans de fer cap canvi, a Barcelona ciutat hi ha uns 400 nodes (octubre 2019). S'ha de distingir entre buscar per Barcelona provínica, i Barcelona ciutat. Aquest és un tema una mica difícil (TBD).
Barcelona província:
area["name"="Barcelona"]->.boundaryarea; ( nwr(area.boundaryarea)[amenity='bicycle_parking']; ); out meta;
Barcelona ciutat:
{{geocodeArea:"Barcelona"}}->.boundaryarea; ( nwr(area.boundaryarea)[amenity='bicycle_parking']; ); out meta;
Barcelona ciutat, millor (només nodes, sense ways):
{{geocodeArea:"Barcelona"}}->.boundaryarea; ( node["amenity"="bicycle_parking"](area.boundaryarea); ); out meta;
Barcelon ciutat, amb icona de bicicleta:
{{geocodeArea:"Barcelona"}}->.boundaryarea; ( node["amenity"="bicycle_parking"](area.boundaryarea); ); out meta; {{style: node[amenity=bicycle_parking] { icon-image: url('http://free-icon-rainbow.com/i/icon_01944/icon_019440_256.png'); icon-width: 20; icon-height: 20; } }}
Tenint en compte que l'ajuntament de Barcelona, a través del seu servei opendata, proporciona informació d'uns 3000 punts d'ancoratge, actualitzats setmanalment, serà bo actualitzar aquesta informació, i fer-ho de manera que es pugui executar aquest script en una base mensual/anual.
La part interessant és: què passa si desapareix un punt d'ancoratge? el script hauria de ser capaç d'actualitzar i inserir, sinó també eliminar els punts d'ancoratge que ja no hi són.
Dades actuals: Amb la consulta de overpass-turbo.eu puc gravar el fitxer xml que inclou la informació actual:
... <node id="5136292422" lat="41.3888467" lon="2.1687274" version="2" timestamp="2018-06-30T08:45:04Z" changeset="60297159" uid="170106" user="sanchi"> <tag k="access" v="yes"/> <tag k="amenity" v="bicycle_parking"/> <tag k="capacity" v="20"/> <tag k="covered" v="no"/> <tag k="fee" v="no"/> </node> ...
Ho gravo en el fitxer punts_ancoratge_actuals.xml
Cercar els punts d'ancoratge que han desaparegut, i eliminar
Abans de fer la inserció i actualització, he de cercar els punts d'ancoratge que han desaparegut. Per fer-ho tinc els dos fitxers: punts_ancoratge_actuals.xml, i PuntsAncoratgeBicicletes.xml que m'he descarregat de la web d'opendata de l'ajuntament.
Encara que sigui una mica lent i ineficient, es tracta de recórrer tots els punts d'ancoratge actuals i cercar-los (en un àmbit de 10m) dins el fitxer que he descarregat de l'ajuntament. En el cas de què no es trobi, voldrà dir que aquest punt d'ancoratge ha desaparegut, i s'haurà d'eliminar el node.
Com és lògic, s'ha d'establir un criteri de proximitat per saber si un punt d'ancoratge existeix o no. Prime he provat amb 12m, després he ampliat a 20m. Hi ha punts d'ancoratge que a OSM no s'han editat des de 2019. Per tant, té sentit de què hi hagi punts que ja no existeixen.
Dels 392 punts, n'eliminaré uns 130.
scripts:
- cercar_ancoratges_bici_que_han_desaparegut.py
- cercar_ancoratges_bici_que_han_desaparegut_i_eliminar.py
Actualització i inserció dels punts d'ancoratge
script importar_ancoratges_bici_bcn_v2.py
Com que són quasi 3000 punts d'ancoratge, primer faig el script interactiu, i després ja faig tota l'actualització en bulk.
creat per Joan Quintana Compte, octubre 2019