grössere Abfragen an der overpass-api via kommandozeile u. wget

hallo und guten Abend Community,

vorweg: ihr habt mir am Wochenende sehr viel weitergeholfe. Habe diverse Fragen gehabt - bzgl. der Weiterverarbeitung von Abfrageergebnissen.
Dabei habt ihr mir dann gezeigt dass es nicht ratsam ist mit simplexmlelement-xpat auf Ergebnissen zu arbeiten - wenn ich doch am Ende CSV-Daten benoetige.

die untenstehende Abfrage erledigt vieles direkter: Vielen Dank an euch hierfür!!

http://overpass-turbo.eu/s/bqE

**output: **

und so weiter und so fort

Soweit - so gut!! Ich bin schon mal einen großen Schritt weiter - !!

Nun stehe ich aber vor der Aufgabe grosse Abfragen zu machen. Die würden unmittelbar - führe ich sie direkt auf der http://overpass-Turbo.eu -Seite durch, in einen Timeout führen.

ich sollte andere Verfahren wählen.

a.- entweder den osm-file (entsprechend) von Geofabrik downloaden - und dann auf der Kommandozeile weiterarbeiten.
b. direkt via wget das an die overpass-API richten (an den OSM Overpass API Endpoint)

Dazu gibt es ja dieses Manual: http://overpass-api.de/command_line.html

habe ja schon einiges mit wget auf der kommandozeile ausgeführt aber kann ich denn auch einen so komplexen Ausdruck wie er hier noetig ist auf der kommandozeile ausführen…?!

verbunden mit:

Vielen Dank für Eure Tipps schon - jetzt . :wink:

Ja. Das steht im letzten Absatz, den Du zitiert hast.

Hallo Swen
Vielen Dank!

Der Timeout bei der Overpass API ist standardmäßig auf 180 Sekunden eingestellt. Wenn du größere Abfragen machen möchtest, musst du ihn u. U. erhöhen :

http://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#timeout

(Nur als Tipp, weil dies noch nicht in deiner Beispiel-Query steht)

Hallo kkulach

vielen Dank! Das ist sehr hillfreich!!

viele Grüße
TagTheworld :slight_smile:

Hallo u. guten Abend,

das unmittelbare Anhängen des Ausdrucks

… schlug leider fehl. Bin grad nicht an dem Rechner - werde euch aber den Fehlercode morgen früh senden.

LG tagtheworld

In dem von Dir benutzten Zitat weiter oben stand “For longer queries, it could be helpful to have the query in a separate file”.

Du hast eine separate Datei benutzt und nicht etwa den Ausdruck angehängt?

Generell möchte ich Dich mal fragen, warum Du Dich mit so großem Elan in ein für Dich anscheinend sehr neues Metier wagst? Bei vielen Deiner Fragen werde ich das Gefühl nicht los, dass es Dir noch an gewissen Grundlagenkenntnissen im Umgang mit Kommandozeile etc fehlt. Vielleicht wäre es sinnvoll, wenn Du z.B. zunächst einen VHS-Kurs über Grundlagen der Programmierung und Benutzung von Kommandozeile besuchst.

Das direkte Anhängen funktioniert nicht so einfach.
Overpass-turbo bietet die Möglichkeit im export Rohdaten direkt von Overpass-Api zu holen. Die zu deinem Beispiel gehörende Linkadresse ließe sich anhängen.
Da wird dann zum Beispiel {{bbox}} in Koordinaten umgewandelt, ebenso werden die Zeichen die in der Shell zu Unsinn führen gequotet.


http://overpass-api.de/api/interpreter?data=%5Bout%3Acsv%28%3A%3Aid%2C%3A%3Atype%2C%22name%22%2C%22website%22%2C%22%20contact%3Aemail%3D*%22%29%5D%3B%0Aarea%5Bname%3D%22Heidelberg%22%5D-%3E.a%3B%0A%28%20node%28area.a%29%5Bamenity%3Dhospital%5D%3B%0A%20%20way%28area.a%29%5Bamenity%3Dhospital%5D%3B%0A%20%20rel%28area.a%29%5Bamenity%3Dhospital%5D%3B%29%3B%0Aout%3B

Bei längeren Abfragen funktioniert dann wget nicht mehr.

Als alternative benutze ich dann curl


curl http://overpass-api.de/api/interpreter?data=%5Bout%3Acsv%28%3A%3Aid%2C%3A%3Atype%2C%22name%22%2C%22website%22%2C%22%20contact%3Aemail%3D*%22%29%5D%3B%0Aarea%5Bname%3D%22Heidelberg%22%5D-%3E.a%3B%0A%28%20node%28area.a%29%5Bamenity%3Dhospital%5D%3B%0A%20%20way%28area.a%29%5Bamenity%3Dhospital%5D%3B%0A%20%20rel%28area.a%29%5Bamenity%3Dhospital%5D%3B%29%3B%0Aout%3B >Krankenhaus.csv

