Openlayers Datenbankanbindung

Hallo!

Mal wieder ein Thema, von dem ich keine Ahnung habe, mich aber durch Onlinehilfen fast bis zum Ziel durchwuseln konnte.

Ich habe eine Karte [1]; beim Aufruf oder Verschieben wird eine Datenbankabfrage gestartet und liefert mir einen Text zurück (zur Demonstration wird dieser als Popup angezeigt), wie Openlayers es für einen Text-Layer [2] erwartet.

Nun scheitere ich aber daran, diese Daten an OL weiterzuleiten. OL erwartet ja für die Textdatei einen Dateipfad oder ein URL. Weiß jemand Rat? Ich kenne mich ansonsten mit JS, PHP und HTML nicht sonderlich aus.

Christian

[1] http://osm.duschmarke.de/index_php.html
[2] http://dev.openlayers.org/releases/OpenLayers-2.11/doc/apidocs/files/OpenLayers/Layer/Text-js.html

Sieht doch Klasse aus!
Jetzt musst du openlayers nur die URL verraten, aus welcher du den Inhalt deines Popups erstellst. Openlayers ist dabei nicht so mäklig wie Windows. Es darf also auch ruhig http://meineSeite/punkte.php heißen. Hauptsache darin wird alles brav nach den Regeln der CSV/TXT Datei geschrieben. Auf den ersten Blick sieht dein Text genauso aus.
Mich würde natürlich noch interessieren, wie du Openlayers dazu bringst diese Anfrage zu machen. Und ob man das eventuell etwas tunen kann. Zum Beispiel größerer Bereich aber dafür erst wieder anfragen, wenn man über den bereich hinauskommt, um den Datenbankserver etwas zu entlasten.

Die Adresse ist ja nicht fix, da die Bereichsgrenzen als Variablen übergeben werden. Die Abfrage ist sieht z.B. so aus:

http://osm.duschmarke.de/dbcsv.php?&ble=10.701162338257&bbo=53.985442626656&bri=10.798837661743&bto=54.014552284368

In der HTML-Datei ‘index_php.html’ ist der Abschnitt nach “//events wenn die Kartenausschnitte verschoben werden” interessant. Da werden die Bereichsgrenzen ermittelt und an die PHP-Datei übermittelt.


<html>
<head>
    <title>Christians Kosmos-Test</title>
