User:Tagtheworld

From OpenStreetMap Wiki
Jump to: navigation, search
weitere Themen auf Unterseiten
Sprachen und Techniken
Overpass und Osmconvert
PHP
Perl
SimpleXMLElement::xpath
CSV-Export
overpass-api commandline
Datenbankanbindung
weitere-themen

My interests in openstreetmap


aimed is to transform data out of German osm-pbf-files - in order to get the data (not to creat maps again) see the source (s)= http://download.geofabrik.de/europe/germany.html ranging form 10 MB (Bremen) to 390 MB (Nordrhein Westfalen) the osm.pbf-files are not too big; Question: which method is the best - the most appropiate? - to store the results in a mysql-db or just have big calc-sheets (with csv-data)

- only straightforward from files that - no backimport of data to OSM from a .csv file

i want to gather data from .o5m & pbf file - several ways are possible: what is wanted: i look for restaurants - with all of the following tags: all i want is to get POI out of the OSM-File - and to hold them on a dayly updated version: in other words - i want to keep them updqated - day by day. Well i guess that i can do that with osmfilter and osmconvert - but there are probably better ways to do it:


- PostGis as a solution for getting a database populated by osm2pgsql or osmconvert / -filter to create csv-sheets: probably PostGIS is tooo big and the learing curve is to steep; Note;: i only want to have POIS from the OSM-File. Nothing more.
- MySQL seems to be better for what i am having in mind