Das ganze läßt dann auch in einem shellscript Variablen zu.
ich habe mal für die
wochenaufgabe Apotheken ein Shellscript geschrieben welches für die einzelnen Bumdesländer eigene Wikitabellen erzeugt.


#/bin/bash
###################################
#     Abfrage Wochenaufgabe       
#          Apotheken              
#
###################################

# Zeit in eine Variable damit sie konstand bleibt.
zeit=$(date +%Y-%m-%d_%H-%M)
datum=$(date +%d.%m.%Y)

# für Test ohne Schleife
# i="05"

# Schleife für Regionalcodes
for i in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
do
	echo "Abfrage Bundesland $i gestartet (`date +%d.%m.%Y" "%H:%M`)"
# Tabellenkopf erstellt
case $i in
01)	 echo "=Tabelle für Schleswig-Holstein ($datum)="  > Liste_"$i".wiki;;
02)	 echo "=Tabelle für Hamburg ($datum)="  > Liste_"$i".wiki;;
03)	 echo "=Tabelle für Niedersachsen ($datum)="  > Liste_"$i".wiki;;
04)	 echo "=Tabelle für Bremen ($datum)="  > Liste_"$i".wiki;;
05)	 echo "=Tabelle für Nordrhein-Westfalen ($datum)="  > Liste_"$i".wiki;;
06)  echo "=Tabelle für Hessen ($datum)="  > Liste_"$i".wiki;;
07)	 echo "=Tabelle für Rheinland-Pfalz ($datum)="  > Liste_"$i".wiki;;
08)	 echo "=Tabelle für Baden-Württemberg ($datum)="  > Liste_"$i".wiki;;
09)	 echo "=Tabelle für Bayern ($datum)="  > Liste_"$i".wiki;;
10)	 echo "=Tabelle für Saarland ($datum)="  > Liste_"$i".wiki;;
11)	 echo "=Tabelle für Berlin ($datum)="  > Liste_"$i".wiki;;
12)  echo "=Tabelle für Brandenburg ($datum)="  > Liste_"$i".wiki;;
13)	 echo "=Tabelle für Mecklenburg-Vorpommern ($datum)="  > Liste_"$i".wiki;;
14)	 echo "=Tabelle für Sachsen ($datum)="  > Liste_"$i".wiki;;
15)	 echo "=Tabelle für Sachsen-Anhalt ($datum)="  > Liste_"$i".wiki;;
16)	 echo "=Tabelle für Thüringen ($datum)="  > Liste_"$i".wiki;;
*) echo $1;;
esac

echo "Abgefragt: `date +%d.%m.%Y" "%H:%M`"  >> Liste_"$i".wiki

echo "{| class=\"wikitable sortable\""   >> Liste_"$i".wiki


cp Liste_"$i".wiki a_"$i".wiki

# mit curl Overpassabfrage
curl overpass-api.de/api/interpreter?data=%5Bout%3Acsv%28%3A%3Atype%2C%3A%3Aid%2C%3A%3Alat%2C%3A%3Alon%2Cname%2C%22addr%3Astreet%22%2C%22addr%3Ahousenumber%22%2C%22addr%3Apostcode%22%2C%22addr%3Acity%22%2Copening_hours%2Coperator%2Cphone%2C%22contact%3Aphone%22%2Cfax%2C%22contact%3Afax%22%2Cwebsite%2C%22contact%3Awebsite%22%2Cemail%2C%22contact%3Aemail%22%2Cwheelchair%2Cfixme%2Cnote%3Btrue%3B%22~%22%29%5D%3Barea%5B%22de%3Aamtlicher_gemeindeschluessel%22~%22^"$i"%22%5D-%3E.a%3B%0A%28node%28area.a%29%5Bamenity%3Dpharmacy%5D%3B%0Away%28area.a%29%5Bamenity%3Dpharmacy%5D%3B%0Arel%28area.a%29%5Bamenity%3Dpharmacy%5D%29%3B%0Aout%20center%3B > Apotheken_"$i"_"$zeit".csv


# so jetzt sollte die csv Datei mit Zeit im Namen geschrieben sein