<link rel="stylesheet" type="text/css" href="map.css">
<!--[if IE]>
<link rel="stylesheet" type="text/css" href="ie_map.css">
<![endif]-->

    <script src="http://www.openlayers.org/api/OpenLayers.js"></script>
    <script src="grid.js"></script>
    <script src="cbmaps.js"></script>
    <script src="gpx.js"></script>
        <script type="text/javascript">
        // Start position for the map
        var lat=54.00
        var lon=10.75
        var zoom=14
        
        var ble = 0
        var bbo = 0
        var bri = 0
        var bto = 0
                
        var leftBottom = new OpenLayers.LonLat(10.5,53.75)
        .transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913") )
        var rightTop = new OpenLayers.LonLat(11.05,54.20) 
        .transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913") )
        var options = {restrictedExtent: extent}
        var extent = new OpenLayers.Bounds(leftBottom.lon, leftBottom.lat, rightTop.lon, rightTop.lat);
    
        var map; 
        
        function init() {

            map = new OpenLayers.Map ("map", {
                controls:[
                    new OpenLayers.Control.Navigation(),
                    new OpenLayers.Control.PanZoomBar(),
                    new OpenLayers.Control.LayerSwitcher(),
                    new OpenLayers.Control.Permalink(),
                    new OpenLayers.Control.Attribution()],            
                numZoomLevels: 17,
                units: 'm',
                projection: new OpenLayers.Projection("EPSG:900913"),
                displayProjection: new OpenLayers.Projection("EPSG:4326")
            } );
            map.restrictedExtent = extent;
            //events wenn die Kartenausschnitte verschoben werden
             map.events.register("moveend", map, function() {
            var begrenz = map.getExtent() .transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")).toArray();
            ble = begrenz[0];
            bbo = begrenz[1];
            bri = begrenz[2];
            bto = begrenz[3];
            //alert("Links "+ble+"\nUnten "+bbo+"\nRechts "+bri+"\nOben "+bto);
                function handler(request) {
                alert(request.responseText);
                }

                var request = OpenLayers.Request.GET({
                url: "[url=http://osm.duschmarke.de/dbcsv.php?&ble=\+ble+\&bbo=\+bbo+\&bri=\+bri+\&bto=]http://osm.duschmarke.de/dbcsv.php?&ble=\"+ble+\"&bbo=\"+bbo+\"&bri=\"+bri+\"&bto=[/url]"+bto ,
                callback: handler
                });
            
            });
            
            // Basis-Karten definieren
             layerMapnik = new OpenLayers.Layer.OSM.Mapnik("eigener Mapnik-Style");
            map.addLayer(layerMapnik);
            layerKosmos = new OpenLayers.Layer.OSM.Kosmos("Maperitive");
            map.addLayer(layerKosmos);                       
            layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Original-Osmarender");
            map.addLayer(layerTilesAtHome);
            
            pois = new OpenLayers.Layer.Text( "Hundekottüten",
//                    { location:"hundekot.txt",
                    { location:    "[url=http://osm.duschmarke.de/dbcsv.php?&ble=\+ble+\&bbo=\+bbo+\&bri=\+bri+\&bto=]http://osm.duschmarke.de/dbcsv.php?&ble=\"+ble+\"&bbo=\"+bbo+\"&bri=\"+bri+\"&bto=[/url]"+bto  ,
                      projection: map.displayProjection
                    });
            map.addLayer(pois);
            pois.setVisibility(true);

            var zoomUnits= [
                    30*3600,    // zoom=0
                    30*3600,
                    15*3600,
                    10*3600,
                    5*3600,
                    5*3600,
                    2*3600,
                    1*3600,
                    30*60,
                    20*60,
                    10*60,        // zoom=10
                    5*60,
                    2*60,
                    1*60,
                    30,
                    30,
                    12,
                    6,
                    6,
                    3        // zoom=19
                ];
            var gitter = new OpenLayers.Layer.GridWGS("Koordinatenraster",    {zoomUnits: zoomUnits});
            map.addLayers([gitter]);
            gitter.setVisibility(false);
            
            var ohtrack = new OpenLayers.Layer.GPX("OH-Track","track.gpx","#ff00ff");
            map.addLayers([ohtrack]);
            ohtrack.setVisibility(false);
            
            var auswertebereich = new OpenLayers.Layer.Vector("Bereich", {
                    strategies: [new OpenLayers.Strategy.Fixed()],
                    protocol: new OpenLayers.Protocol.HTTP({
                        url: "areas.kml", 
                        format: new OpenLayers.Format.KML()
                    }),
                    projection: new OpenLayers.Projection("EPSG:4326")
                });
            map.addLayers([auswertebereich]);
            auswertebereich.setVisibility(false);

            var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());

            map.setCenter (lonLat, zoom);
        }

    </script>

</head>
    <body onload="init()">
            <div id="sidebar">
            <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.</p>

            <p> Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim.</p>

            <p> Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend </p>
            </div>
            <div id="mapcontainer">
                <div id="map">

                    <div id="location"></div>
                </div>
            </div>
    </body>
</html>

Dann gibt es die Datei ‘dbcsv.php’ welche die eigentliche Abfrage macht und die Daten mit Headerzeile formatiert. Die Datenbankverbidung wird vorher mit ‘dbconnect.php’ hergestellt.


<?php

$bbo = $_GET["bbo"] ; 
$bto = $_GET["bto"] ;
$ble = $_GET["ble"] ;
$bri = $_GET["bri"] ;

