hallo Community,
von einem .Osm File. das ich hier über die Abfrage bei turbo-overpass-Api abgefragt habe habe ich folgende DATEN erhalten - http://overpass-turbo.eu/
etwa so etwas hier… .- und das sind schon die DATEN die ich extrahieren & speichern will:
“tags”: {
“addr:city”: “Barcelona”,
“addr:housenumber”: “1”,
“addr:postcode”: “08022”,
“addr:street”: “Carrer de Torras i Pujalt”,
“amenity”: “hospital”,
“contact:email”: “info@clinicasagradafamilia.com ”,
“contact:fax”: “+34 932124050”,
“contact:phone”: “+34 932122300”,
“contact:website”: “http://csf.com.es/ ”,
“name”: “Cliníca Sagrada Família”
}
darüber hinaus sind noch viele andere Daten dabei - in dem xml-file. Die brauch ich nicht.
Ich denk dass das Tool der Wahl hier SimpleXMLElement::xpath ist - um die o.g. Werte zu erhalten:
$raw = <<<EOF
{
“type”: “node”,
“id”: 583257940,
“lat”: 41.4134446,
“lon”: 2.1426945,
“tags”: {
“amenity”: “hospital”,
“emergency”: “yes”,
“name”: “Clinica Delfos”
}
},
{
“type”: “node”,
“id”: 618312181,
“lat”: 41.4138593,
“lon”: 2.1970778,
“tags”: {
“addr:city”: “Barcelona”,
“addr:housenumber”: “211”,
“addr:postcode”: “08020”,
“addr:street”: “Carrer de Fluvià”,
“amenity”: “hospital”,
“health_facility:type”: “health_centre”,
“medical_system:western”: “yes”,
“name”: “CAP Sant Martí”,
“phone”: “+93 307 07 66”
}
},
{
“type”: “node”,
“id”: 876348001,
“lat”: 41.3841883,
“lon”: 2.1952253,
“tags”: {
“amenity”: “hospital”,
“emergency”: “yes”,
“name”: “Hospital del Mar”,
“website”: “http://www.parcdesalutmar.cat/hospitals/hospital-del-mar/index.html ”,
“wheelchair”: “yes”
}
},
EOF;
$xml = simplexml_load_string($raw);
foreach($xml->xpath(“//way”) AS $way){
$via = $way->xpath(“tag[@k=‘name’]/@v ”)[0];
foreach($way->nd AS $nd){
$idnode = $nd[“ref”];
echo $idnode .“, “. $via .” ”;
}
}
Die Frage ist wie genau ich hier SimpleXMLElement::xpath einsetze?
Ein demo-Befehl zeigt eine komplette Ausgabe hier http://overpass-turbo.eu/
Dann gibt es die resultate:
Frage; wie speichere ich obiges Datenset in entweder excel oder mysql?
Um Gottes willen … NEIN … bitte hier nochmal ins Selbststudium gehen und sich in die Thematik XML und JSON einarbeiten!
oder einfach das output von overpass auf xml umstellen, dann kannst du auch gerne mit xpath drauf rumheizen
Nachtrag: hab’s mir zwar noch nicht näher angeschaut, aber vielleicht wäre es einfacher, das JSON in eine PHP Variable per json-decode umzuwandeln, dann kannst du objektorientiert auf deine ganzen Tags zugreifen.
ikonor
(Ikonor)
September 13, 2015, 11:46am
3
Bitte den Link aus “Teilen” (zweiter Menüpunkt oben) zu einer Abfrage verwenden, dieser zeigt nur auf die Startseite, ohne Deine Abfrage.
Wie Harald schon gesagt hat, ist das Ergebnis bei [out:json] im JSON Format, nicht XML, siehe:
Overpass QL: Output Format (out)
http://overpass-api.de/output_formats.html
Bei http://www.json.org/ gibt es Links für jede Programmiersprache.
Standard ist XML, wenn kein [out:xxx] angegeben ist, oder eben explizit [out:xml].
Am einfachsten wäre dafür vermutlich das CSV Format: CSV output mode
Gruß,
Norbert
hallo Harald, hallo Norbert
vielen Dank für die Informationen - das stimmt alles -
hab mir das nochmals angesehen - csv waere das allereinfachste! Ganz sicher!
das hier - http://overpass-turbo.eu/s/bpX geht aber nicht! Leider - csv geht nur über umwege.
ganz hingegen dies hier http://overpass-turbo.eu/s/bpY - mit json als ausgabe-Format
ergo muss ich hier noch umdenken .- und den Code irgendwie erweitern - mit den Infos hieraus
http://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#Output_Format_.28out.29
geht so nicht - aber ich werde nochmals nachsehen ob ich da noch etwas machen kann.
Danke für Eure Hilfe
viele Grüße
ikonor
(Ikonor)
September 13, 2015, 1:00pm
5
Bei csv musst Du noch explizit angeben, welche Felder Du haben willst, siehe Beschreibung unter “CSV output mode” bei obigem Link.
hallo Ikonor
danke für deinen Hinweis - ergo so;:
[out:csv(::“id”, amenity, name, operator, opening_hours, “contact:website”, “contact:phone”, brand, dispensing, lastcheck)];
und hier werde ich all die für mich wichtigen Daten / values einfügen
“tags”: {
“addr:city”: “Barcelona”,
“addr:housenumber”: “1”,
“addr:postcode”: “08022”,
“addr:street”: “Carrer de Torras i Pujalt”,
“amenity”: “hospital”,
“contact:email”: “info@clinicasagradafamilia.com ”,
“contact:fax”: “+34 932124050”,
“contact:phone”: “+34 932122300”,
“contact:website”: “http://csf.com.es/ ”,
“name”: “Cliníca Sagrada Família”
}
analog dazu - wie sie das auf der wiki-Beispielseite gemacht haben -zum Beispiel hier: Railway stations in Bonn:
werde das mal auf mein Beispiel anzuwenden versuchen…Vielen Dank schonmal.
update:
habe das schon mal an einem beispiel ausprobiert:
mit diesem Beispielcode --…
das ergebins :
jetzt werde ich das nur noch auf mein oben genanntes Problem anwenden!?
hallo liebe Community
also ich hab mal einiges probiert: analog der unten genannten Anleitung -
http://wiki.openstreetmap.org/wiki/DE:Proposed_features/Healthcare
geht mit dem beispiel hier beies nicht:
healthcare=clinic
healthcare=hospital
replaes amenity = hospital
d,h. wenn ich das umbaue und dann für railway=station folgendes einsetzte
healthcare=clinic oder auch
healthcare=hospital
dann geht das nicht - warum weiß ich im Moment auch noch nicht
also wenn ich ausgehend von dem Beispiel hier
[out:csv(::id,::type,“name”)];
area[name=“Paris”]->.a;
( node(area.a)[railway=station];
way(area.a)[railway=station];
rel(area.a)[railway=station]; );
out;
dann folgendes mache und es so schreibe
[out:csv(::id,::type,“name”)];
area[name=“Paris”]->.a;
( node(area.a)[healthcare=clinic];
way(area.a)[healthcare=clinic];
rel(area.a)[healthcare=clinic]; );
out;
das geht nicht - - auch nicht mit healthcare=hospital
ich denke dass ich hier einen Gedankenfehler aufsitze
kkulach
September 13, 2015, 3:40pm
8
Huhuuuu,
Wenn du bei XML bleiben willst, ein kleiner Hinweis / Tipp :
Das Problem bei simplexml ist, dass du schnell an die Speichergrenze stößt, die dem PHP Interpreter zur Verfügung steht. Bis zu einem gewissen Grad kann man da nachhelfen, aber nicht unendlich.
Bei einfacheren Abfragen gegen Overpass ist das sicher in Ordnung.
Sobald es aber mehr Daten werden (Ob Overpass oder direkt aus einem OSM - File), kann entweder der Speicher knapp oder die Performance grauenhaft werden - da das gesammte XML bei simplexml_load_* geparst und als Objekt im Speicher angelegt wird. Erlaubt zwar den einfachen Zugriff, verbraucht aber mehr Ressourcen.
Du solltest vielleicht darüber nachdenken, einen SAX - Parser zu verwenden, auch wenn du ihn jetzt noch nicht unbedingt brauchst - Wenn dein Projekt wächst, bist du für alles gewappnet .
Ich habe für das Skript, welches die POIs für poiowl.de filtert, auch einen verwendet. Alles übrigens auf einem Raspberry Pi, der Speicherverbrauch vom SAX Parser kann sich sehen lassen (Obschon es nur ein einfacher Anwendungsfall ist, aber ich verarbeite das OSM - File pro Land damit) !
Viele Grüße!