You are not logged in.

Announcement

*** NOTICE: forum.openstreetmap.org is being retired. Please request a category for your community in the new ones as soon as possible using this process, which will allow you to propose your community moderators.
Please create new topics on the new site at community.openstreetmap.org. We expect the migration of data will take a few weeks, you can follow its progress here.***

#1 2015-09-13 21:42:16

tagtheworld
Banned
Registered: 2012-04-25
Posts: 236

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

[out:csv(::id,::type,"name","website"," contact:email=*")];
area[name="Heidelberg"]->.a;
( node(area.a)[amenity=hospital];
  way(area.a)[amenity=hospital];
  rel(area.a)[amenity=hospital];);
out;

output:

@id    @type    name    website     contact:email=*
145970634    node           
303300521    node    Thoraxklinik    http://www.thoraxklinik-heidelberg.de   
678470357    node    Kurpfalzkrankenhaus    http://www.srh.de/de/kk-heidelberg/index.html   
1279003446    node    Mercy Hospital for Women    www.mercyhealth.com.au   
1732872588    node    GRN-Klinik Weinheim    www.grn.de/klinik-weinheim   
2343179537    node    Klinik für Allgemeine Innere Medizin und Psychosomatik    http://www.klinikum.uni-heidelberg.de/K … 088.0.html   
3217716361    node    kopfklinik       
24595717    way    Austin Hospital    http://www.austin.org.au/   
25208382    way    Blutspendezentrale Heidelberg IKTZ       
49501406    way    Klinik für Kinder- und Jugendpsychiatrie - Tageszentrum für Jugendliche    http://www.klinikum.uni-heidelberg.de/T … 360.0.html   
90355808    way    Kliniken Schmieder Heidelberg    http://www.kliniken-schmieder.de   
91097339    way    Salem    http://www.krankenhaus-salem.de   
96690377    way    Unfallchirurgie - Atos    http://www.atos.de/klinik/   
99998610    way    Warringal Private    www.warringalprivate.com.au   
140128817    way    Institut für Psychosomatische Kooperationsforschung und Familientherapie    http://www.klinikum.uni-heidelberg.de/Z … 894.0.html   
141216666    way    Tropenmedizinische Ambulanz    http://www.klinikum.uni-heidelberg.de/S … 489.0.html

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


For short queries, the usage is very simple: Just write the query in the command line:

wget "http://overpass-api.de/api/interpreter?data=node[name=\"Gielgen\"];out;"

Please note that we need to escape the quotation mark ("). Because we have enclosed the URL in quotation marks, we must escape only two more characters: the dollar ($) sign should get (\$) and the backslash (\) should be doubled (\\).

In most cases it would be helpful to store the results with a meaningful filename. Use -O for that purpose:

wget -O target.osm "http://overpass-api.de/api/interpreter?data=node[name=\"Gielgen\"];out;"

For longer queries, it could be helpful to have the query in a separate file. That is also possible:

echo "data=node[name=\"Gielgen\"];out;" >query.osm
wget -O target.osm --post-file=query.osm "http://overpass-api.de/api/interpreter"


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...?!

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

verbunden mit:

[out:csv(::id,::type,"name","website"," contact:email=*")];
area[name="Heidelberg"]->.a;
( node(area.a)[amenity=hospital];
  way(area.a)[amenity=hospital];
  rel(area.a)[amenity=hospital];);
out;

Vielen Dank für Eure Tipps schon - jetzt . ;-)

Last edited by tagtheworld (2015-09-13 21:42:41)


https://wiki.openstreetmap.org/wiki/User:Tagtheworld - interested in all things concerning osm especially those related to the languages Perl, PHP, Python and the databases MySQL and Postgresql.

Offline

#2 2015-09-14 04:57:05

Swen Wacker
Member
From: Lüneburg
Registered: 2014-07-25
Posts: 339

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

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

Offline

#3 2015-09-14 07:46:20

tagtheworld
Banned
Registered: 2012-04-25
Posts: 236

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

Hallo Swen
Vielen Dank!


https://wiki.openstreetmap.org/wiki/User:Tagtheworld - interested in all things concerning osm especially those related to the languages Perl, PHP, Python and the databases MySQL and Postgresql.

Offline

#4 2015-09-14 08:06:15

kkulach
Member
From: Dortmund
Registered: 2015-09-02
Posts: 9
Website

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

tagtheworld wrote:

führe ich sie direkt auf der http://overpass-Turbo.eu -Seite durch, in einen Timeout führen.

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/Over … QL#timeout

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

Last edited by kkulach (2015-09-14 08:10:11)

Offline

#5 2015-09-14 09:31:08

tagtheworld
Banned
Registered: 2012-04-25
Posts: 236

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

Hallo kkulach

vielen Dank! Das ist sehr hillfreich!!

viele Grüße
TagTheworld smile


https://wiki.openstreetmap.org/wiki/User:Tagtheworld - interested in all things concerning osm especially those related to the languages Perl, PHP, Python and the databases MySQL and Postgresql.

Offline

#6 2015-09-15 16:05:40

tagtheworld
Banned
Registered: 2012-04-25
Posts: 236

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

Hallo u. guten Abend,

das unmittelbare Anhängen des Ausdrucks

[out:csv(::id,::type,"name","website"," contact:email=*")];
area[name="Heidelberg"]->.a;
( node(area.a)[amenity=hospital];
  way(area.a)[amenity=hospital];
  rel(area.a)[amenity=hospital];);
out;

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

LG tagtheworld


https://wiki.openstreetmap.org/wiki/User:Tagtheworld - interested in all things concerning osm especially those related to the languages Perl, PHP, Python and the databases MySQL and Postgresql.

Offline

#7 2015-09-15 17:15:45

Swen Wacker
Member
From: Lüneburg
Registered: 2014-07-25
Posts: 339

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

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.

Offline

#8 2015-09-16 13:50:19

gmbo
Member
From: Bochum
Registered: 2012-02-16
Posts: 85
Website

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

tagtheworld wrote:

Hallo u. guten Abend,

das unmittelbare Anhängen des Ausdrucks

[out:csv(::id,::type,"name","website"," contact:email=*")];
area[name="Heidelberg"]->.a;
( node(area.a)[amenity=hospital];
  way(area.a)[amenity=hospital];
  rel(area.a)[amenity=hospital];);
out;

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

LG tagtheworld

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 [https://openstreetmap.org OpenStreetMap]<br>"  >> Liste_"$i".wiki
echo "Veröffentlicht unter [http://opendatacommons.org/licenses/odbl/ ODbL]"  >> Liste_"$i".wiki


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

# Lizenzabschnitt anhängen
echo "=Lizenz="  >> a_"$i".wiki
echo "Daten von [https://openstreetmap.org OpenStreetMap]<br>"  >> a_"$i".wiki
echo "Veröffentlicht unter [http://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.


Viele Grüße
Gisbert

Offline

#9 2015-09-16 20:48:24

ikonor
Member
Registered: 2010-11-08
Posts: 637
Website

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

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

Offline

Board footer

Powered by FluxBB