sleep 10
# Ab hier kann ich etwas mit der Datei tun
cat Apotheken_"$i"_"$zeit".csv   |sed  "s/||/\x3cbr \x2f\x3e\d38#124;\d38#124; /g"  |sed  "s/|/\d38#124;/g"    >Apotheken.csv
# Temporäre Datei ohne Pipe-Zeichen erstellt
cat Apotheken.csv   |sed  '1q' | sed "s/~/ !! /g" |sed "s/^/!  /g"|sed  "s/@type/Typ/g" |sed  "s/@id/ID/g" |sed  "s/@lat/Lat/g" |sed  "s/@lon/Lon/g" |sed  "s/name/Name/g" |sed  "s/addr:street/Straße/g" |sed  "s/addr:housenumber/Nr./g" |sed  "s/addr:postcode/PLZ/g" |sed  "s/addr:city/Ort/g" |sed  "s/opening_hours/Öffnungszeiten/g" |sed  "s/ phone / Telefon /g" |sed  "s/contact:phone/Contact:Telefon/g" |sed  "s/ fax / Fax /g" |sed  "s/contact:fax/contact:fax/g" |sed  "s/ website / Webseite /g" |sed  "s/contact:website/ Contact:Webseite/g" |sed  "s/ email / eMail /g" |sed  "s/contact:email/ Contact:eMail/g" |sed  "s/ wheelchair / Rollstuhl /g" |sed  "s/ fixme / FIXME /g" |sed  "s/note/Anmerkungen/g" >> Liste_"$i".wiki
#Kopfzeile erzeugt
echo "! Apotheke                            !! Adresse                           !! Öffnungszeiten           !! Telefon                 !! Fax                         !! Webseite                       !! e-Mail                               !! Rollstuhl !! FIXME !! Anmerkung           !! Lat           !! Lon           !! ID          
"  >> a_"$i".wiki
cat Apotheken.csv   |sed -n '2,$p' |awk -F~ '{printf ("|-\n|%s<br /><br />Inh. %s||%s %s<br />%s %s||%s||%s<br /><span style=""color:blue;"">%s</span>||%s<br /><span style=""color:blue;"">%s</span>||%s<br /><span style=""color:blue;"">%s</span>||%s<br /><span style=""color:blue;"">%s</span>||%s||%s||%s||%s||%s||%s\n", $5 , $11, $6, $7, $8, $9, $10, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $3, $4, $2 )}'  >> a_"$i".wiki


cat Apotheken.csv   |sed -n '2,$p' | sed "s/~/ || /g" |sed "s/^node/|-  \x0D| align="center" | {{Icon|node}} /g"  |sed "s/^way/|-  \x0D| align="center" | {{Icon|way}} /g"  |sed "s/^relation/|-  \x0D| align="center" | {{Icon|relation}} /g"   >> Liste_"$i".wiki
# Tabellenspalten fertiggestellt. Jetzt noch das Ende der Tabelle anhängen
echo "|}"  >> Liste_"$i".wiki

# Lizenzabschnitt anhängen
echo "=Lizenz="  >> Liste_"$i".wiki
echo "Daten von [openstreetmap.org OpenStreetMap]<br>"  >> Liste_"$i".wiki
echo "Veröffentlicht unter [opendatacommons.org/licenses/odbl/ ODbL]"  >> Liste_"$i".wiki


echo "|}"  >> a_"$i".wiki

# Lizenzabschnitt anhängen
echo "=Lizenz="  >> a_"$i".wiki
echo "Daten von [openstreetmap.org OpenStreetMap]<br>"  >> a_"$i".wiki
echo "Veröffentlicht unter [opendatacommons.org/licenses/odbl/ ODbL]"  >> a_"$i".wiki



echo "Abfrage Regionalschlüsselnummer $i beendet"
# gleich geht es mit dem nächsten Regionalschlüssel weiter.
done

# nach der Zeitausgabe ist endlich Schluß
 echo "Abfrage alle Regionalschlüsselnummern beendet (`date +%d.%m.%Y" "%H:%M`)"




Auch das ist noch erheblich verbesserungswürdig, aber auch nur von einem Anfänger im Umgang mit Shell und Sed geschrieben.
Es gibt bestimmt viele Wege solche Dinge zu tun, wichtiger ist die Idee dazu.

Sven hat es schon erwähnt: statt die Abrage in der Kommandozeile einzufügen, kann man sie auch in einer Datei speichern (z.B. mit Texteditor) und wget mit “–post-file=” den Dateinamen übergeben.

Hier ein Vorschlag zum Vorgehen:

Ausgangslage: Abfrage in Overpass Turbo: http://overpass-turbo.eu/s/bqE

  1. Abfrage in Datei speichern (als query.txt):
    in Overpass Turbo im Menü oben: “Export” > “Abfrage” > “Als Text”
  2. eine Kommandozeile im Ordner mit der gespeicherten query.txt öffnen
  3. wget mit dem Dateinamen aufrufen (speichert Ergebnis in result.osm):

wget -O result.osm --post-file=query.txt "http://overpass-api.de/api/interpreter"

Eine Automatisierung der Abfrage für mehrere Regionen wie bei Gisbert kann man sich als nächsten Schritt anschauen, aber ich denke erst sollte das hier mal klappen.

Gruß,
Norbert

1 Like