Technologically and methodolocically i am inspired by Martijn van Exel approach to keep an overview on the US-bridges note;: he looks for the bridges in the US ( http://oegeo.wordpress.com/2012/03/06/a-self-updating-openstreetmap-database-of-us-bridges-a-step-by-step-guide/ )

There are about 125,000 of them – So on the scale of OpenStreetMap data it’s a really small subset. In terms of the tools and processes needed, the task seems easy enough, and as long as you are satisfied with a one-off solution, it really is. You would need only four things:


- A planet file
- A boundary polygon for the United States
- A PostGIS database loaded with the osmosis snapshot schema and the linestring extension osmosis, the OpenStreetMap ETL swiss army tool.

That, and a single well-placed osmosis command:... [...] end of cit.. source cf http://oegeo.wordpress.com/2012/03/06/a-self-updating-openstreetmap-database-of-us-bridges-a-step-by-step-guide/ )

note: the Martjin wants to get the data of all bridges in the US that are mapped in OpenStreetMap in a PostGIS database that stays as up-to-date as possible, reflecting all the latest changes."


Intention:

Bin ganz neu im Thema OpenStreetMap: In Verbindung mit Sprachen wie PHP / Perl versuche ich mit den Planetfiles erste Schritte der Abfrage, Verarbeitung und lokalen Retrivals.

Dabei setze ich mich mit den folgenden Techniken auseinander:



osmconvert und osmfilter
Overpass-API und Overpass-Turbo-API

wie gesagt scheinen mir für automatisierte Abfragen und quasi-automatischen Auffrischungen der lokalen Datenbank scheinen mir mit Abfragen via Perl oder PHP eleganter zu machen zu sein als mit osmconvert u. osmfilter.

Ziel ist es derzeit zu versuchen POIs über Abfragen zu beziehen und dann in Textdateien / resp. einer DB überführen, also sondern direkt in eine eigene Datenbank zu überführen. es ist nicht beabsichtigt - aus den Daten wieder Karten zu bauen - aber sehr wohl die Daten aktuell zu halten - d.h. die Tabelle zu aktualisieren. Untenstehend einige Versuche: Insgesamt gilt: Die Seite wird noch weiter entwickelt - ich suche Anregungen die helfen, Abfragen via Overpass-API mittels der Sprachen.



- Perl
- PHP
- in Verbindung mit den Datenbanken, MySQL, Postgresql, MongoDB, u.s.w.


Beabsichtigt, ist es alles so zu gestalten, dass sie so ein Auffrischen der Datenbank ermöglichen. Sehr interessiert bin ich auch an einem Einsatz von PostgreSQL.


Anlegen der Datenbank

Nebenbei: Auf meiner OpenSuse 13.1 habe ich eine MySQL-DB eingerichtet. Anm; Einige bemerken dass ich mit Postgis anfange - einige sagen dass Postgresql zum Einstieg auch genügt. Postgis ist sicher sehr gut unterstützt - ist ggf. aber wegen meiner nur sehr geringen Anforderungen ggf. etwas oversized. Allerdings kann ich mir gut vorstellen dass ich das demnächst statt in MySQL in Postgresql umsetze. Zwischendurch bemerkt; denke dass ich das zwar in Postgis oder Postgresql machen koennte, aber anfangen will ich mit Mysql - damit kenn ich mich schon etwas aus.

Anlegen der Datenbank: Zuerst gilt es eine Tabelle zu erstellen - z.B 'pois' erstellt und dort die einzelnen Spalten anlegt. Alternativ geht es auch mit dem folgendem untenstehenden SQL-Script. Zuerst habe ich die Tabelle 'pois' erstellt und dort die einzelnen Spalten anlegt. Alternativ geht es auch mit folgendem SQL-Script. Und an dieser Stelle verweise ich dankbar auf die Inspiration von User Brogo (mit seiner Seite zur Datenbankanbidnug ( http://wiki.openstreetmap.org/wiki/User:Brogo/OpenLayers_Datenbankanbindung ) Er gab mir viele Anregungen - die ich in meine Ideen / Ansätze übernommen habe.

Wie oben bereits bemerkt, bin ich nicht daran interessiert Daten wieder zu einer Map zusammenzubauen. Mir reicht es die DATEN aus dem planet-file zu ziehen u. dann als Text-Dateien vorliegen zu haben. Es geht mir um POIs

Intention: Ich wollte versuchen POIs über Abfragen zu beziehen und dann in Textdateien / resp. eine DB überführen, also sondern direkt in eine eigene Datenbank zu überführen. Es ist nicht beabsichtigt - aus den Daten wieder Karten zu bauen - aber sehr wohl die Daten aktuell zu halten - d.h. die Tabelle zu aktualisieren.


Anlegen der Datenbank: Diese hat folgende Spalten


id lat lon name amenity website e-mail vending


CREATE DATABASE `db123` DEFAULT CHARACTER SET latin1 COLLATE latin1_german2_ci;
USE hans;

CREATE TABLE `pois` (
  `id` bigint(20) unsigned NOT NULL,
  `lat` float(10,7) NOT NULL,
  `lon` float(10,7) NOT NULL,
  `name` varchar(255) collate utf8_bin NOT NULL,
  `amenity` varchar(255) collate utf8_bin NOT NULL,
  `adress` varchar(255) collate utf8_bin NOT NULL,
 `town` varchar(255) collate utf8_bin NOT NULL,
 `street` varchar(255) collate utf8_bin NOT NULL,
 `housenumber` varchar(255) collate utf8_bin NOT NULL,
 `website` varchar(255) collate utf8_bin NOT NULL,
  `e-mail` varchar(255) collate utf8_bin NOT NULL,
  `vending` varchar(255) collate utf8_bin NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


Nebenbei: Auf meiner OpenSuse 13.1 habe ich eine MySQL-DB eingerichtet. Anm; Einige bemerken dass ich mit Postgis anfange - einige sagen dass Postgresql zum Einstieg auch genügt. Postgis ist sicher sehr gut unterstützt - ist ggf. aber wegen meiner nur sehr geringen Anforderungen ggf. etwas oversized. Allerdings kann ich mir gut vorstellen dass ich das demnächst statt in MySQL in Postgresql umsetze. Zwischendurch bemerkt; denke dass ich das zwar in Postgis oder Postgresql machen koennte, aber anfangen will ich mit Mysql - damit kenn ich mich schon etwas aus.

Anlegen der Datenbank: Zuerst gilt es eine Tabelle zu erstellen - z.B 'pois' erstellt und dort die einzelnen Spalten anlegt. Alternativ geht es auch mit folgendem SQL-Script. Zuerst habe ich die Tabelle 'pois' erstellt und dort die einzelnen Spalten anlegt. Alternativ geht es auch mit folgendem SQL-Script. Und an dieer Stelle verweise ich auf die Inspiration von User Brogo (mit seiner Seite zur Datenbankanbidnug ( http://wiki.openstreetmap.org/wiki/User:Brogo/OpenLayers_Datenbankanbindung )

Wie oben bemerkt bin ich nicht daran interessiert Daten wieder zu einer Map zusammenzubauen. Mir reicht es die DATEN aus dem planet-file zu ziehen u. dann als Text-Dateien vorliegen zu haben. Es geht mir um POIs: Was ich bislang mit osm gemacht habe; ich habe bisher immer meine Daten in CSV-Dateien hinterlegt: dabei habe ich mit folgenden Tools gearbeitet.

osmconvert und osmfilter

Immer wieder wird mir gesagt ich sollte doch auf Postgis setzen - weg von dem "Low-Level-Processing." Eigentlich - denke ich, ist mir das Thema etwas zu groß für das was ich mache. Deshalb hatte ich eine andere Überlegung und nun wollte ich Euch fragen, ob es gewisse Grundlagen dafür gibt. Was mache ich in der Regel: In der Regel frage ich in den OSM-Daten nur bestimmte POI ab erstelle daraus eine Liste - und wenn es hoch kommt (in einem von 50 Fällen) mache ich daraus eine thematische Karte. In der einfachsten Anwendung wären das also lediglich POIs und einen Überblick darauf. Sehr gern will ich diese Daten dann immer aktuell halten. Also updates haben. Denke dass es nicht die beste aller Optionen ist dafür mit CSV basierten calc-listen zu arbeiten - sondern ggf doch etwas angemessener ist mit mysql zu arbeiten. Meine Überlegungen gehen also nun dahin diese Daten lediglich in einer CSV vorzuhalten sondern in einer mySQL-Datenbank.

Was ich bisher gemacht habe; ich habe z.B. nach Restaurants geschaut mit den folgenden tags:

@id @lon @lat amenity name adress [as town, street, housnumber] website und mailadress.

Aufs Ganze gesehen interessiert mich nur die REGION Deutschland - bzw. die Bundesländer vgl. http://download.geofabrik.de/europe/germany.html

Dort sind es die Files von ca. 10 MB (Bremen) bis zu etwa 390 MB (Nordrhein Westfalen) - wie man sieht sind diese osm.pbf-files noch nicht sehr groß - oder was meint ihr denn;

Haupt-Frage: welche Methode ist denn hier die beste? - Die Ergebnisse in einer mysql-db zu speichern oder sie in Calc-sheets speichern (mit csv Daten)1

Gearbeitet hab ich mit dem folgenden Toolset:

- osmfilter - osmconvert

ein Bspl:


./osmconvert ein file aus deutschland ....osm --all-to-nodes --csv="@id @lon @lat amenity name" --out-csv -o=outfile.csv


und dann

grep cafe outfile.csv > cafes.csv
grep restaurant outfile.csv > restaurants.csv
cat cafes.csv restaurants.csv > cafes_and_restaurants.csv

b. auf der anderern Hand koennte ich das ggf. auch so machen: mit der overpass-api:


untenstehend die beiden skripte:

die datei osm_to_db.pl ferner die datei create_db.pl

eine Ausgabe von overpass-api;

mysql.txt

<node id="2064639440" lat="49.4873181" lon="8.4710548">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="turkish"/>
    <tag k="email" v="info@lynso.de"/>
    <tag k="name" v="Kilim  - Café und Bar Restaurant"/>
    <tag k="opening_hours" v="Su-Th 17:00-1:00; Fr, Sa 17:00-3:00"/>
    <tag k="operator" v="Cengiz Kaya"/>
    <tag k="phone" v="06 21 - 43 755 371"/>
    <tag k="website" v="http://www.kilim-mannheim.de/"/>
  </node>
  <node id="2126473801" lat="49.4851170" lon="8.4756295">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="italian"/>
    <tag k="email" v="mannheim1@vapiano.de"/>
    <tag k="fax" v="+49 621 1259 779"/>
    <tag k="name" v="Vapiano"/>
    <tag k="opening_hours" v="Su-Th 10:00-24:00; Fr-Sa 10:00-01:00"/>
    <tag k="operator" v="Vapiano"/>
    <tag k="phone" v="+49 621 1259 777"/>
    <tag k="website" v="http://www.vapiano.de/newsroom/?store=29"/>
    <tag k="wheelchair" v="yes"/>
  </node>
 

  <node id="667927886" lat="49.4909673" lon="8.4764904">
    <tag k="addr:city" v="Mannheim"/>
    <tag k="addr:country" v="DE"/>
    <tag k="addr:housenumber" v="5"/>
    <tag k="addr:postcode" v="68161"/>
    <tag k="addr:street" v="Collinistraße"/>
    <tag k="amenity" v="restaurant"/>
    <tag k="name" v="Churrascaria Brasil Tropical"/>
    <tag k="phone" v="+496211225596"/>
    <tag k="wheelchair" v="limited"/>
  </node>
  <node id="689928440" lat="49.4798794" lon="8.4853418">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="greek"/>
    <tag k="email" v="epirus70@hotmail.de"/>
    <tag k="fax" v="0621/4407 762"/>
    <tag k="name" v="Epirus"/>
    <tag k="opening_hours" v="Mo-Sa 12:00-15:00,18:00-24:00"/>
    <tag k="phone" v="0621/4407 761"/>
    <tag k="smoking" v="separated"/>
    <tag k="website" v="http://epirus-ma.blogspot.com/"/>
    <tag k="wheelchair" v="no"/>
  </node>
  <node id="689928445" lat="49.4799409" lon="8.4851357">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="italian"/>
    <tag k="email" v="gianlucascurti@ristorante-augusta.de"/>
    <tag k="name" v="Ristorante Augusta"/>
    <tag k="opening_hours" v="Mo-Fr 12:00-14:00,18:00-23:00;Su 12:00-14:00,18:00-23:00"/>
    <tag k="phone" v="0621 449872"/>
    <tag k="website" v="ristorante-augusta.com/"/>
    <tag k="wheelchair" v="no"/>
  </node>


Wichitg: ich will das Ganze so robust machen, dass - egal ob wenig Tags im XML drinne sind oder auch mal viele, die Datenbankanbidnug stabil u. robust funktioniert....


untenstehend die beiden skripte:

- die datei osm_to_db.pl - ferner die datei create_db.pl


Frage; wo tu ich die Datei pois.osm hin - in die create_db.pl ? wie geht das denn mit dem osm.ph (von Gerhard Schwanz)?

hier hin: /home/perl/OSM and put the osm.pm

Ferner noch wichtig: brauch ich nicht auch noch osmDB.pm dort Und last but not least; brauch ich denn ggf noch Compress::Bzip2  ?


Also ein paar Fragen sind noch offen - aber ich denke ich komm schon so langsam weiter. Hier einmal ein kurzer Überblick:


hier das skript: osm_to_db.pl

Da ich mich mit Perl nicht auskenne, habe ich die Bibliothek osm.pm von Garry68 benutzt. Darauf aufbauend konnte ich folgendes Perl-Script schreiben.


 
#!/usr/bin/perl 
use strict ;
use DBI;
use XML::Twig;
 
# prepare database
my $dbh=dbh(); # connect
init();
$dbh->do('USE db123');
#$dbh->do('DELETE FROM pois');
 
# sql
my $sql = 'REPLACE INTO pois VALUES (?,?,?,?,?,?)';
my $sth = $dbh->prepare($sql);
 
# set up handler
my $t = XML::Twig->new( 
  twig_handlers => { 'node' => \&node }
);
 
# parse xml
my $xml = do { local $/; <DATA> };
$t->parse($xml);
#$t->parsefile('.osm');
 
sub node {
  my ($t,$elt) = @_;
  
  my %data=(
   'id'  => $elt->att('id'),
   'lat' => $elt->att('lat'),
   'lon' => $elt->att('lon'),
   );
  for my $tag ( $elt->children() ){
    $data{$tag->att('k')} = $tag->att('v');
    #print $tag->att('k').' = '.$tag->att('v')."\n";
  }
 
  # update database
  my @f = map{ $data{$_} }('id','lat','lon','name','amenity','operator');
  if ($f[3] ne '' && $f[4] ne '' && $f[5] ne ''){
    print "-- INSERT --\n".
    (join "\n",@f).
    "\n\n";
    $sth->execute(@f);
  }
}
 
 
sub init {
  $dbh-> do('CREATE DATABASE IF NOT EXISTS db123 
             DEFAULT CHARACTER SET latin1 
             COLLATE latin1_german2_ci');
  $dbh->do('USE db123');
  $dbh->do('CREATE TABLE IF NOT EXISTS pois (
           id       BIGINT(20) UNSIGNED NOT NULL,
           lat      FLOAT(10,7) NOT NULL,
           lon      FLOAT(10,7) NOT NULL,
           name     VARCHAR(255) COLLATE utf8_bin NOT NULL,
           amenity  VARCHAR(255) COLLATE utf8_bin NOT NULL,
           operator VARCHAR(255) COLLATE utf8_bin NOT NULL,
           PRIMARY KEY  (id)
          ) ENGINE=MyISAM DEFAULT 
            CHARSET=utf8 
            COLLATE=utf8_bin');
}
 
sub dbh {
  my $dsn = "DBI:mysql:database=;host=localhost";
  my $dbh = DBI->connect($dsn, 'user', 'pwd',
            {RaiseError => 1, PrintError => 1}) 
            or die (Error connecting " $DBI::errstr");
}

ferner noch das skript create_db.pl

  #!/usr/bin/perl -w
   
  use strict ;
  use OSM::osm ;
   
  my $file ;
  my $nodeUser ;
  my @nodeTags ;
  my $nodeTags ;
  my $ref1 ;
  my $line ;
  my $tag;
  my $nodeName;
   
  my $id ="1" ;
  my $lat ;
  my $lon ;
  my $name ;
  my $amenity ;
  my $operator ;
  my $vending;  
   
   
$file = "pois.osm" ; open(AUSGABE, ">mysql.txt");
$file = "pois.osm" ;

       
  openOsmFile ($file) ;
  open(AUSGABE, ">c:/osm/planet/mysql.txt");
  ($id, $lon, $lat, $nodeUser, $ref1) = getNode2 () ;
   
  while ($id != -1 ) {
      $name ="" ;
      $amenity ="" ;
      $operator ="" ;
      $vending ="" ;
   
      @nodeTags = @$ref1;
      foreach my $tag    (@nodeTags) {
          if ($tag->[0] eq "name") { $name = scalar ($tag->[1] )};
          if ($tag->[0] eq "amenity") { $amenity = scalar ($tag->[1] )};
          if ($tag->[0] eq "operator") { $operator = scalar ($tag->[1] )};
          if ($tag->[0] eq "vending") { $vending = scalar ($tag->[1] )}
          }            
      if     ($name ne "" | $amenity ne "" | $operator ne"" | $vending ne"")
          {print AUSGABE "$id^$lat^$lon^$name^$amenity^$operator^$vending\n";}
      ($id, $lon, $lat, $nodeUser, $ref1) = getNode2 () ;
   
  }
  close(AUSGABE);
  closeOsmFile () ;


In PHP koennte das so etwa ausshen


 
$xmlstr = <<<XML
<data>
<node id="2064639440" lat="49.4873181" lon="8.4710548">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="turkish"/>
    <tag k="email" v="info@lynso.de"/>
    <tag k="name" v="Kilim  - Café und Bar Restaurant"/>
    <tag k="opening_hours" v="Su-Th 17:00-1:00; Fr, Sa 17:00-3:00"/>
    <tag k="operator" v="Cengiz Kaya"/>
    <tag k="phone" v="06 21 - 43 755 371"/>
    <tag k="website" v="http://www.kilim-mannheim.de/"/>
  </node>
  <node id="2126473801" lat="49.4851170" lon="8.4756295">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="italian"/>
    <tag k="email" v="mannheim1@vapiano.de"/>
    <tag k="fax" v="+49 621 1259 779"/>
    <tag k="name" v="Vapiano"/>
    <tag k="opening_hours" v="Su-Th 10:00-24:00; Fr-Sa 10:00-01:00"/>
    <tag k="operator" v="Vapiano"/>
    <tag k="phone" v="+49 621 1259 777"/>
    <tag k="website" v="http://www.vapiano.de/newsroom/?store=29"/>
    <tag k="wheelchair" v="yes"/>
  </node>
  <node id="667927886" lat="49.4909673" lon="8.4764904">
    <tag k="addr:city" v="Mannheim"/>
    <tag k="addr:country" v="DE"/>
    <tag k="addr:housenumber" v="5"/>
    <tag k="addr:postcode" v="68161"/>
    <tag k="addr:street" v="Collinistraße"/>
    <tag k="amenity" v="restaurant"/>
    <tag k="name" v="Churrascaria Brasil Tropical"/>
    <tag k="phone" v="+496211225596"/>
    <tag k="wheelchair" v="limited"/>
  </node>
  <node id="689928440" lat="49.4798794" lon="8.4853418">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="greek"/>
    <tag k="email" v="epirus70@hotmail.de"/>
    <tag k="fax" v="0621/4407 762"/>
    <tag k="name" v="Epirus"/>
    <tag k="opening_hours" v="Mo-Sa 12:00-15:00,18:00-24:00"/>
    <tag k="phone" v="0621/4407 761"/>
    <tag k="smoking" v="separated"/>
    <tag k="website" v="http://epirus-ma.blogspot.com/"/>
    <tag k="wheelchair" v="no"/>
  </node>
  <node id="689928445" lat="49.4799409" lon="8.4851357">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="italian"/>
    <tag k="email" v="gianlucascurti@ristorante-augusta.de"/>
    <tag k="name" v="Ristorante Augusta"/>
    <tag k="opening_hours" v="Mo-Fr 12:00-14:00,18:00-23:00;Su 12:00-14:00,18:00-23:00"/>
    <tag k="phone" v="0621 449872"/>
    <tag k="website" v="ristorante-augusta.com/"/>
    <tag k="wheelchair" v="no"/>
  </node>
</data>

XML;

$fields = array('id','lat','lon','name','amenity','operator','vending');
$xml = simplexml_load_string($xmlstr);

$dbdata = array();
foreach ($xml->node as $node) {
    $nodedata = array_fill_keys($fields,'');
    $nodedata['id']  = $node['id'];
    $nodedata['lat'] = isset($node['lat']) ? $node['lat'] : 0;
    $nodedata['lon'] = isset($node['lon']) ? $node['lon'] : 0;
    foreach ($node->tag as $tag) {
        $k = (string)$tag['k'];
        $v = (string)$tag['v'];
        if (isset($nodedata[$k])) {
            $nodedata[$k] = $v;
        }
    }
    $dbdata[] = vsprintf("(%d, %10.7f, %10.7f, '%s', '%s', '%s', '%s')", $nodedata);
}

$fieldlist = join(',', $fields);
$sql = "REPLACE INTO pois ($fieldlist) VALUES\n" . join(",\n", $dbdata);

echo "<pre>$sql</pre>";
$db->query($sql);


Apropos Robustheit: hier noch etwas zum DB-Anschluss u. den Feldern anstatt das hardcoded zu machen - wie hier:

$fields = array('id','lat','lon','name','amenity','operator','vending');

hiermit koennte man jeee zusätzliche Spalte der pois-Tabelle hinzufügen.

$sql = "SHOW COLUMNS FROM pois";
$fields = array();
$res = $db->query($sql);
while ($row = $res->fetch_row()) {
    $fields[] = $row[0];
}










noch eine andere lösungː cf http://forums.phpfreaks.com/topic/288907-from-osm-openstreetmap-to-mysql-with-php/


An alternative structure would be


CREATE TABLE `pois` (
  `id` bigint(20) unsigned NOT NULL,
  `lat` float(10,7) NOT NULL,
  `lon` float(10,7) NOT NULL,
  PRIMARY KEY (`id`)
) 

CREATE TABLE `pois_tag` (
  `poisid` int(11) NOT NULL DEFAULT '0',
  `tagname` varchar(45) NOT NULL DEFAULT '',
  `tagvalue` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`poisid`,`tagname`)
)


Where each tagname/value pair is stored as a row in a separate table with the pois id


Processing would be like this


<?php

$db = new mysqli(HOST,USERNAME,PASSWORD,'test'); // use your credentials

$xmlstr = <<<XML
<data>
<node id="2064639440" lat="49.4873181" lon="8.4710548">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="turkish"/>
    <tag k="email" v="info@lynso.de"/>
    <tag k="name" v="Kilim  - Café und Bar Restaurant"/>
    <tag k="opening_hours" v="Su-Th 17:00-1:00; Fr, Sa 17:00-3:00"/>
    <tag k="operator" v="Cengiz Kaya"/>
    <tag k="phone" v="06 21 - 43 755 371"/>
    <tag k="website" v="http://www.kilim-mannheim.de/"/>
  </node>
  <node id="2126473801" lat="49.4851170" lon="8.4756295">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="italian"/>
    <tag k="email" v="mannheim1@vapiano.de"/>
    <tag k="fax" v="+49 621 1259 779"/>
    <tag k="name" v="Vapiano"/>
    <tag k="opening_hours" v="Su-Th 10:00-24:00; Fr-Sa 10:00-01:00"/>
    <tag k="operator" v="Vapiano"/>
    <tag k="phone" v="+49 621 1259 777"/>
    <tag k="website" v="http://www.vapiano.de/newsroom/?store=29"/>
    <tag k="wheelchair" v="yes"/>
  </node>
  <node id="667927886" lat="49.4909673" lon="8.4764904">
    <tag k="addr:city" v="Mannheim"/>
    <tag k="addr:country" v="DE"/>
    <tag k="addr:housenumber" v="5"/>
    <tag k="addr:postcode" v="68161"/>
    <tag k="addr:street" v="Collinistraße"/>
    <tag k="amenity" v="restaurant"/>
    <tag k="name" v="Churrascaria Brasil Tropical"/>
    <tag k="phone" v="+496211225596"/>
    <tag k="wheelchair" v="limited"/>
  </node>
  <node id="689928440" lat="49.4798794" lon="8.4853418">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="greek"/>
    <tag k="email" v="epirus70@hotmail.de"/>
    <tag k="fax" v="0621/4407 762"/>
    <tag k="name" v="Epirus"/>
    <tag k="opening_hours" v="Mo-Sa 12:00-15:00,18:00-24:00"/>
    <tag k="phone" v="0621/4407 761"/>
    <tag k="smoking" v="separated"/>
    <tag k="website" v="http://epirus-ma.blogspot.com/"/>
    <tag k="wheelchair" v="no"/>
  </node>
  <node id="689928445" lat="49.4799409" lon="8.4851357">
    <tag k="amenity" v="restaurant"/>
    <tag k="cuisine" v="italian"/>
    <tag k="email" v="gianlucascurti@ristorante-augusta.de"/>
    <tag k="name" v="Ristorante Augusta"/>
    <tag k="opening_hours" v="Mo-Fr 12:00-14:00,18:00-23:00;Su 12:00-14:00,18:00-23:00"/>
    <tag k="phone" v="0621 449872"/>
    <tag k="website" v="ristorante-augusta.com/"/>
    <tag k="wheelchair" v="no"/>
  </node>
</data>
XML;

$fields = array('id','name','lat','lon');
$xml = simplexml_load_string($xmlstr);

//
// PROCESS XML RECORDS
//

$poisdata = array();
$tagdata = array();

foreach ($xml->node as $node) {
    $nodedata = array_fill_keys($fields,'');
    $nodedata['id']  = intval($node['id']);
    $nodedata['lat'] = isset($node['lat']) ? floatval($node['lat']) : 0;
    $nodedata['lon'] = isset($node['lon']) ? floatval($node['lon']) : 0;
    $poisdata[] = vsprintf("(%d, %10.7f, %10.7f)", $nodedata);
    foreach ($node->tag as $tag) {
        $k = (string)$tag['k'];
        $v = (string)$tag['v'];
        $tagdata[] = sprintf("(%d, '%s', '%s')"
                , $nodedata['id']
                , $db->real_escape_string($k)
                , $db->real_escape_string($v));
    }
}

//
// STORE THE DATA
//
$sql = "REPLACE INTO pois ('id','lat','lon') VALUES\n" . join(",\n", $poisdata);
$db->query($sql);

$sql = "REPLACE INTO pois_tag (poisid, tagname, tagvalue) VALUES\n" . join(",\n", $tagdata);
$db->query($sql);

//
// DISPLAY THE DATA
//
$currentTags = array();
$sql = "SELECT DISTINCT tagname 
        FROM pois_tag
        ORDER BY tagname = 'name' DESC, tagname";
$res = $db->query($sql);
while (list($tn) = $res->fetch_row()) {
    $currentTags[] = $tn;
}
$thead = "<tr><th>id</th><th>lat</th><th>lon</th><th>"
         . join('</th><th>', $currentTags) . "</th></tr>\n";
         
$currid = $currlat = $currlon = 0;
$sql = "SELECT p.id, lat, lon, tagname, tagvalue
        FROM pois p
            LEFT JOIN pois_tag t ON t.poisid = p.id
        ORDER BY p.id";
$res = $db->query($sql);
$tdata = '';
while (list($id, $lat, $lon, $t, $v) = $res->fetch_row()) {
    if ($currid != $id) {
        if ($currid) {
            $tdata .= "<tr><td>$currid</td><td>$currlat</td><td>$currlon</td><td>"
                . join('</td><td>', $poisrow) . "</td></tr>\n";
        }
        $currid = $id;
        $currlat = $lat;
        $currlon = $lon;
        $poisrow = array_fill_keys($currentTags,'');
    }
    $poisrow[$t] = $v;
}
$tdata .= "<tr><td>$currid</td><td>$currlat</td><td>$currlon</td><td>"
    . join('</td><td>', $poisrow) . "</td></tr>\n";
?>
<html>
<head>
<meta name="generator" content="PhpED 12.0 (Build 12010, 64bit)">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Tags</title>
<meta name="author" content="Barand">
<meta name="creation-date" content="06/04/2014">
<style type="text/css">
body, td, th {
    font-family: arial, sans-serif;
    font-size: 10pt;
}
table {
    border-collapse: collapse;
}
th {
    background-color: #369;
    color: white;
    padding: 5px 2px;
}
td {
    background-color: #EEE;
    padding: 2px;
}
</style>
</head>
<body>
<table border='1'>
    <?php echo $thead, $tdata; ?>
</table>
</body>
</html>



siehe den output in phpmyadmin cf http://forums.phpfreaks.com/topic/288907-from-osm-openstreetmap-to-mysql-with-php/



Untenstehend einige Versuche: Die Seite wird noch weiter entwickelt - ich suche Anregungen die helfen, Abfragen via Overpass-API mittels der Sprachen

- Perl - PHP

..so zu gestalten, dass sie so ein Auffrischen der Datenbank ermöglichen. Sehr interessiert bin ich auch an einem Einsatz von PostgreSQL.