User:Tagtheworld/Abfragen an den Endpunkt der Overpass API hier mit PHP

From OpenStreetMap Wiki
Jump to navigation Jump to search


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),
]]);

# 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
//

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

# 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 [url=http://wiki.openstreetmap.org/wiki/Key:contact]Key:contact - OpenStreetMap Wiki[/url]


    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
#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
#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
#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
#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
#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
#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
#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
#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
#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
#09: ID:2358307794  [39.5015031,16.3905965]  
PHP Notice:  Undefined offset: 0 in /home/martin/dev/php/o2.php on line 42


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


TagTheWorld