include("dbconnect.php");
$ergebnis = mysql_query("SELECT lat, lon, name FROM pois  
WHERE amenity LIKE 'post_box'
AND lat BETWEEN $bbo AND $bto
AND lon BETWEEN $ble AND $bri
LIMIT 10")
OR die("Error: $abfrage <br>".mysql_error()
);

$header = "lat\tlon\ticon\ticonSize\ticonOffset\ttitle\tdescription\n" ;

echo $header ;

while($row = mysql_fetch_object($ergebnis))
{
$daten = $row->lat."\t".$row->lon."\t"."http://www.openlayers.org/dev/img/marker.png\t"."20,20\t"."-18,-10\t".$row->name."\n" ;
echo $daten ;
    }

?>

dbconnect.php


<?php
mysql_connect("Name_MYSQL-Server","Name_Datenbank","Passwort") or die ("Keine Verbindung moeglich");;
mysql_select_db("Name_datenbank")  or die ("Die Datenbank existiert nicht.");;
?>

Christian

Also ich würde es genau damit versuchen:
http://osm.duschmarke.de/dbcsv.php?&ble=ble+%between%bbo=bbo+%between%bri=bri+%between%bto

Wenn der Ausschnitt verschoben wird werden die Variablen aktualisiert und dann sollte auch die Datei aktualisiert werden. Eventuell musst du den Layer dann nochmal neuladen. Falls das nicht möglich ist rausschmeißen und neu erstellen.

Vielen Dank für den Code.

Ich glaube halt, dass der Text Layer für dynamisches Nachladen nicht gemacht ist und man sich deshalb verbiegen muss, um das trotzdem hinzubekommen.

Passender fände ich in diesem Fall den Vector Layer mit BBox Strategy und Text Format, wie in diesem Beispiel:

http://openlayers.org/dev/examples/dynamic-text-layer.html

Den moveend Event handler könnte man sich damit komplett sparen, das übernimmt dann die BBox Strategy. Dafür muss man halt das Popup-Handling selbst machen, das kann man aber aus dem Beispiel übernehmen.

Gruß,
ikonor

Kann es sein, daß Text-Layer prinzipiell nicht so sinnvoll ist? Für mich scheint es so, als wenn alles andere auf mit einem Vector-Layer geht. Ist Text-Layer in OL nur noch aus Kompatibiltätsgründen drin? Vielleicht sollte man die Anfänger-Beispiele im Wiki auch auf Vector-Layer umstellen, um nicht in die Text-Sackgasse zu laufen.

Habe ich gamcht und jetzt läuft es auch. [1]

Die html-Datei sieht jetzt so aus:


<html>
<head>
    <title>Christians Kosmos-Test</title>
<link rel="stylesheet" type="text/css" href="map.css">
<!--[if IE]>
<link rel="stylesheet" type="text/css" href="ie_map.css">
<![endif]-->

    <script src="http://www.openlayers.org/api/OpenLayers.js"></script>
    <script src="grid.js"></script>
    <script src="cbmaps.js"></script>
    <script src="gpx.js"></script>
        <script type="text/javascript">
        // Start position for the map
        var lat=54.00
        var lon=10.75
        var zoom=14
        
        var leftBottom = new OpenLayers.LonLat(10.5,53.75)
        .transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913") )
        var rightTop = new OpenLayers.LonLat(11.05,54.20) 
        .transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913") )
        var options = {restrictedExtent: extent}
        var extent = new OpenLayers.Bounds(leftBottom.lon, leftBottom.lat, rightTop.lon, rightTop.lat);
    
        var map; 
        
        function init() {

            map = new OpenLayers.Map ("map", {
                controls:[
                    new OpenLayers.Control.Navigation(),
                    new OpenLayers.Control.PanZoomBar(),
                    new OpenLayers.Control.LayerSwitcher(),
                    new OpenLayers.Control.Permalink(),
                    new OpenLayers.Control.Attribution()],            
                numZoomLevels: 17,
                units: 'm',
                projection: new OpenLayers.Projection("EPSG:900913"),
                displayProjection: new OpenLayers.Projection("EPSG:4326")
            } 
            );

        
            // Basis-Karten definieren
             layerMapnik = new OpenLayers.Layer.OSM.Mapnik("eigener Mapnik-Style");
            map.addLayer(layerMapnik);
            layerKosmos = new OpenLayers.Layer.OSM.Kosmos("Maperitive");
            map.addLayer(layerKosmos);                       
            layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Original-Osmarender");
            map.addLayer(layerTilesAtHome);
            
            var pois = new OpenLayers.Layer.Vector("POIs", {
                    projection: new OpenLayers.Projection("EPSG:4326"),
                    strategies: [new OpenLayers.Strategy.BBOX({resFactor: 1.1})],
                     protocol: new OpenLayers.Protocol.HTTP({
                    url: "dbcsv.php",
                        format: new OpenLayers.Format.Text()
                    })
                });
            map.addLayer(pois);
            pois.setVisibility(true);


            var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());

            map.setCenter (lonLat, zoom);
            
                // Interaction; not needed for initial display.
                selectControl = new OpenLayers.Control.SelectFeature(pois);
                map.addControl(selectControl);
                selectControl.activate();
                pois.events.on({
                    'featureselected': onFeatureSelect,
                    'featureunselected': onFeatureUnselect
                });            
        }
 
        // Needed only for interaction, not for the display.
        function onPopupClose(evt) {
                // 'this' is the popup.
                var feature = this.feature;
                if (feature.pois) { // The feature is not destroyed
                    selectControl.unselect(feature);
                } else { // After "moveend" or "refresh" events on POIs layer all 
                         //     features have been destroyed by the Strategy.BBOX
                    this.destroy();
                }
            }
            function onFeatureSelect(evt) {
                feature = evt.feature;
                popup = new OpenLayers.Popup.FramedCloud("featurePopup",
                                         feature.geometry.getBounds().getCenterLonLat(),
                                         new OpenLayers.Size(100,100),
                                         "<h2>"+feature.attributes.title + "</h2>" +
                                         feature.attributes.description,
                                         null, true, onPopupClose);
                feature.popup = popup;
                popup.feature = feature;
                map.addPopup(popup, true);
            }
            function onFeatureUnselect(evt) {
                feature = evt.feature;
                if (feature.popup) {
                    popup.feature = null;
                    map.removePopup(feature.popup);
                    feature.popup.destroy();
                    feature.popup = null;
                }
            }
    </script>

