<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Arbres_Monumentals_de_Catalunya_%28programaci%C3%B3_OSM%29</id>
	<title>Arbres Monumentals de Catalunya (programació OSM) - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Arbres_Monumentals_de_Catalunya_%28programaci%C3%B3_OSM%29"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Arbres_Monumentals_de_Catalunya_(programaci%C3%B3_OSM)&amp;action=history"/>
	<updated>2026-09-22T21:22:50Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Arbres_Monumentals_de_Catalunya_(programaci%C3%B3_OSM)&amp;diff=258948&amp;oldid=prev</id>
		<title>Joan: /* wikipedia, llista d'arbrs catalogats */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Arbres_Monumentals_de_Catalunya_(programaci%C3%B3_OSM)&amp;diff=258948&amp;oldid=prev"/>
		<updated>2020-02-14T17:13:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;wikipedia, llista d&amp;#039;arbrs catalogats&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
[[Fitxer:Arbres catalunya.png | thumbnail]]&lt;br /&gt;
=Introducció=&lt;br /&gt;
Volem actualitzar els arbres monumentals de Catalunya a partir de:&lt;br /&gt;
*https://ca.wikipedia.org/wiki/Llista_d%27arbres_monumentals_de_Catalunya&lt;br /&gt;
Es tracta de fer un script python per actualitzar la informació ja existent d'un arbre/node. I si no existeix, inserir l'arbre/node.&lt;br /&gt;
&lt;br /&gt;
En aquest article es documenta tot el procés fins arribar al script funcional. Es desitja que el script sigui semi-automàtic per tal de poder comparar sempre la informació existent i la nova, i poder abortar el script en cas de dubte.&lt;br /&gt;
&lt;br /&gt;
=Cercar els arbres que hi ha a Catalunya (OSM)=&lt;br /&gt;
*https://overpass-turbo.eu/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
node&lt;br /&gt;
  [&amp;quot;tree&amp;quot;]&lt;br /&gt;
  ({{bbox}});&lt;br /&gt;
(._;&amp;gt;;);&lt;br /&gt;
out;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
resultat:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;2315628015&amp;quot; lat=&amp;quot;41.3950882&amp;quot; lon=&amp;quot;2.0110520&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;natural&amp;quot; v=&amp;quot;tree&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;tree&amp;quot; v=&amp;quot;pinus&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
node&lt;br /&gt;
  [&amp;quot;natural&amp;quot;=&amp;quot;tree&amp;quot;]&lt;br /&gt;
  ({{bbox}});&lt;br /&gt;
