Das habe ich auch schon gemacht (mit Python und overpy), es geht auch gut.
import overpy
api = overpy.Overpass()
DEBUG = False
def debug(str):
if DEBUG:
print(str)
def objects_in_time_and_space(relationid,y,m,d, kv={'key':'natural','value':'tree'}):
"""Liefert ein tupel mit (anzahl_nodes, anzahl_ways) zurück.
Der dict kv gibt an, nach welchem Key und welchem Value gesucht wird. Default natural=tree
"""
areaid = relationid + 3600000000
result = api.query("""
[timeout:250]
[date:"%d-%02d-%02dT00:00:00"]
;
area(%d)->.searchArea;
(
node
["%s"="%s"]
(area.searchArea);
way
["%s"="%s"]
(area.searchArea);
);
out %s;
""" % (y,m,d,areaid,kv['key'],kv['value'],kv['key'],kv['value'],'body' if DEBUG else 'skel'))
debug("*** nodes (%d) ***" % len(result.nodes))
for node in result.nodes:
debug("%s (%d)" % (node.tags.get("name", "(unbenannt)"), node.id ))
debug(" natural: %s" % node.tags.get("natural", "n/a"))
debug(" Lat: %f, Lon: %f" % (node.lat, node.lon))
debug("*** Ways (%d) ***" % len(result.ways))
for way in result.ways:
debug("Name: %s" % way.tags.get("name", ""))
for node in way.nodes:
debug(" Lat: %f, Lon: %f" % (node.lat, node.lon))
return (len(result.nodes), len(result.ways))
if __name__ == "__main__":
#relid = 62677 #LK Osterode
#relid = 51477 #BRD
relid = 1421436 #AL8 Clausthal-Zellerfeld
demo = 2
if demo == 1:
print(" Berggipfel (natural=peak) jeweils am Monatsersten 2014-2015")
print("time;nodes;ways")
for year in range(2014,2016,1):
for month in range(1,13):
n = objects_in_time_and_space(relid,year,month,1,{'key':'natural','value':'peak'})
print("%d-%02d-%02d;%d;%d" % (year,month,1,n[0],n[1]))
elif demo == 2:
print(" Default (natural=tree) am 1.3.2015")
y = 2015
m = 03
n= objects_in_time_and_space(relid,y,m,1)
print("time;nodes;ways")
print("%d-%02d-%02d;%d;%d" % (y,m,1,n[0],n[1]))
elif demo == 3:
print(" Gipfel (natural=peak) am 23.3.2015 mit DEBUG")
DEBUG = True
y = 2015
m = 03
d = 23
n= objects_in_time_and_space(relid,y,m,d,{'key':'natural','value':'peak'})
print("time;nodes;ways")
print("%d-%02d-%02d;%d;%d" % (y,m,d,n[0],n[1]))
Vorteil: keine lokale Datenhaltung nötig. Nachteil: Belastung der Overpass-Instanz.
Die Weglänge muss man sich hinterher aber sowieso noch selbst berechnen.
edit: bugs im Programm:
- Muss noch sleep machen zwischen den “repeated requests”, um nicht in Sperren zu laufen
- Debuggen von ways geht nicht, weil ich nur den Way und nicht seine nodes hole
…aber das fixen sei dem geneigten Studenten überlassen g