</head>
    <body onload="init()">
            <div id="sidebar">
            <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.</p>

            <p> Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim.</p>

            <p> Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend </p>
            </div>
            <div id="mapcontainer">
                <div id="map">

                    <div id="location"></div>
                </div>
            </div>
    </body>
</html>

und die php-Datei wie folgt:


<?php

$bbx = $_GET["bbox"] ; 

$array = explode(",",$bbx);

$ble = $array[0] ;
$bbo = $array[1] ;
$bri = $array[2] ;
$bto = $array[3] ;

include("dbconnect.php");
$ergebnis = mysql_query("SELECT lat, lon, name, amenity, operator, vending FROM pois  
WHERE vending LIKE 'excrement_bags'
AND lat BETWEEN $bbo AND $bto
AND lon BETWEEN $ble AND $bri")
OR die("Error: $abfrage <br>".mysql_error()
);

$header = "point\ttitle\tdescription\ticon\n" ;

echo $header ;

while($row = mysql_fetch_object($ergebnis))
{
$daten = $row->lat.",".$row->lon."\t".$row->name."\t"."amenity=".$row->amenity."<br>vending=".$row->vending."<br>operator=".$row->operator."\t"."http://www.openlayers.org/dev/img/marker.png\n" ;
echo $daten ;
    }

?>



Christian

[1] http://osm.duschmarke.de/index_php.html

Hi Christian,

Das ist absolut korrekt. Das Vector-Layer erschlägt fast alles, was so in OL gemacht wird.
Da der Einstieg allerdings nicht so einfach ist - Eier legende Woll-Milch-Sau aka josm :wink: - und auch aus historischen Gründen, sind viele bei uns vorhandenen OL-Beispiele noch mit den älteren Verfahren gemacht worden.

Wenn man Vector erst mal gefressen hat, kann man damit fast alles machen. Und die richtig guten Sachen gehen eh nur mit Vector.

Gruss
Walter

Danke fürs Feedback und den Code.

Ich habe auch den Eindruck, dass der Text Layer eher ein historisches Relikt ist. Für eingeschränkte Anwendungfälle ist das aber immer noch das einfachste was man machen kann.

Ich würde aber auch gern den Vector Layer im Wiki stärker hervorheben, hab mir aber bisher nicht die Zeit dazu genommen.

Gruß,
ikonor

Could you please explain how to upload data to mysql database?

Vielleicht könnte man das auch umstellen und gleich mit Postgis und osm2pgsql arbeiten. Dann könnte man aus der gleichen Datenbank heraus auch die Hintergrundkarte rendern.

Hi !

ist denn mit Vektor auch die Verwendung von Symbolen möglich ? Ich dachte es wären immer nur geometrische Figuren möglich.

Wie ist das eigentlich mit der Geschwindigkeit - ist das schneller als der Textlayer und ließe sich das auch mit Textfiles machen ?

Gruß Jan :slight_smile:

Ja, Du kannst sogar deine alten TAB-getrennten Textdateien in sowas einlesen (so z.B.).

Du kannst halt damit cluster bilden und die Marker bbox-weise runterladen. Das bringt viel an Geschwindigkeit, wenn OL nicht immer alle Punkte vorrätig haben muss und die sichtbaren raussuchen und in kleinen Maßstäben 30 Marker übereinander malen…

Grüße, Max

Nachtrag: “Marker bbox-weise runterladen” geht natürlich nur mit einem Server, der so eine Anfrage versteht. Da ist die normale Textdatei ungeeignet, der Datenlieferant muss ein Programm sein, ggf. mit Datenbank im Hintergrund.

Das ist eine tolle Sache, die du da angehst! Der kombinierten Vektor- und Rasterkarte gehört derzeit die Zukunft.

Spontan fällt mir das Thema Metawriters bei Mapnik 2 ein. Ein Beispiel gibt es hier: http://r2d2.stefanm.com/mapnik/demo.html

hi !

danke für die Hinweise.

Aber ich glaube das mit den Erweiterungen in meiner alten Textlayervariante (Erweiterung von Netzwolf) ich eine ausreichende Geschwindigkeit habe. Ich muss einfach die Cluster-Funktion mal aktivieren und nutzen.

Was die Verwendung einer DB betrifft mag das bei ganz speziellen Karten (die nur für ein Thema sind) mit großen Datenmengen sicherlich richtig sein. Aber ich z.b. habe mir ein Skript-System aufgebaut das nach ganz speziellen Anforderungen den Inhalt der popups zusammenstellt und formatiert. Das Ergebnis wird dann immer wieder in denselben Seitencode importiert und fertig.

… manchmal ist auch der “alte Kram” nicht zu verachten.

Hoffe also er bleibt auch weiterhin erhalten.

Gruß Jan :slight_smile:

snip

I uploaded to mysql a text file with pois. The table have columns: lat lon title description icon iconSize iconOffset. What should I change in dbcsv.php to get my pois?

Ich antworte mal auf Deutsch, Du scheinst das ja zu verstehen. Die Datenbank besteht nur aus einer Tabelle (hier: ‘POIS’). Ich habe mittels Perl-Script die Daten aus einem Extrakt in eine csv-Datei konvertiert. Ich habe Spalten für lat und lon, sowie für die relevanten keys. Diese Datei haben ich dann in die MYSQL-Datenbank eingelesen.

Meine eigentliche Datenbank-Abfrage lautet ja:


$ergebnis = mysql_query("SELECT lat, lon, name, amenity, operator, vending FROM pois  
WHERE vending LIKE 'excrement_bags'
AND lat BETWEEN $bbo AND $bto
AND lon BETWEEN $ble AND $bri")
OR die("Error: $abfrage <br>".mysql_error()
);

In der ersten Zeile wähle ich alle Spalten aus, aus welchen in Daten haben möchte. Die nächsten drei sind die Bedingungen. Da ich in der DB mehrere POI-Arten drin habe, filtere ich diesem Fall nur die Hundekottütenspender mit WHERE vending LIKE ‘excrement_bags’ aus. Diese Zeile kannst Du bei Dir wohl weglassen.

Die nächsten beiden Zeilen sind die wichtigen, die den Bereich abfragen; der sollte so bleiben.

Dann kommt auch schon die Ausgabe


$header = "point\ttitle\tdescription\ticon\n" ;

echo $header ;


…schreibt einmal den Header:
pointtitledescriptionicon.

Der Aufbau ist also etwas anders, als im Text-Layer. ‘IconSize’ und ‘IconOffset’ gibt es nicht.

Mit den restlichen Zeilen werden die Datenzeilen gefüllt:


while($row = mysql_fetch_object($ergebnis))
{
$daten = $row->lat.",".$row->lon."\t".$row->name."\t"."amenity=".$row->amenity."<br>vending=".$row->vending."<br>operator=".$row->operator."\t"."http://www.openlayers.org/dev/img/marker.png\n" ;
echo $daten ;
    }

Die einzelnen Felder werden wieder durch Tab, also \t , getrennt. Wenn man aus dem Beispiel einmal den String $daten entsprechend trennt, sieht es gar nicht so schlimm aus:


$row->lat.",".$row->lon."\t".
$row->name."\t".
"amenity=".$row->amenity."<br>vending=".$row->vending."<br>operator=".$row->operator."\t".
"http://www.openlayers.org/dev/img/marker.png\n" ;

Erste Zeile ist für die Koordinaten, die zweite der Name des POIs, die dritte die Beschreibung und die vierte der Pfad zum Icon. In den Zeilen zwei und drei kann man sich austoben und das reinnehmen, was man im Popup drinstehen habe möchte.

Christian

Changed my dbcsv.php to the following, but it doesn’t work.


<?php

$bbx = $_GET["bbox"] ; 

$array = explode(",",$bbx);

$ble = $array[0] ;
$bbo = $array[1] ;
$bri = $array[2] ;
$bto = $array[3] ;

// include("dbconnect.php");
 $con = mysql_connect("localhost","poi","1");
 if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
  
$ergebnis = mysql_query("SELECT lat, lon, title, description, icon, iconSize, iconOffset FROM poi  
AND lat BETWEEN $bbo AND $bto
AND lon BETWEEN $ble AND $bri")
OR die("Error: $abfrage <br>".mysql_error()
);

$header = "lat\tlon\ttitle\tdescription\ticon\ticonSize\ticonOffset\n" ;

echo $header ;

while($row = mysql_fetch_object($ergebnis))
{
$daten = $row->lat."\t".$row->lon."\t".$row->title."\t".$row->description."\t".$row->icon."\t".$row->iconSize."\t".$row->iconOffset"\n";
echo $daten ;
    }

?>

Ich bin kein Experte, aber die SQL-Abfrage sieht nicht richtig aus. Müßte es nicht so aussehen:


$ergebnis = mysql_query("SELECT lat, lon, title, description, icon, iconSize, iconOffset FROM poi  
WHERE lat BETWEEN $bbo AND $bto
AND lon BETWEEN $ble AND $bri")
OR die("Error: $abfrage <br>".mysql_error()
);

Die erste Zeile gibt doch die auszuwählenden Felder an und dann folgen die Bedingungen in Zeile 2 und 3.

Außerdem beachte bitte, daß das Textformat beim Vector-Layer anders als beim Text-Layer ist.

Text-Layer:


lat  lon title   description iconSize    iconOffset  icon

Vector-Layer:


point    title    description    icon

Trennzeichen sind immer Tab-Stopps.

Daher muß Deine Ausgabe nicht so,

aussehen, sondern eher wie meine oben im Beispiel; sowohl für den Header als auch die Datensätze.

Zum Testen ist das Firefox-Plugin Firebug sehr hilfreich. Wählt man dort den Netzwerk-Reiter aus, kann man nicht nur die Datenbank-Anfrage sehen (z.B. http://osm.duschmarke.de/dbcsv.php?bbox=10.671812534592,53.977646552909,10.769487858078,54.006761661239)) sodern auch die entsprechende Antwort vom Server.


point    title    description    icon
53.9829979,10.7126980    Dog-Station    amenity=vending_machine<br>vending=excrement_bags<br>operator=    http://www.openlayers.org/dev/img/marker.png
53.9908447,10.7137947        amenity=vending_machine<br>vending=excrement_bags<br>operator=    http://www.openlayers.org/dev/img/marker.png

Ich hoffe, Du kommst damit weiter.

Christian

Thanks Christian. Finally, I managed to write a working dbcsv.php with the help of phpforum.ru. It works!


<?php

$bbx = $_GET["bbox"] ; 

$array = explode(",",$bbx);

$ble = $array[0] ;
$bbo = $array[1] ;
$bri = $array[2] ;
$bto = $array[3] ;

$link = mysql_connect('localhost', 'poi', '1');
if (!$link) {
    die('Не удалось соединиться : ' . mysql_error());
}
$db_selected = mysql_select_db('poi', $link);
if (!$db_selected) {
    die ('Не удалось выбрать базу poi: ' . mysql_error());
}
// mysql_query("SET NAMES 'utf8'"); 
 
$ergebnis = mysql_query("SELECT lat, lon, title, description, icon, iconSize, iconOffset FROM convenience
WHERE lat BETWEEN '$bbo' AND '$bto'
AND lon BETWEEN '$ble' AND '$bri'")
OR die("Error: $abfrage <br>".mysql_error()
);

$header = "lat\tlon\ttitle\tdescription\ticon\ticonSize\ticonOffset\n" ;

echo $header ;

while($row = mysql_fetch_object($ergebnis))
{
$daten = $row->lat."\t".$row->lon."\t".$row->title."\t".$row->description."\t".$row->icon."\t".$row->iconSize."\t".$row->iconOffset."\n";
echo $daten ;
    }

?>