User:Tagtheworld/Datenbankanbindung
some interesting threads
http://forums.phpfreaks.com/topic/290237-storing-some-values-from-a-php-array-into-mysaql-db-fails/
soon more to come
more problem-solving things:
the problem and a solution - explained here in this thread:
see extract-this-dataset-xml-to-db
question: how to extract a dataset that is derived from a request at http://www.overpass-turbo.eu
a request on the openstreetmap-files: the db or the excel-sheet has got the following categories -....
"tags": {
"addr:city": "Madrid",
"addr:housename": "Centro de Salud Cceres",
"addr:housenumber": "4",
"addrostcode": "28045",
"addr:street": "Calle de Cceres",
"amenity": "hospital",
"name": "Centro de Santa"
Barants hints: As long as you carry on trying to process it as XML you are going to have a problem. Think "JSON". we need to have a closer look at http://php.net/json_decode If you are writing to a db table
CREATE TABLE `node` (
`id` bigint(20) NOT NULL,
`amenity` varchar(30) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`housenumber` varchar(5) DEFAULT NULL,
`housename` varchar(50) DEFAULT NULL,
`street` varchar(50) DEFAULT NULL,
`city` varchar(50) DEFAULT NULL,
`postcode` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
this code will do it
$jsn = 'INSERT YOUR DATA HERE';
$jsn = str_replace('addr:','',$jsn); // legalise db column names
$data = json_decode($jsn,1); // create array from json data
$template = array ( // template array for db inserts
'id' => '',
'amenity' => '',
'name' => '',
'housenumber' => '',
'housename' => '',
'street' => '',
'city' => '',
'postcode' => ''
);
$db = new mysqli(HOST,USERNAME,PASSWORD,DATABASE);
// prepare the sql statement
$sql = "INSERT INTO node (id, amenity, name, housenumber, housename, street, city, postcode)
VALUES (?,?,?,?,?,?,?,?)";
$stmt = $db->prepare($sql);
$stmt->bind_param('isssssss',$id, $amenity, $name, $housenumber, $housename, $street, $city, $postcode);
// process the data
foreach ($data['elements'] as $elem) {
$tags = array_intersect_key($elem['tags'],$template); // get the tags we need
$nodedata = array_merge($template,$tags); // add tag data to template array
$nodedata['id'] = $elem['id']; // add id to template array
extract($nodedata);
$stmt->execute(); // insert in db table "node"
}
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 | 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.