Ancoratges de bicicleta a Barcelona

De wikijoan
Salta a la navegació Salta a la cerca

Introducció

Punts ancoratge bici2.png

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:

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