(._;&amp;gt;;);&lt;br /&gt;
out;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
resultat:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;node id=&amp;quot;409741485&amp;quot; lat=&amp;quot;41.6286762&amp;quot; lon=&amp;quot;2.1700571&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;genus&amp;quot; v=&amp;quot;Olea&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;natural&amp;quot; v=&amp;quot;tree&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;species&amp;quot; v=&amp;quot;Olea europaea&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;species:ca&amp;quot; v=&amp;quot;Olivera&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;5613734131&amp;quot; lat=&amp;quot;41.3460831&amp;quot; lon=&amp;quot;1.3627114&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;Xiprers del Palau de l'Abat de Santes Creus&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;natural&amp;quot; v=&amp;quot;tree&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;note&amp;quot; v=&amp;quot;Arbre Monumental MA-01.001.01 https://ca.wikipedia.org/wiki/Llista_d%27arbres_monumentals_de_Catalunya&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
és a dir, els arbres els puc trobar buscant per tag=tree (de fet, només n'hi ha 6), o bé tag=natural v=tree (que és la manera correcta).&lt;br /&gt;
&lt;br /&gt;
i ara faig el mateix, però cercant directament per 'Catalunya' en comptes de la bbox:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
area[&amp;quot;name&amp;quot;=&amp;quot;Catalunya&amp;quot;]-&amp;gt;.boundaryarea;&lt;br /&gt;
(&lt;br /&gt;
nwr(area.boundaryarea)[natural=tree];&lt;br /&gt;
nwr(area.boundaryarea)[tree];&lt;br /&gt;
);&lt;br /&gt;
out meta;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i ara genero la llista d'arbres en format JSON (o XML) amb un script python que fa aquesta consulta (''arbres.py''):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import requests&lt;br /&gt;
import json&lt;br /&gt;
overpass_url = &amp;quot;http://overpass-api.de/api/interpreter&amp;quot;&lt;br /&gt;
overpass_query = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
[out:json];&lt;br /&gt;
area[&amp;quot;name&amp;quot;=&amp;quot;Catalunya&amp;quot;]-&amp;gt;.boundaryarea;&lt;br /&gt;
(&lt;br /&gt;
nwr(area.boundaryarea)[natural=tree];&lt;br /&gt;
nwr(area.boundaryarea)[tree];&lt;br /&gt;
);&lt;br /&gt;
out meta;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
response = requests.get(overpass_url, &lt;br /&gt;
                        params={'data': overpass_query})&lt;br /&gt;
#JSON:&lt;br /&gt;
#data = response.json()&lt;br /&gt;
#print data&lt;br /&gt;
&lt;br /&gt;
#XML:&lt;br /&gt;
print response.content;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python arbres.py &amp;gt; arbres.json&lt;br /&gt;
$ python arbres.py &amp;gt; arbres.xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
També podem comptar els arbres (''arbres_count.py''):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import requests&lt;br /&gt;
import json&lt;br /&gt;
overpass_url = &amp;quot;http://overpass-api.de/api/interpreter&amp;quot;&lt;br /&gt;
overpass_query = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
[out:csv(::count, ::&amp;quot;count:nodes&amp;quot;, ::&amp;quot;count:ways&amp;quot;, ::&amp;quot;count:relations&amp;quot;)][timeout:25];&lt;br /&gt;
area[&amp;quot;name&amp;quot;=&amp;quot;Catalunya&amp;quot;]-&amp;gt;.boundaryarea;&lt;br /&gt;
(&lt;br /&gt;
nwr(area.boundaryarea)[natural=tree];&lt;br /&gt;
nwr(area.boundaryarea)[tree];&lt;br /&gt;
);&lt;br /&gt;
out count;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
response = requests.get(overpass_url, &lt;br /&gt;
                        params={'data': overpass_query})&lt;br /&gt;
#JSON:&lt;br /&gt;
#data = response.json()&lt;br /&gt;
#print data&lt;br /&gt;
&lt;br /&gt;
#XML:&lt;br /&gt;
print response.content;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python arbres_count.py &lt;br /&gt;
@count	@count:nodes	@count:ways	@count:relations&lt;br /&gt;
115685	115683	2	0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Esten parlant de 115000 arbres a Catalunya ingressats a OSM&lt;br /&gt;
&lt;br /&gt;
=wikipedia, llista d'arbres catalogats=&lt;br /&gt;
*https://ca.wikipedia.org/wiki/Llista_d%27arbres_monumentals_de_Catalunya&lt;br /&gt;
Hi ha uns 250 arbres catalogats&lt;br /&gt;
&lt;br /&gt;
Donada una posició geogràfica, vull saber si al voltant d'aquest punt (diguem 50m) hi ha un arbre. És a dir, vull buscar si l'arbre ja existeix a la base de dades (i aleshores només s'hauria d'actualitzar la informació).&lt;br /&gt;
&lt;br /&gt;
La manera de localitzar arbres al voltant d'un punt (50 m) és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
node&lt;br /&gt;
  [&amp;quot;natural&amp;quot;=&amp;quot;tree&amp;quot;]&lt;br /&gt;
  (around:50,41.3461,1.3627);&lt;br /&gt;
out;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i ja puc recórrer tots les posicions on hi ha d'haver arbres catalogats, i cercar les coincidències (''recorrer_arbres_catalogats_v2.py'').&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import requests&lt;br /&gt;
import json&lt;br /&gt;
overpass_url = &amp;quot;http://overpass-api.de/api/interpreter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
locations=[(41.3461,1.3627),(41.3936,1.4625)]&lt;br /&gt;
for loc in locations:&lt;br /&gt;
	print loc[0], loc[1]	&lt;br /&gt;
	overpass_query = &amp;quot;node[natural=tree](around:50,%f,%f); out;&amp;quot; % (loc[0], loc[1])&lt;br /&gt;
	#print overpass_query;&lt;br /&gt;
&lt;br /&gt;
	response = requests.get(overpass_url, params={'data': overpass_query})&lt;br /&gt;
	print response.content;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per ex, en la posicio (41.3936,1.4625) hi ha d'haver un arbre catalogat i només es fa referència a una alzina:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;osm version=&amp;quot;0.6&amp;quot; generator=&amp;quot;Overpass API 0.7.55.1009 5e627b63&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;note&amp;gt;The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.&amp;lt;/note&amp;gt;&lt;br /&gt;
&amp;lt;meta osm_base=&amp;quot;2019-10-24T11:28:02Z&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;node id=&amp;quot;5613735415&amp;quot; lat=&amp;quot;41.3936696&amp;quot; lon=&amp;quot;1.4624844&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;name&amp;quot; v=&amp;quot;alzina&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;tag k=&amp;quot;natural&amp;quot; v=&amp;quot;tree&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/osm&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=2 possibilitats: s'haurà de crear un node, s'haurà d'editar un node=&lt;br /&gt;
He de distingir entre quan he trobat un node (per fer un update), i quan no he trobat el node (per fer un create)&lt;br /&gt;
*https://stackoverflow.com/questions/47594274/python-jxmlease-issue&lt;br /&gt;
&lt;br /&gt;
script ''recorrer_arbres_catalogats_v3.py''&lt;br /&gt;
&lt;br /&gt;
He d'instal·lar jxmlease per tal de poder parsejar el xml&lt;br /&gt;
&lt;br /&gt;
M'ha donat problemes de permisos en la instal·lació de jxmlease, i he necessitat l'opció --user:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pip install --user jxmlease&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import requests&lt;br /&gt;
import json&lt;br /&gt;
import jxmlease&lt;br /&gt;
overpass_url = &amp;quot;http://overpass-api.de/api/interpreter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#locations=[(41.3461,1.3627),(41.3936,1.4625),(41.3900,1.4600)]&lt;br /&gt;
locations=[(41.3461,1.3627)]&lt;br /&gt;
for loc in locations:&lt;br /&gt;
	print loc[0], loc[1]	&lt;br /&gt;
	overpass_query = &amp;quot;node[natural=tree](around:50,%f,%f); out;&amp;quot; % (loc[0], loc[1])&lt;br /&gt;
	#print overpass_query;&lt;br /&gt;
	response = requests.get(overpass_url, params={'data': overpass_query})&lt;br /&gt;
	print response.content;&lt;br /&gt;
	&lt;br /&gt;
	#volem recuperar el id del node que hem trobat&lt;br /&gt;
	root = jxmlease.parse(response.content)&lt;br /&gt;
&lt;br /&gt;
	#1a manera&lt;br /&gt;
	node = root['osm']['node']&lt;br /&gt;
	print(node.get_xml_attr(&amp;quot;id&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
	#2a manera	&lt;br /&gt;
	for i in root['osm'].find_nodes_with_tag('node', recursive=False):&lt;br /&gt;
		print i.get_xml_attr(&amp;quot;id&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hauré de fer un if per distingir entre els dos casos:&lt;br /&gt;
''recorrer_arbres_catalogats_v4.py'', ''recorrer_arbres_catalogats_v5.py ''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
	root = jxmlease.parse(response.content)&lt;br /&gt;
&lt;br /&gt;
	#2a manera&lt;br /&gt;
	num = 0	&lt;br /&gt;
	for i in root['osm'].find_nodes_with_tag('node', recursive=False):&lt;br /&gt;
		print &amp;quot;node: &amp;quot; + i.get_xml_attr(&amp;quot;id&amp;quot;) + &amp;quot; en les immediacions&amp;quot;&lt;br /&gt;
		num+=1;&lt;br /&gt;
&lt;br /&gt;
	if (num==0):&lt;br /&gt;
		print(&amp;quot;no hem trobat cap arbre-node en les immediacions&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
41.3461 1.3627&lt;br /&gt;
node: 5613734131 en les immediacions&lt;br /&gt;
41.3936 1.4625&lt;br /&gt;
node: 5613735415 en les immediacions&lt;br /&gt;
41.39 1.46&lt;br /&gt;
no hem trobat cap arbre-node en les immediacions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=Python interactiu: vull fer els canvis (yes/no)?=&lt;br /&gt;
Recorro tots els nodes d'un array. Per cada node, el script m'ha de preguntar si vull fer els canvis, si o no?&lt;br /&gt;
*https://stackoverflow.com/questions/983354/how-do-i-make-python-to-wait-for-a-pressed-key&lt;br /&gt;
&lt;br /&gt;
La solució està a arbres_monumentals/proves/prova_presskey2.py a partir de la solució que es proposa en l'enllaç:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import termios, fcntl, sys, os&lt;br /&gt;
fd = sys.stdin.fileno()&lt;br /&gt;
&lt;br /&gt;
oldterm = termios.tcgetattr(fd)&lt;br /&gt;
newattr = termios.tcgetattr(fd)&lt;br /&gt;
newattr[3] = newattr[3] &amp;amp; ~termios.ICANON &amp;amp; ~termios.ECHO&lt;br /&gt;
termios.tcsetattr(fd, termios.TCSANOW, newattr)&lt;br /&gt;
&lt;br /&gt;
oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)&lt;br /&gt;
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    while 1:&lt;br /&gt;
        try:&lt;br /&gt;
            c = sys.stdin.read(1)&lt;br /&gt;
            print &amp;quot;Got character&amp;quot;, repr(c)&lt;br /&gt;
        except IOError: pass&lt;br /&gt;
finally:&lt;br /&gt;
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)&lt;br /&gt;
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Programació Osmapi: crear, editar, esborrar nodes=&lt;br /&gt;
El següent pas és poder actualitzar la informació d'un node, des de Python. Per exemple, el node id=&amp;quot;5613735415&amp;quot;&lt;br /&gt;
*https://wiki.openstreetmap.org/wiki/Osmapi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pip install --user osmapi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ja podem crear un node a OSM, seguint l'exemple bàsic de la documentació. script ''osmpai_v2.py'':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# encoding: utf-8&lt;br /&gt;
from osmapi import OsmApi&lt;br /&gt;
#MyApi = OsmApi(username = u&amp;quot;joanqc@gmail.com&amp;quot;, password = u&amp;quot;jq********&amp;quot;)&lt;br /&gt;
MyApi = OsmApi(passwordfile=&amp;quot;/home/joan/projectes/arbres_monumentals/.password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
MyApi.ChangesetCreate({u&amp;quot;comment&amp;quot;: u&amp;quot;Modificació de prova en el Camp Llarg&amp;quot;})&lt;br /&gt;
print(MyApi.NodeCreate({u&amp;quot;lat&amp;quot;:42.25543, u&amp;quot;lon&amp;quot;:1.85804, u&amp;quot;tag&amp;quot;: {}}))&lt;br /&gt;
MyApi.ChangesetClose()&lt;br /&gt;
&lt;br /&gt;
#{u'changeset': 76186141, u'version': 1, u'lon': 1.85743, u'tag': {}, u'lat': #42.25532, u'id': 6914599486}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
El format del passwordfile és joanqc@gmail.com:jq******** (o bé el nom d'usuari, ''joanillo'')&lt;br /&gt;
&lt;br /&gt;
Ara ja podem crear un arbre: ''osmapi_v3.py''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# encoding: utf-8&lt;br /&gt;
from osmapi import OsmApi&lt;br /&gt;
MyApi = OsmApi(passwordfile=&amp;quot;/home/joan/projectes/arbres_monumentals/.password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
MyApi.ChangesetCreate({u&amp;quot;comment&amp;quot;: u&amp;quot;Modificació de prova en el Camp Llarg&amp;quot;})&lt;br /&gt;
data = {u&amp;quot;lat&amp;quot;:42.25543, u&amp;quot;lon&amp;quot;:1.85804, u&amp;quot;tag&amp;quot;: { u&amp;quot;natural&amp;quot;: u&amp;quot;tree&amp;quot;, u&amp;quot;name&amp;quot;: u&amp;quot;Pi del Camp Llarg&amp;quot; }}&lt;br /&gt;
print(MyApi.NodeCreate(data))&lt;br /&gt;
MyApi.ChangesetClose()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I ara ja puc afegir totes les dades de l'arbre, i gravar automàticament les dades (amb flush()): ''osmapi_v4.py''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# encoding: utf-8&lt;br /&gt;
from osmapi import OsmApi&lt;br /&gt;
MyApi = OsmApi(passwordfile=&amp;quot;/home/joan/projectes/arbres_monumentals/.password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
MyApi.ChangesetCreate({u&amp;quot;comment&amp;quot;: u&amp;quot;Modificació de prova en el Camp Llarg&amp;quot;})&lt;br /&gt;
data = {u&amp;quot;lat&amp;quot;:42.25543, u&amp;quot;lon&amp;quot;:1.85804, u&amp;quot;tag&amp;quot;: { u&amp;quot;natural&amp;quot;: u&amp;quot;tree&amp;quot;, u&amp;quot;name&amp;quot;: u&amp;quot;Pi del Camp Llarg&amp;quot;, u&amp;quot;species&amp;quot;: u&amp;quot;Olea europea&amp;quot;, u&amp;quot;species:ca&amp;quot;: u&amp;quot;Olivera&amp;quot;, u&amp;quot;note&amp;quot;: u&amp;quot;Arbre Monumental (MA-01.001.01) https://ca.wikipedia.org/wiki/Llista_d%27arbres_monumentals_de_Catalunya&amp;quot; }}&lt;br /&gt;
print(MyApi.NodeCreate(data))&lt;br /&gt;
MyApi.ChangesetClose()&lt;br /&gt;
MyApi.flush()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Donat un node que ja existeix, el vull actualitzar. Aquesta és la manera de procedir: (''osmapi_v5.py''):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# encoding: utf-8&lt;br /&gt;
from osmapi import OsmApi&lt;br /&gt;
MyApi = OsmApi(passwordfile=&amp;quot;/home/joan/projectes/arbres_monumentals/.password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
MyApi.ChangesetCreate({u&amp;quot;comment&amp;quot;: u&amp;quot;Modificació de prova4 en el Camp Llarg&amp;quot;})&lt;br /&gt;
node = MyApi.NodeGet(6914950285)&lt;br /&gt;
tags = node[&amp;quot;tag&amp;quot;]&lt;br /&gt;
tags[u&amp;quot;natural&amp;quot;] = u&amp;quot;tree&amp;quot;&lt;br /&gt;
tags[u&amp;quot;name&amp;quot;] = u&amp;quot;Pi del Camp Llarg&amp;quot;&lt;br /&gt;
tags[u&amp;quot;species&amp;quot;] = u&amp;quot;Pinus sylvestris&amp;quot;&lt;br /&gt;
tags[u&amp;quot;species:ca&amp;quot;] = u&amp;quot;pi roig&amp;quot;&lt;br /&gt;
tags[u&amp;quot;note&amp;quot;] = u&amp;quot;Arbre Monumental (MA-01.001.01) https://ca.wikipedia.org/wiki/Llista_d%27arbres_monumentals_de_Catalunya&amp;quot;&lt;br /&gt;
&lt;br /&gt;
print(MyApi.NodeUpdate(node))&lt;br /&gt;
MyApi.ChangesetClose()&lt;br /&gt;
MyApi.flush()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I ara vull esborrar el node programàticament (''osmpai_v6.py''):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# encoding: utf-8&lt;br /&gt;
from osmapi import OsmApi&lt;br /&gt;
MyApi = OsmApi(passwordfile=&amp;quot;/home/joan/projectes/arbres_monumentals/.password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
MyApi.ChangesetCreate({u&amp;quot;comment&amp;quot;: u&amp;quot;Eliminació del pi en el Camp Llarg&amp;quot;})&lt;br /&gt;
node = MyApi.NodeGet(6914920685)&lt;br /&gt;
&lt;br /&gt;
MyApi.NodeDelete(node)&lt;br /&gt;
MyApi.ChangesetClose()&lt;br /&gt;
MyApi.flush()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=arbres.json: carregar la llista d'arbres=&lt;br /&gt;
Una petita mostra de les dades&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
{&amp;quot;name&amp;quot;:&amp;quot;Xiprers del Palau de l'Abat de Santes Creus&amp;quot;,&amp;quot;lat&amp;quot;:&amp;quot;41.3461&amp;quot;,&amp;quot;lon&amp;quot;:&amp;quot;1.3628&amp;quot;,&amp;quot;species&amp;quot;:&amp;quot;Cupressus sempervirens&amp;quot;,&amp;quot;species:ca&amp;quot;:&amp;quot;xiprer&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;Arbre Monumental (MA-01.001.01) https://ca.wikipedia.org/wiki/Llista_d%27arbres_monumentals_de_Catalunya&amp;quot;},&lt;br /&gt;
{&amp;quot;name&amp;quot;:&amp;quot;Alzina de la Casa Nova de Bonany&amp;quot;,&amp;quot;lat&amp;quot;:&amp;quot;41.3936&amp;quot;,&amp;quot;lon&amp;quot;:&amp;quot;1.4625&amp;quot;,&amp;quot;species&amp;quot;:&amp;quot;Quercus ilex subsp. ilex&amp;quot;,&amp;quot;species:ca&amp;quot;:&amp;quot;alzina&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;Arbre Monumental (MA-01.120.01) https://ca.wikipedia.org/wiki/Llista_d%27arbres_monumentals_de_Catalunya&amp;quot;},&lt;br /&gt;
{&amp;quot;name&amp;quot;:&amp;quot;Suro del Mas Perxés&amp;quot;,&amp;quot;lat&amp;quot;:&amp;quot;42.3964&amp;quot;,&amp;quot;lon&amp;quot;:&amp;quot;2.8353&amp;quot;,&amp;quot;species&amp;quot;:&amp;quot;Quercus suber&amp;quot;,&amp;quot;species:ca&amp;quot;:&amp;quot;alizina surera&amp;quot;,&amp;quot;note&amp;quot;:&amp;quot;Arbre Monumental (MA-02.001.01) https://ca.wikipedia.org/wiki/Llista_d%27arbres_monumentals_de_Catalunya&amp;quot;}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per carregar les dades amb Python:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
with open('arbres.json', 'r') as f:&lt;br /&gt;
    arbres_dict = json.load(f)&lt;br /&gt;
&lt;br /&gt;
for arbre in arbres_dict:&lt;br /&gt;
    print(arbre['name'])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Posar-ho tot junt: importar_arbres_monumentals_v1.py=&lt;br /&gt;
[[Fitxer:Arbres monumentals.png | thumbnail]]&lt;br /&gt;
El script recorre els arbres monumentals per actualitzar o inserir. Sempre es té en compte la informació que ja existeix, per tal de respectar-la al màxim. Quan detectem un arbre que ja existeix es compara els valors antics amb els valors nous, i es pot procedir a actualitzar, o bé s'aborta per actualitzar la nostra informació amb la que ja existeix.&lt;br /&gt;
&lt;br /&gt;
Aquest script s'ha realitzat amb la idea de què es pugui reutilitzar en altres exemples que no tinguin res a veure amb els arbres monumentals. Allà on s'hagi d'inserir/actualitzar informació de manera semi-automàtica.&lt;br /&gt;
&lt;br /&gt;
script '''importar_arbres_monumentals_v1.py''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# encoding: utf-8&lt;br /&gt;
&lt;br /&gt;
import json #parsejar JSON&lt;br /&gt;
&lt;br /&gt;
import termios, fcntl, sys, os #script interactiu&lt;br /&gt;
&lt;br /&gt;
import requests #cercar node&lt;br /&gt;
import jxmlease&lt;br /&gt;
&lt;br /&gt;
from osmapi import OsmApi #create, update node&lt;br /&gt;
&lt;br /&gt;
overpass_url = &amp;quot;http://overpass-api.de/api/interpreter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#---&lt;br /&gt;
def press_key():&lt;br /&gt;
	fd = sys.stdin.fileno()&lt;br /&gt;
&lt;br /&gt;
	oldterm = termios.tcgetattr(fd)&lt;br /&gt;
	newattr = termios.tcgetattr(fd)&lt;br /&gt;
	newattr[3] = newattr[3] &amp;amp; ~termios.ICANON &amp;amp; ~termios.ECHO&lt;br /&gt;
	termios.tcsetattr(fd, termios.TCSANOW, newattr)&lt;br /&gt;
&lt;br /&gt;
	oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)&lt;br /&gt;
	fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)&lt;br /&gt;
&lt;br /&gt;
	try:&lt;br /&gt;
		while 1:&lt;br /&gt;
			try:&lt;br /&gt;
				c = sys.stdin.read(1)&lt;br /&gt;
				#print &amp;quot;Got character&amp;quot;, repr(c)&lt;br /&gt;
				return c;&lt;br /&gt;
			except IOError: pass&lt;br /&gt;
	finally:&lt;br /&gt;
		termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)&lt;br /&gt;
		fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)&lt;br /&gt;
#---&lt;br /&gt;
&lt;br /&gt;
with open('arbres.json', 'r') as f:&lt;br /&gt;
    arbres_dict = json.load(f)&lt;br /&gt;
&lt;br /&gt;
num_changeset = 1&lt;br /&gt;
for arbre in arbres_dict:&lt;br /&gt;
&lt;br /&gt;
	name = arbre['name'];&lt;br /&gt;
	lat = float(arbre['lat']);&lt;br /&gt;
	lon = float(arbre['lon']);&lt;br /&gt;
	species = arbre['species'];&lt;br /&gt;
	species_ca = arbre['species:ca'];&lt;br /&gt;
	note = arbre['note'];&lt;br /&gt;
	print(&amp;quot;=================================&amp;quot;)&lt;br /&gt;
	print(num_changeset)&lt;br /&gt;
	print(&amp;quot;=================================&amp;quot;)&lt;br /&gt;
	print name&lt;br /&gt;
	print &amp;quot;(&amp;quot;,lat,&amp;quot;,&amp;quot;,lon,&amp;quot;)&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	#cerquem els arbres que tenim, per actualitzar o per inserir&lt;br /&gt;
	overpass_query = &amp;quot;node[natural=tree](around:50,%f,%f); out;&amp;quot; % (lat, lon)&lt;br /&gt;
	#print overpass_query;&lt;br /&gt;
	response = requests.get(overpass_url, params={'data': overpass_query})&lt;br /&gt;
	print response.content;&lt;br /&gt;
	#volem recuperar el id del node que hem trobat&lt;br /&gt;
	root = jxmlease.parse(response.content)&lt;br /&gt;
	num = 0	&lt;br /&gt;
	for i in root['osm'].find_nodes_with_tag('node', recursive=False):&lt;br /&gt;
		print &amp;quot;node: &amp;quot; + i.get_xml_attr(&amp;quot;id&amp;quot;) + &amp;quot; en les immediacions&amp;quot;&lt;br /&gt;
		num+=1;&lt;br /&gt;
		print(&amp;quot;ACTUALITZACIÓ\n=============&amp;quot;);&lt;br /&gt;
		print(name)&lt;br /&gt;
		print(species)&lt;br /&gt;
		print(species_ca)&lt;br /&gt;
		print(note)&lt;br /&gt;
&lt;br /&gt;
		print('Vols actualitzar les dades (y/n)');&lt;br /&gt;
		tecla = press_key();&lt;br /&gt;
		#print(tecla)&lt;br /&gt;
		if (tecla=='y'):&lt;br /&gt;
			print('Anem a actualitzar')&lt;br /&gt;
			MyApi = OsmApi(passwordfile=&amp;quot;/home/joan/projectes/arbres_monumentals/.password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			changeset_comment = '{&amp;quot;comment&amp;quot;: &amp;quot;Modificació arbre monumental #%s&amp;quot;}' % (str(num_changeset))&lt;br /&gt;
			changeset_comment_json = json.loads(changeset_comment)&lt;br /&gt;
			MyApi.ChangesetCreate(changeset_comment_json)&lt;br /&gt;
			node = MyApi.NodeGet(i.get_xml_attr(&amp;quot;id&amp;quot;))&lt;br /&gt;
			tags = node[&amp;quot;tag&amp;quot;]&lt;br /&gt;
			tags[u&amp;quot;natural&amp;quot;] = u&amp;quot;tree&amp;quot;&lt;br /&gt;
			tags[u&amp;quot;name&amp;quot;] = name&lt;br /&gt;
			tags[u&amp;quot;species&amp;quot;] = species&lt;br /&gt;
			tags[u&amp;quot;species:ca&amp;quot;] = species_ca&lt;br /&gt;
			tags[u&amp;quot;note&amp;quot;] = note&lt;br /&gt;
&lt;br /&gt;
			print(MyApi.NodeUpdate(node))&lt;br /&gt;
			MyApi.ChangesetClose()&lt;br /&gt;
			MyApi.flush()&lt;br /&gt;
			print (&amp;quot;arbre actualitzat&amp;quot;);&lt;br /&gt;
			num_changeset = num_changeset + 1;&lt;br /&gt;
		else:&lt;br /&gt;
			print('No volem actualitzar')&lt;br /&gt;
&lt;br /&gt;
	if (num==0):&lt;br /&gt;
		print(&amp;quot;\n\nINSERCIÓ\n========&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		MyApi = OsmApi(passwordfile=&amp;quot;/home/joan/projectes/arbres_monumentals/.password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		changeset_comment = '{&amp;quot;comment&amp;quot;: &amp;quot;Inserció arbre monumental #%s&amp;quot;}' % (str(num_changeset))&lt;br /&gt;
		changeset_comment_json = json.loads(changeset_comment)&lt;br /&gt;
		MyApi.ChangesetCreate(changeset_comment_json)&lt;br /&gt;
		data = '{&amp;quot;lat&amp;quot;:%f, &amp;quot;lon&amp;quot;:%f, &amp;quot;tag&amp;quot;: { &amp;quot;natural&amp;quot;: &amp;quot;tree&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;%s&amp;quot;, &amp;quot;species&amp;quot;: &amp;quot;%s&amp;quot;, &amp;quot;species:ca&amp;quot;: &amp;quot;%s&amp;quot;, &amp;quot;note&amp;quot;: &amp;quot;%s&amp;quot; }}' % (lat, lon, name, species, species_ca, note)&lt;br /&gt;
		data_json = json.loads(data)&lt;br /&gt;
		print(data_json)&lt;br /&gt;
		print(MyApi.NodeCreate(data_json))&lt;br /&gt;
		MyApi.ChangesetClose()&lt;br /&gt;
		MyApi.flush()&lt;br /&gt;
		print (&amp;quot;arbre inserit&amp;quot;);&lt;br /&gt;
		num_changeset = num_changeset + 1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podem veure el resum gràfic dels canvis realitzats&lt;br /&gt;
*https://overpass-turbo.eu/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
area[&amp;quot;name&amp;quot;=&amp;quot;Catalunya&amp;quot;]-&amp;gt;.boundaryarea;&lt;br /&gt;
(&lt;br /&gt;
nwr(area.boundaryarea)[note~'https://ca.wikipedia.org/wiki/Llista_d%27arbres_monumentals_de_Catalunya'];&lt;br /&gt;
nwr(area.boundaryarea)[tree];&lt;br /&gt;
);&lt;br /&gt;
out meta;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Fixar-se que podem utilitzar una expressió regular:&lt;br /&gt;
*https://wiki.openstreetmap.org/wiki/Overpass_turbo/Wizard#Intelligent_Wizard&lt;br /&gt;
&lt;br /&gt;
=Referències=&lt;br /&gt;
script al github:&lt;br /&gt;
*https://github.com/joanillo/arbres_monumentals&lt;br /&gt;
OpenStreetMap al bloc&lt;br /&gt;
*http://www.joanillo.org/?cat=53&lt;br /&gt;
=Annex: arbres singulars de Barcelona=&lt;br /&gt;
projecte: /home/joan/projectes/OSM/arbres_monumentals/arbres_interes_local_bcn/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{geocodeArea:&amp;quot;Barcelona&amp;quot;}}-&amp;gt;.boundaryarea;&lt;br /&gt;
(&lt;br /&gt;
  node[&amp;quot;name&amp;quot;~&amp;quot;arbre singular&amp;quot;](area.boundaryarea);&lt;br /&gt;
);&lt;br /&gt;
out body;&lt;br /&gt;
{{style:&lt;br /&gt;
&lt;br /&gt;
node[natural=tree] {&lt;br /&gt;
  icon-image: url('https://img.icons8.com/cotton/2x/tree.png');&lt;br /&gt;
  icon-width: 25;&lt;br /&gt;
  icon-height: 25; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Annex: arbres singulars de Mallorca=&lt;br /&gt;
[[Fitxer:Arbres monumentals mallorca.png | thumbnail]]&lt;br /&gt;
projecte: /home/joan/projectes/OSM/arbres_monumentals/arbres_singulars_mallorca/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
area[&amp;quot;name&amp;quot;=&amp;quot;Illes Balears&amp;quot;]-&amp;gt;.boundaryarea;&lt;br /&gt;
(&lt;br /&gt;
nwr(area.boundaryarea)[website~'arbres_singulars_de_les_Illes_Balears'];&lt;br /&gt;
);&lt;br /&gt;
out meta;&lt;br /&gt;
&lt;br /&gt;
{{style:&lt;br /&gt;
&lt;br /&gt;
node[natural=tree] {&lt;br /&gt;
  icon-image: url('https://img.icons8.com/cotton/2x/tree.png');&lt;br /&gt;
  icon-width: 25;&lt;br /&gt;
  icon-height: 25; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Autor}}, octubre 2019&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>