x

Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath


  1. Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · tagtheworld (Gast) · 01.02.2018 09:06 · [flux]

    Hallo communtiy,

    mit diesem Code hole ich vom Endpunkt der OSM Overpass API Daten.

    <?php
    /**

    • OSM Overpass API with PHP SimpleXML / XPath
    • PHP Version: 5.4 - Can be back-ported to 5.3 by using 5.3 Array-Syntax (not PHP 5.4's square brackets)
    • /

    //
    // 1.) Query an OSM Overpass API Endpoint
    //

    $query = 'node
    ["amenity"~".*"]
    (38.415938460513274,16.06338500976562,39.52205163048525,17.51220703125);
    out;';

    $context = stream_context_create(['http' => [
    'method' => 'POST',
    'header' => ['Content-Type: application/x-www-form-urlencoded'],
    'content' => 'data=' . urlencode($query),
    ]]);

    1. please do not stress this service, this example is for demonstration purposes only.

    $endpoint = 'http://overpass-api.de/api/interpreter';
    libxml_set_streams_context($context);
    $start = microtime(true);

    $result = simplexml_load_file($endpoint);
    printf("Query returned %2\$d node(s) and took %1\$.5f seconds.\n\n", microtime(true) - $start, count($result->node));

    //
    // 2.) Work with the XML Result
    //

    1. get all school nodes with xpath

    $xpath = '//node[tag[@k = "amenity" and @v = "school"]]';
    $schools = $result->xpath($xpath);
    printf("%d School(s) found:\n", count($schools));
    foreach ($schools as $index => $school)
    {
    # Get the name of the school (if any), again with xpath
    list($name) = $school->xpath('tag[@k = "name"]/@v') + ['(unnamed)'];
    printf("#%02d: ID:%' -10s [%s,%s] %s\n", $index, $school['id'], $school['lat'], $school['lon'], $name);
    }

    //node[tag[@k = "amenity" and @v = "school"]]
    //tag[@k = "name"]/@v'

    $query = 'node
    ["addr:postcode"~"RM12"]
    (51.5557914,0.2118915,51.5673083,0.2369398);
    node
    (around:1000)
    ["amenity"~"fast_food"];
    out;';

    $context = stream_context_create(['http' => [
    'method' => 'POST',
    'header' => ['Content-Type: application/x-www-form-urlencoded'],
    'content' => 'data=' . urlencode($query),
    ]]);

    $endpoint = 'http://overpass-api.de/api/interpreter';
    libxml_set_streams_context($context);

    $result = simplexml_load_file($endpoint);
    printf("Query returned %2\$d node(s) and took %1\$.5f seconds.\n\n", microtime(true) - $start, count($result->node));

    Hier die Resultate:

    me/martin/dev/php/o1.php on line 68
    linux-3645:/home/martin/dev/php # php o1.php
    Query returned 2799 node(s) and took 17.02055 seconds.

    33 School(s) found:

    1. 00: ID:332534486 [39.5018840,16.2722854] Scuola Elementare
    2. 01: ID:1428094278 [39.3320912,16.1862820] (unnamed)
    3. 02: ID:1822746784 [38.9075566,16.5776597] (unnamed)
    4. 03: ID:1822755951 [38.9120272,16.5713431] (unnamed)
    5. 04: ID:2002566438 [39.1349460,16.0736446] (unnamed)
    6. 05: ID:2056891127 [39.4106679,16.8254844] (unnamed)
    7. 06: ID:2056892999 [39.4124687,16.8286119] (unnamed)
    8. 07: ID:2272010226 [39.4481717,16.2894353] Scuola dell'infanzia San Francesco
    9. 08: ID:2272017152 [39.4502366,16.2807664] Scuola Media
    10. 09: ID:2358307794 [39.5015031,16.3905965] I.I.S.S. Liceo Statale V. Iulia
    11. 10: ID:2358307796 [39.4926280,16.3853662] Liceo Classico
    12. 11: ID:2358307797 [39.4973761,16.3858275] Scuola Media
    13. 12: ID:2358307800 [39.5015527,16.3941156] I.T.C. e per Geometri
    14. 13: ID:2358307801 [39.4983862,16.3807796] Istituto Professionale
    15. 14: ID:2448031004 [38.6438417,16.3873106] (unnamed)
    16. 15: ID:2458139204 [39.0803263,17.1291649] Sacro Cuore
    17. 16: ID:2552412313 [39.0765212,17.1224610] (unnamed)
    18. 17: ID:2582443083 [39.0815417,17.1178983] Liceo Socio Biologico Gravina
    19. 18: ID:2585754364 [38.8878393,16.4076323] Scuola Elementare
    20. 19: ID:2585754366 [38.8877600,16.4076216] Scuola Media
    21. 20: ID:3071126720 [38.6022703,16.5554408] Scuola Media
    22. 21: ID:3071127683 [38.6027273,16.5563125] Scuola Elementare
    23. 22: ID:3081362915 [39.2865638,16.2601963] Convitto Nazionale Bernardino Telesio
    24. 23: ID:3081362921 [39.2856714,16.2613594] Liceo Classico B. Telesio
    25. 24: ID:3081362926 [39.2888949,16.2577446] Scuola
    26. 25: ID:3732551794 [39.5132435,16.2863285] (unnamed)
    27. 26: ID:3740289655 [39.5167318,16.2838146] scuola media
    28. 27: ID:3740289656 [39.5164344,16.2821103] scuola elementare
    29. 28: ID:4004532684 [38.7804787,16.5122952] Liceo Artistico
    30. 29: ID:4589289756 [38.6794209,16.1063084] Scuola Comprensiva Trentacapilli
    31. 30: ID:4843966477 [39.0709866,17.1288384] Pegaso
    32. 31: ID:5297629775 [38.5768845,16.3263536] Scuola Media Statale "Ignazio La Russa"
    33. 32: ID:5316865306 [39.0807997,17.1264225] Enrico Fermi

    Query returned 3 node(s) and took 17.44780 seconds.

    Soweit so gut!! Wenn ich aber den Teil zwei des Codes verändern will um die Suche etwas präziser zu machen - mehr Daten zu gewinnen,
    Dann komme ich inProbleme. Die errors... -siehe unten:

    Hintergrund: Will mehr aus dem Datenset bekommen mehr Informationen; vorher hat das so ausgesehen:

    {
    # Get the name of the school (if any), again with xpath
    list($name) = $school->xpath('tag[@k = "name"]/@v') + ['(unnamed)'];
    printf("#%02d: ID:%' -10s [%s,%s] %s\n", $index, $school['id'], $school['lat'], $school['lon'], $name);
    }

    diese beiden Zeilen habe ich nun ergänzt:

    list($name) = $school->xpath('tag[@k = "contact:website"]/@v');
    list($name) = $school->xpath('tag[@k = "contact:email"]/@v');

    es sieht in der Foreach-Loop nun so aus:

    {
    # Get the name of the school (if any), again with xpath
    list($name) = $school->xpath('tag[@k = "name"]/@v') + ['(unnamed)'];
    list($name) = $school->xpath('tag[@k = "contact:website"]/@v');
    list($name) = $school->xpath('tag[@k = "contact:email"]/@v');
    printf("#%02d: ID:%' -10s [%s,%s] %s\n", $index, $school['id'], $school['lat'], $school['lon'], $name);
    }

    All das hab ich hier eingesetzt in den Teil 2 des Codes - der mit den XML-Resultaten arbeitet.

    //
    // 2.) Work with the XML Result
    //

    1. get all school nodes with xpath

    $xpath = '//node[tag[@k = "amenity" and @v = "school"]]';
    $schools = $result->xpath($xpath);
    printf("%d School(s) found:\n", count($schools));
    foreach ($schools as $index => $school)
    {
    # Get the name of the school (if any), again with xpath
    list($name) = $school->xpath('tag[@k = "name"]/@v') + ['(unnamed)'];
    list($name) = $school->xpath('tag[@k = "contact:website"]/@v');
    list($name) = $school->xpath('tag[@k = "contact:email"]/@v');
    printf("#%02d: ID:%' -10s [%s,%s] %s\n", $index, $school['id'], $school['lat'], $school['lon'], $name);
    }

    Die Ausgangsfrage war: wie kann ich mehr Daten gewinnen - wenigstens aber:

    - die Ardesse
    - die Webseite
    -

    Es ist also die Frage, wie ich mehr Daten in die xpath Abfrage einmünden lassen kann.
    Habe mich zur Information hier umgesehen Key:contact - OpenStreetMap Wiki

    contact:phone
    contact:fax
    contact:website
    contact:email

    Ziel ist es, die xpath Abfragen in der Foreach-Loop zu erweitern, relativ zu den Schools-Nodes

    tag[@k = "name"]/@v'
    tag[@k = "contact:website"]/@v'
    tag[@k = "contact:email"]/@v'

    Aber es geht so nicht wie oben beschrieben - es kommt zu Fehlern.

    linux-3645:/home/martin/dev/php # php o2.php
    Query returned 2799 node(s) and took 6.22443 seconds.

    33 School(s) found:
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 00: ID:332534486 [39.5018840,16.2722854]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 01: ID:1428094278 [39.3320912,16.1862820]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 02: ID:1822746784 [38.9075566,16.5776597]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 03: ID:1822755951 [38.9120272,16.5713431]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 04: ID:2002566438 [39.1349460,16.0736446]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 05: ID:2056891127 [39.4106679,16.8254844]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 06: ID:2056892999 [39.4124687,16.8286119]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 07: ID:2272010226 [39.4481717,16.2894353]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 08: ID:2272017152 [39.4502366,16.2807664]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 09: ID:2358307794 [39.5015031,16.3905965]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 10: ID:2358307796 [39.4926280,16.3853662]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    1. 11: ID:2358307797 [39.4973761,16.3858275]

    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42
    PHP Notice: Undefined offset: 0 in /home/martin/dev/php/o2.php on line 43

    Was mache ich falsch!? Freue mich auf einen Tipp.

    TagTheWorld


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · glglgl (Gast) · 01.02.2018 09:19 · [flux]

      Wenn Du uns mitteiltest, welches die Zeilen 42 und 43 sind, wäre das Tipp geben einfacher.


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · wambacher (Gast) · 01.02.2018 09:28 · [flux]

      Erweitere deine PostgreSQL-Datenbank mit PostGIS.

      Ein Zugriff auf deine MySQL-DB von PostgreSQL/PostGIS aus ist - mit dem notwendigen Wissen - jederzeit machbar.

      Gruss
      walter


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · tagtheworld (Gast) · 01.02.2018 09:43 · [flux]

      hallo und guten Morgen glglgl, hallo Walter,

      vorweg - vielen Dank für Eure schnellen Antworten.

      die beiden Zeilen sind hier drinne...

      {
      # Get the name of the school (if any), again with xpath
      list($name) = $school->xpath('tag[@k = "name"]/@v') + ['(unnamed)'];
      list($name) = $school->xpath('tag[@k = "contact:website"]/@v');
      list($name) = $school->xpath('tag[@k = "contact:email"]/@v');
      printf("#%02d: ID:%' -10s [%s,%s] %s\n", $index, $school['id'], $school['lat'], $school['lon'], $name);
      }

      zeile 42 und 43 sind die beiden Folgenden:

      list($name) = $school->xpath('tag[@k = "contact:website"]/@v');
      list($name) = $school->xpath('tag[@k = "contact:email"]/@v');

      ....ohne diese Zeilen geht alles problemlos - Ich dachte eben dass ich die weiteren Abfragen so einfügen kann!?

      Irgendetwas mache ich hier falsch!

      Freue mich auf einen Tipp
      TagTheWorld aka Martin

      ps: zum Thema PostgreSQL/ PostGIS etc.

      @Walter:

      Erweitere deine PostgreSQL-Datenbank mit PostGIS.
      Ein Zugriff auf deine MySQL-DB von PostgreSQL/PostGIS aus ist - mit dem notwendigen Wissen - jederzeit machbar.

      Werde mir PostGIS ansehen - im Moment hab ich den Eindruck, dass ich das noch nicht brauche. Sehe mir die Dokumente nochmals an. Du, Walter, bist
      ja ein wahrer PostGIS-Fan - gibt es denn einen direkten Import des Planetfiles in PostGIS? Du siehst ich sollte mich noch stärker mit dem Thema auseinandersetzten.

      Was mir im Moment noch etwas näher liegt, ist die Verwendung von Python Wrapper:

      a. Osmapi
      https://wiki.openstreetmap.org/wiki/Osmapi

      b:overpass-api-python-wrapper - thin Python wrapper around the OpenStreetMap Overpass API.
      GitHub - mvexel/overpass-api-python-wrapper: A thin Python wrapper ...
      https://github.com/mvexel/overpass-api-python-wrapper

      Hierzu werden von mir nächstens noch ein Paar Fragen hier auf dem Forum kommen. Aber dazu werde ich einen anderen Thread aufmachen. VG.


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · glglgl (Gast) · 01.02.2018 10:00 · [flux]

      tagtheworld wrote:

      zeile 42 und 43 sind die beiden Folgenden:

      list($name)␣=␣$school->xpath('tag[@k␣=␣"contact:website"]/@v');
      list($name)␣=␣$school->xpath('tag[@k␣=␣"contact:email"]/@v');
      

      ....ohne diese Zeilen geht alles problemlos - Ich dachte eben dass ich die weiteren Abfragen so einfügen kann!?

      Vermutlich geschieht das beim Auspacken des Ergebnisses.

      Hintergrund: Mit

      list($a,␣$b,␣$c…)␣=␣$array
      

      packst du den Inhalt von $array in die angegebene Variablen aus, d. h. dies ist eine Kurzform für

      $a␣=␣$array[0];␣$b␣=␣$array[1];␣$c␣=␣$array[2];␣…
      

      In deinem Fall hast du aber offenbar teilweise gar keine Tags mit contact:website oder contact:email.

      Von daher wäre es geschickter,
      1. erstmal andere Variablen als $name zu verwenden (sonst überschreibst du ja das zuvor ausgelesene)
      2. den Trick von zuvor anzuwenden und dem potentiell leeren Array einen Default-Eintrag anzuhängen, der dann verwendet wird, wenn die Query kein Ergebnis lieferte.

      Also

      #␣Get␣the␣name␣of␣the␣school␣(if␣any),␣again␣with␣xpath
      list($name)␣=␣$school->xpath('tag[@k␣=␣"name"]/@v')␣+␣['(unnamed)'];
      list($website)␣=␣$school->xpath('tag[@k␣=␣"contact:website"]/@v')␣+␣['(no␣website)'];
      list($email)␣=␣$school->xpath('tag[@k␣=␣"contact:email"]/@v')␣+␣['(no␣email)'];
      printf("#%02d:␣ID:%'␣-10s␣␣[%s,%s]␣␣%s␣%s␣%s\n",␣$index,␣$school['id'],␣$school['lat'],␣$school['lon'],␣$name,␣$website,␣$email);
      

    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · tagtheworld (Gast) · 01.02.2018 12:23 · [flux]

      hallo glglgl

      vielen Dank - jetzt funktioniert es.

      Habe verstanden dass es zu Komplikationen führt wenn ich $name verwende. Es kommt zu Schwierigkeiten - da sich hier ggf. das zuvor Ausgelesene überschrieben wird.

      Danke für die Hinweise.

      Viele Grüße

      say

      hier die Ausgabe:

      martin@linux-3645:~/dev/php>␣php␣o3.php
      Query␣returned␣2799␣node(s)␣and␣took␣9.36001␣seconds.
      
      33␣School(s)␣found:
      #00:␣ID:332534486␣␣␣[39.5018840,16.2722854]␣␣Scuola␣Elementare␣(no␣website)␣(no␣email)
      #01:␣ID:1428094278␣␣[39.3320912,16.1862820]␣␣(unnamed)␣(no␣website)␣(no␣email)
      #02:␣ID:1822746784␣␣[38.9075566,16.5776597]␣␣(unnamed)␣(no␣website)␣(no␣email)
      #03:␣ID:1822755951␣␣[38.9120272,16.5713431]␣␣(unnamed)␣(no␣website)␣(no␣email)
      #04:␣ID:2002566438␣␣[39.1349460,16.0736446]␣␣(unnamed)␣(no␣website)␣(no␣email)
      #05:␣ID:2056891127␣␣[39.4106679,16.8254844]␣␣(unnamed)␣(no␣website)␣(no␣email)
      #06:␣ID:2056892999␣␣[39.4124687,16.8286119]␣␣(unnamed)␣(no␣website)␣(no␣email)
      #07:␣ID:2272010226␣␣[39.4481717,16.2894353]␣␣Scuola␣dell'infanzia␣San␣Francesco␣(no␣website)␣(no␣email)
      #08:␣ID:2272017152␣␣[39.4502366,16.2807664]␣␣Scuola␣Media␣(no␣website)␣(no␣email)
      #09:␣ID:2358307794␣␣[39.5015031,16.3905965]␣␣I.I.S.S.␣Liceo␣Statale␣V.␣Iulia␣(no␣website)␣(no␣email)
      #10:␣ID:2358307796␣␣[39.4926280,16.3853662]␣␣Liceo␣Classico␣(no␣website)␣(no␣email)
      #11:␣ID:2358307797␣␣[39.4973761,16.3858275]␣␣Scuola␣Media␣(no␣website)␣(no␣email)
      #12:␣ID:2358307800␣␣[39.5015527,16.3941156]␣␣I.T.C.␣e␣per␣Geometri␣(no␣website)␣(no␣email)
      #13:␣ID:2358307801␣␣[39.4983862,16.3807796]␣␣Istituto␣Professionale␣(no␣website)␣(no␣email)
      #14:␣ID:2448031004␣␣[38.6438417,16.3873106]␣␣(unnamed)␣(no␣website)␣(no␣email)
      #15:␣ID:2458139204␣␣[39.0803263,17.1291649]␣␣Sacro␣Cuore␣(no␣website)␣(no␣email)
      #16:␣ID:2552412313␣␣[39.0765212,17.1224610]␣␣(unnamed)␣(no␣website)␣(no␣email)
      #17:␣ID:2582443083␣␣[39.0815417,17.1178983]␣␣Liceo␣Socio␣Biologico␣Gravina␣(no␣website)␣(no␣email)
      #18:␣ID:2585754364␣␣[38.8878393,16.4076323]␣␣Scuola␣Elementare␣(no␣website)␣(no␣email)
      #19:␣ID:2585754366␣␣[38.8877600,16.4076216]␣␣Scuola␣Media␣(no␣website)␣(no␣email)
      #20:␣ID:3071126720␣␣[38.6022703,16.5554408]␣␣Scuola␣Media␣(no␣website)␣(no␣email)
      #21:␣ID:3071127683␣␣[38.6027273,16.5563125]␣␣Scuola␣Elementare␣(no␣website)␣(no␣email)
      #22:␣ID:3081362915␣␣[39.2865638,16.2601963]␣␣Convitto␣Nazionale␣Bernardino␣Telesio␣(no␣website)␣(no␣email)
      #23:␣ID:3081362921␣␣[39.2856714,16.2613594]␣␣Liceo␣Classico␣B.␣Telesio␣(no␣website)␣(no␣email)
      #24:␣ID:3081362926␣␣[39.2888949,16.2577446]␣␣Scuola␣(no␣website)␣(no␣email)
      #25:␣ID:3732551794␣␣[39.5132435,16.2863285]␣␣(unnamed)␣(no␣website)␣(no␣email)
      #26:␣ID:3740289655␣␣[39.5167318,16.2838146]␣␣scuola␣media␣(no␣website)␣(no␣email)
      #27:␣ID:3740289656␣␣[39.5164344,16.2821103]␣␣scuola␣elementare␣(no␣website)␣(no␣email)
      #28:␣ID:4004532684␣␣[38.7804787,16.5122952]␣␣Liceo␣Artistico␣(no␣website)␣(no␣email)
      #29:␣ID:4589289756␣␣[38.6794209,16.1063084]␣␣Scuola␣Comprensiva␣Trentacapilli␣(no␣website)␣(no␣email)
      #30:␣ID:4843966477␣␣[39.0709866,17.1288384]␣␣Pegaso␣(no␣website)␣(no␣email)
      #31:␣ID:5297629775␣␣[38.5768845,16.3263536]␣␣Scuola␣Media␣Statale␣"Ignazio␣La␣Russa"␣(no␣website)␣(no␣email)
      #32:␣ID:5316865306␣␣[39.0807997,17.1264225]␣␣Enrico␣Fermi␣(no␣website)␣(no␣email)
      Query␣returned␣3␣node(s)␣and␣took␣9.83496␣seconds.
      
      martin@linux-3645:~/dev/php>
      

    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · glglgl (Gast) · 01.02.2018 13:22 · [flux]

      Prima! Jetzt wäre es noch hilfreich, zu wissen, ob Webseiten- und Emailadressenermittlung so korrekt ist. Denn soweit ich sehe, sind alle abgefragten Werte ohne eine der beiden Angaben.

      Am besten suchst du dir mal welche raus, von denen du weißt, dass sie welche haben und verifizierst das.


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · tagtheworld (Gast) · 01.02.2018 13:40 · [flux]

      hallo glglgl

      vielen Dank für dein erneutes Posten und diesen wichtigen Hinweis.

      Denke dass du Recht hast - da stimmt etwa noch nicht - ich suche mal in einem Bereich bei dem tatsächlich die DATEN vorhanden sind -dann kann man sehen, ob es mit dem oben genannten Ansatz geht oder noch nicht.

      glglgl wrote:

      Prima! Jetzt wäre es noch hilfreich, zu wissen, ob Webseiten- und Emailadressenermittlung so korrekt ist. Denn soweit ich sehe, sind alle abgefragten Werte ohne eine der beiden Angaben.

      Am besten suchst du dir mal welche raus, von denen du weißt, dass sie welche haben und verifizierst das.

      ja - das mache ich. Werde hier wieder reingucken u. Euch auf dem Laufenden halten.

      Viele Grüße

      TagTheWorld

      @ Walter: mit meinen noch eher bescheiedenen PostgreSQL Kompetenzen würde ich obige Abfragen einfach in eine MySQL DB reinlaufen lassen.
      ABER sicher - man kann hier auch PostgreSQL verwenden. .... 😉 Ich guck mir das mal an.


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · gormo (Gast) · 01.02.2018 13:55 · [flux]

      tagtheworld wrote:

      vielen Dank für dein erneutes Posten und diesen wichtigen Hinweis.

      Denke dass du Recht hast - da stimmt etwa noch nicht - ich suche mal in einem Bereich bei dem tatsächlich die DATEN vorhanden sind -dann kann man sehen, ob es mit dem oben genannten Ansatz geht oder noch nicht.

      Mir liefert die Overpass-API im genannten Bereich auch nur Schulen ohne website&email. Beachte bitte auch die unterschiedlichen Tagging-Schemata für websites (contact:website=* und website=*). Und dein Regex-Filter auf "beliebige Values im Key amenity" ist auch unnötig, denn

      [amenity]~".*"
      

      ist das gleiche wie

      [amenity]
      

      , wenn ich mich nicht täusche, nur schneller und netter für den Server weil kein Suchen mehr auf dem Server gemacht wird.


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · mmd (Gast) · 01.02.2018 14:05 · [flux]

      gormo wrote:

      nur schneller und netter für den Server weil kein Suchen mehr auf dem Server gemacht wird.

      Es macht hier keinen Unterschied, ~".*" wird automatisch wegoptimiert, da wird kein regulärer Ausdruck mehr auf derm Server ausgewertet.


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · wambacher (Gast) · 01.02.2018 14:07 · [flux]

      tagtheworld wrote:

      @ Walter: mit meinen noch eher bescheiedenen PostgreSQL Kompetenzen würde ich obige Abfragen einfach in eine MySQL DB reinlaufen lassen.
      ABER sicher - man kann hier auch PostgreSQL verwenden. .... 😉 Ich guck mir das mal an.

      Es geht hier nicht um PostgreSQL - das brauchs du nur, damit man PostGIS installieren kann und zudem der Zugriff auf MySQL möglich ist.

      Allerdings müssen die Koordinaten der Objekte in einem GIS-Format als Geometrie vorliegen. Felder mit lat und lon als ASCII-Text bringen da nicht viel.

      Gruss
      walter


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · tagtheworld (Gast) · 01.02.2018 15:24 · [flux]

      Hallo Walter, hallo Gormo,

      danke fürs Antworten!! 😉

      @ Gormo: Vielen Dank für deine Antwort u. die Hinweise. Ich werde heute Abend mal weitersuchen u. versuchen herauszufinden, ob ich nicht andere Daten finde, die hier weiteren Aufschluss geben. Bin sicher dass wir hier weiter kommen.

      Mir liefert die Overpass-API im genannten Bereich auch nur Schulen ohne website&email. Beachte bitte auch die unterschiedlichen Tagging-Schemata für websites (contact:website=* und website=*).

      Danke ich werde hier nochmals genauer nachsehen und die Unterschiede nächstens genauer berücksichtigen.

      diese beiden Schemata liefern Unterschiedliches:

      contact:website=*
      
      website=*
      

      Darüber hinaus sagst du....

      dein Regex-Filter auf "beliebige Values im Key amenity" ist auch unnötig,

      Danke!!!

      @Walter: - zum Thema PostGIS und sein Einsatz:

      {[sind hier schon in einem Methode (bzw. System-) Thread - vom Nutzen u. Nachteil von PostGIS für das ordinäre OSM-Leben.;)
      klar du hast Recht. Aber soweit ich die Stärke von PostGIS verstanden habe geht es dort auch um die Vorteile die vektorbasierte (GIS-) Standards ermöglichen.

      Um also ganz kurz hier in diesem Thread auf das Thema einzugehen -(und damit vllt. auch in der Chance da du PostGIS so gut kennst - )abzuklären ob ich das brauche - und damit beginnen soll hier ein paar Erwägungen / Fragen.

      @the Mods: sorry für das OT hier 😉 Kann nächstens gerne einen eigenen Thread aufmachen. 😉

      wambacher wrote:

      tagtheworld wrote:

      @ Walter: mit meinen noch eher bescheiedenen PostgreSQL Kompetenzen würde ich obige Abfragen einfach in eine MySQL DB reinlaufen lassen.
      ABER sicher - man kann hier auch PostgreSQL verwenden. .... 😉 Ich guck mir das mal an.

      Es geht hier nicht um PostgreSQL - das brauchs du nur, damit man PostGIS installieren kann und zudem der Zugriff auf MySQL möglich ist.
      Allerdings müssen die Koordinaten der Objekte in einem GIS-Format als Geometrie vorliegen. Felder mit lat und lon als ASCII-Text bringen da nicht viel.
      Gruss walter

      bislang habe ich lediglich mit verschiedenen Abfragen an der Overpass API gearbeitet:

      in den Verschiedenen Dateiformaten ( XML, JSON und CSV).
      Habe mir das PostGIS mal angesehen - sieht sehr gut aus. Das sieht sehr sehr advanced aus - ich werde mir das mal genauer ansehen..Denke dass diese wohl sehr leistungsfähig ist.

      was ich bis dato alles eingesetzt habe:

      - Osmfilter und Osmconvert.

      OSM und Scripten:

      - OSM Overpass API mit PHP SimpleXML: an Overpass Daten kommen mit Standard PHP.

      - Wget; http://overpass-api.de/command_line.html

      Und für das weiterverarbeiten in Skripten finde ich Python sehr interessant:

      - query Overpass Python library https://github.com/mvexel/overpass-api-python-wrapper

      - das Node JS package https://www.npmjs.com/package/query-overpass

      - für das Speichern großer Mengen von Daten - etwa in einer mysql-database mittels Python hier kann man z.B. auch peewee verwenden.

      Perl:

      - das Datenabfrage-Utility "opaQuery.pl von user KLAUS TOCKLOTH: http://www.freizeitkarte-osm.de/ perl scrip hab auch schon mit KLAUS TOCKLOTHs opaQuery einiges gemacht; das Datenabfrage-Utility "opaQuery.pl" Das Utility nutzt für OSM-Datenabfragen das Overpass-API unter Verwendung der Abfragesprache "Overpass-QL". Das Utility wird von der Kommandozeile aus benutzt und ist unter Linux, ( vgl. https://forum.openstreetmap.org/viewtopic.php?id=16937 )

      Nutzung:perl opaQuery.pl "Overpass-QL-String"

      Beispiel: perl opaQuery.pl "node ['name'='Gielgen'] (50.7,7.1,50.8,7.2); out meta;"
      Weitere Details zum Utility finden sich hier: http://www.easyclasspage.de/maptools/index.html

      PHP:

      - OSM Overpass API mit PHP SimpleXML: an Overpass Daten kommen mit Standard PHP.

      last but not least: Wget und Curl:

      - Wget; http://overpass-api.de/command_line.html

      - Curl - hier ein Beispiel:

      Curl: curl 'http://nominatim.openstreetmap.org/sear … onnecticut' -H 'Origin: http://overpass-turbo.eu' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36' -H 'Accept: */*' -H 'Connection: keep-alive' --compressed
      [{"place_id":"2578289456","licence":"Data \u00a9 OpenStreetMap contributors, ODbL 1.0. http:\/\/www.openstreetmap.org\/copyright","osm_type":"way","osm_id":"305805056","boundingbox":["41.2371844","41.3774174","-73.5509631","-73.438191"],"lat":"41.2814842","lon":"-73.4981792","display_name":"Ridgefield, Fairfield County, Connecticut, United States of America","class":"boundary","type":"administrative","importance":0.62842337196131,"icon":"http:\/\/nominatim.openstreetmap.org\/images\/mapicons\/poi_boundary_administrative.p.20.png"},{"place_id":"57921086","licence":"Data \u00a9 OpenStreetMap contributors, ODbL 1.0. http:\/\/www.openstreetmap.org\/copyright","osm_type":"way","osm_id":"21923588","boundingbox":["42.2668794","42.2694486","-88.3335358","-88.3264975"],"lat":"42.2694329","lon":"-88.3290606","display_name":"Connecticut Trail, Holcombville Corners, McHenry County, Illinois, 60012, United States of America","class":"highway","type":"residential","importance":0.2}]

      Fazit: werde mir PostGIS jetzt mal näher ansehen... : in einem Einsteigertutorial zu PostGIS liest man folgendes: http://www.bostongis.com/?content_name=postgis_tut01

      The most common queries we will be doing on this query are spatial queries and queries by the town field. So we will create 2 indexes on these fields. NOTE: The loader has an option to create the spatial index which we took advantage of, so the spatial index one is not necessary but we present it here, just so if you ever need to create a spatial index, like for csv loaded data, you know how to.

      CREATE INDEX idx_towns_geom
      ON towns
      USING gist(geom);

      CREATE INDEX idx_towns_town
      ON towns
      USING btree(town);

      Querying Data

      Go back into PgAdmin III and refresh your view. Verify that you have a towns database now.
      Test out the following queries from the query tool

      SELECT ST_Extent(geom) FROM towns WHERE town = 'BOSTON';

      SELECT ST_Area(ST_Union(geom)) FROM towns WHERE town = 'BOSTON';

      Viewing the Data

      If you are a GIS newbie, I highly recommend using QGIS. QGIS has ability to view PostGIS data both geometry and raster directly, do simple filters on it, is free, is cross-platform (Linux, Windows, MacOSX,Unix) and is the least threatening of all the GIS Viewers I have seen out there for people new to GIS.

      Also - mein Schwerpunkt der Beschäftigung mit OpenStreetMap liegt in solchen oben (im Threadstart) genannten schlichten Abfragen.
      Ich bin kaum an den Map (grafiken) interessiert vielmehr an POI Geschichten.

      Bin also nicht sicher ob ich dann in die PostGIS-Geschiche einsteigen soll(te).

      Fragen:

      - Käme denn auch bei meinen - sagen wir mal eherOberflächen-Interessen-geleiteten-Ansatzes - der sich für Abfragen rund um POI-Thematiken interessiert auch die Vorteile einer PostGIS zum Tragen?

      - Würde sich PostGIS auch hier anbieten?

      - Last but not Least: Ich arbeite ausschließlich mit lat und lon als ASCII-Text (siehe obige Abfragen die mein Schwerpunkt bilden.

      hingegen kann PostGIS viel viel mehr und anderes: vgl https://de.wikipedia.org/wiki/PostGIS

      Von PostGIS unterstützte Funktionen und Operatoren:

      Räumliche Funktionen wie Berechnung von Flächen und Distanzen, Verschneidung, Berechnung von Pufferzonen etc.
      Räumliche Operatoren wie Overlaps, Within, Contains etc.
      Funktionen für die Erstellung von Geometrien
      Analyse von Raster- und Vektordaten
      Funktionen für die Abfrage von Geometrien in den Formaten Well-Known Text, Well-Known Binary, GML, SVG, KML
      Räumliche Indizierung mit dem GiST-Index

      Womit ich mich nächstens noch auseinandersetzen werde ist der Einsatz eines Overpass API python wrappers.

      Freue mich auf Deine Antwort,

      vG TTW aka Martin 😉


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · wambacher (Gast) · 01.02.2018 17:07 · [flux]

      tagtheworld wrote:

      Also - mein Schwerpunkt der Beschäftigung mit OpenStreetMap liegt in solchen oben (im Threadstart) genannten schlichten Abfragen.
      Ich bin kaum an den Map (grafiken) interessiert vielmehr an POI Geschichten.

      Bin also nicht sicher ob ich dann in die PostGIS-Geschiche einsteigen soll(te).

      Aber sicher! damit steht dir die ganze GIS-Welt offen. Und das bei Verwendung anerkannter OGC-Standards.

      QGIS benutze ich auch, aber nur um bestimmte Daten grafisch darzustellen (nicht mit Rendern verwechseln, das ist ne andere Baustelle):

      Aktuelles Projekt: Stand der Erfassung der Postleitzahlgrenzen in Österreich.



      Sind "nur" einige Layer, die auf PostGIS-Abfragen beruhen. Hier mal die Query für das PLZ-Layer (gelb):

      "osm_id"␣<␣0
      and␣boundary␣=␣'postal_code'
      and␣pointonsurface␣@␣(select␣bbox␣from␣boundaries␣where␣country='AUT'␣and␣level='2')
      and␣st_contains((select␣way␣from␣boundaries␣where␣country='AUT'␣and␣level='2'),pointonsurface)
      

      selektiert alle Relationen (osm_id<0), die PLZ-Grenzen (boundary=postal_code) sind und in Österreich (country='AUT' and level='2) liegen.

      Aufwand für das Layer: 5 Minuten. Laufzeit 60 Sekunden bei einer PostgreSQL-DB mit 1.6 TB - (Terabyte!) Größe.

      Fragen:

      - Käme denn auch bei meinen - sagen wir mal eherOberflächen-Interessen-geleiteten-Ansatzes - der sich für Abfragen rund um POI-Thematiken interessiert auch die Vorteile einer PostGIS zum Tragen?

      Aber sicher. Den Start- oder auch Endpunkt eines Ways bekommst du z.B mit ST_Startpoint(way) bzw. ST_Endpoint(way) geliefert.

      - Würde sich PostGIS auch hier anbieten?

      hattu doppelt gefragt.

      - Last but not Least: Ich arbeite ausschließlich mit lat und lon als ASCII-Text (siehe obige Abfragen die mein Schwerpunkt bilden.

      Wenn du 1x lat/lon in Geometrien umrechnen lässt (dafür gibt es natürlich PostGIS-Funktionen) hat jedes Objekt (Knoten, Weg, Fläche) genau ein geom-Feld in der Tabelle, in dem alles drin steht - egal ob es nur ein Punkt oder die Fläche von Deutschland mit allen Inseln ist. Anschliessend kannst du dutzende von Gis-Funktionen darauf anwenden bzw. selber schreiben. Hast du ja schon selber erkannt.

      Womit ich mich nächstens noch auseinandersetzen werde ist der Einsatz eines Overpass API python wrappers.

      naja, das aktuelle Projekt würde ich jetzt nicht gerade umkrempeln aber mit PostGIS stehen dir Möglichkeiten zu Verfügung, von denen du wohl noch nie was gelesen hast.

      Ich denke da an Topologien https://www.battefeld.com/bricscad_und_ … ssernetzes und Bildverarbeitung mit Rastern http://www.rivm.nl/media/Geodata/Beheer … raster.pdf. Alles drin.

      Bücher gibt auch darüber. Hier das beste: https://www.manning.com/books/postgis-i … nd-edition

      Und denk dran - wir haben alle mal klein angefangen. Ich hab auch meine Zeit gebraucht.

      Gruss
      walter


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · Harald Hartmann (Gast) · 01.02.2018 18:02 · [flux]

      tagtheworld wrote:

      - Last but not Least: Ich arbeite ausschließlich mit lat und lon als ASCII-Text (siehe obige Abfragen die mein Schwerpunkt bilden.

      Hmm, also nochmal zum Verständnis: du extrahierst mit diversen Scripts aus den OSM Daten letztendlich ASCII Daten, um diese in eine MySQL (o.a.) zu importieren. Soweit so gut. Darf man fragen, wie dann die weitere Nutzung der Daten ist, also was du dann z.B. mit den lat/lon Spalten von deiner MySQL machst?

      Ich glaube es wäre vielleicht ganz gut, wenn du mal deutlich und plastisch beschreibst, was denn das Endprodukt nach bzw. aus deiner MySQL Datenbank sein soll.

      Nachtrag: Und hast du dich eigentlich mal mit XSLT beschäftigt?


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · tagtheworld (Gast) · 02.02.2018 17:06 · [flux]

      Hallo Harald hallo Walter,

      vielen Dank für Eure Antworten, Beiträge und Anregungen. Sehr sehr spannend alles - und ich merke dass ich in jedem einzelnen Thread sehr viel dazulerne und sich irgendie neue Seiten an Openstreetmap sehe. Ja sogar von Posting zu Posting 😉

      @ Walter: Wow das ist ja ganz beachtlich. Finde es sehr leistungsfähig was PosGIS hier macht. Eröffnet ganz neue Welten. Und das bei Verwendung anerkannter OGC-Standards. Bis dato hatte ich weniger Interesse daran, bestimmte Daten grafisch darzustellen. Aber wie man sieht ist PostGIS ggf. auch für mich - der im Moment kein Interesse daran hat auch etwas dabei.

      Also ich denke drüber nach die lokale DB auf PostgreSQL/PostGIS umstellen. Vielleicht taugen hier die Ansätze von PS/PG auch ganz gut. Dann kann ich von meiner MySQL-Umgebung auf PostGIS umsteigen.

      @ Harald: Nun ich hab als Pädagoge ein spez. Interesse an den Themen, Netzwerken, Lernen, Weitergabe von Wissen,
      Bin darüber hinaus ferner interessiert an Austausch, Kontakt - mit Schulen usw.
      Empirisch: Was auffällt ist dass mMn der Ausbau der Map - und die Aktivität also der Mapper sehr unterschiedlich ist. In Deutschland gibt es eine sehr aktive Community - in anderen Ländern z.T. etwas schwächer ausgeprägt.

      Hier eine Veranschaulichung dessen was ich meine:

      users: Germany 17,544 Threads 243,593 posts
      users: Israel 435 T 3,352 p
      users: Netherlands 2,668 t 38,510 p
      users: Turkey 4 t 4 p
      users: Nepal 60 t 228 p

      vgl. Daten aus dem Forum _ btw_: gibt es denn hier auch empirische Untersuchugen?!

      Das techn. Interesse: also ich kenne mich etwas aus in den Sprachen PHP, Python, weniger gut in Perl - und XSLT.

      Mein technisches Interesse greift hier (an dem oben Gesagten) ein - vernetzt sich sozusagen damit. Technisches Interesse greift hier ein - man - abgesehen von den DATEN in diesem Forum wie aktiv die Communities (/maW. die Mapper in den jeweiligen Ländern) sind.
      Technisch bin ich an OSM interessiert - auch die in den Maps sich niederschlagenden Daten mir aufzuschlüsseln. Also, mit anderen Worten: wenn ich Toolchains ausprobieren - und sehe wie, aktiv die Mappingprozesse sind. Das ist absolut analog. Um das mal etwas plastisch zu machen und anschaulich hier mal ein kleines Beispiel.

      Beispiel: einer Abfrage: Abfragen z-.B. in Spanien liefern einen anderen Datensatz - eine andere _Dichte_ Sieht man mal z.B. auf folgende Abfrage:

      [out:csv(::id,::type,"name","addr:postcode","addr:city","addr:street","addr:housenumber","website","␣contact:email=*")][timeout:600];
      {{geocodeArea:España}}->.a;
      (␣node(area.a)[amenity=hospital];
      way(area.a)[amenity=hospital];
      rel(area.a)[amenity=hospital];);
      out;
      

      Einige Informationen stehen aber auch unter contact:website oder email. Von den über 2500 Krankenhäusern in Spanien haben 1998 keine Straßenangabe in ihrer Adresse, 2067 keinen Ort, 2090 keine Postleitzahl sowie nur 7 eine contact:email, 5 eine contact:website, 16 eine email und 107 eine website.
      Nun da ist es wieder: Da ist mein Interesse - wie kommt so etwas zustande - wie organisieren, motivieren, sich denn die Mapping-Prozesse?

      Also meine nächsten Beschäftigungen:

      - technisch: mich mal mit XSLT auseinandersetzen - https://de.wikipedia.org/wiki/XSL_Transformation und darüber hinaus:
      - mir mal weitere Literatur / Online-Tutorials für den Einstieg in PostGIS suchen; Denke, es macht Sinn das mal näher anzusehen.
      - last but not least: dem _non_techn_interesse folgend: hier nochmals vorbeigucken: https://flosshub.org/ bzw. https://flosshub.org/biblio
      dort wird v.a. das Open Source Phänomene beschrieben - aber denke dass vllt. auch das OSM mitbechrieben wird.

      vg TagTheworld.


    • Re: Abfragen an den Endpunkt der Overpass-API - Verarbeitung mit XPath · Harald Hartmann (Gast) · 02.02.2018 18:35 · [flux]

      tagtheworld wrote:

      Einige Informationen stehen aber auch unter contact:website oder email. Von den über 2500 Krankenhäusern in Spanien haben 1998 keine Straßenangabe in ihrer Adresse, 2067 keinen Ort, 2090 keine Postleitzahl sowie nur 7 eine contact:email, 5 eine contact:website, 16 eine email und 107 eine website.
      Nun da ist es wieder: Da ist mein Interesse - wie kommt so etwas zustande - wie organisieren, motivieren, sich denn die Mapping-Prozesse?

      Wie solch unterschiedliche Datendichten zu Stande kommen? Kurz: unterschiedliches Interesse, und auch unterschiedliche Meinungen.

      - rein theoretisch (und eigentlich auch praktisch) braucht man z.B. weder Postleitzahl noch Ort zu erfassen, wenn die entsprechenden administrativen Grenzen gepflegt sind, weil dann macht man mit PostGIS einfach eine spatiale Abfrage (in welchem Gebiet findet sich Punkt XY).
      - Und auch so Daten wie Telefonummer, Emailadresse, Website ... da gibt es genug Leute die der Meinung sind, dass OpenStreetMap kein Branchenbuch ist und es deshalb auch nicht eintragen.
      - Umso detailierter man Daten erfasst, umso aufwändiger wird ja dann auch der DatenPFLEGEaufwand (initiales Erfassen ist - sehr - einfach, die Daten aktuell zu halten und zu pflegen unterschätzen viele).