Openlayers Datenbankanbindung

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 ;
    }

?>

hi !

weiter oben wurde geschrieben das man auch bei Vektorlayers die Textdateien verwenden kann.

Der Link http://openlayers.org/dev/examples/dynamic-text-layer.html arbeitet noch mit Text-Layern - kennt einer ein passendes Gegenstück für Vector-Layer ?

Gruß Jan :slight_smile:

Das Beispiel verwendet doch den Vector Layer (mit Text Format):


                var layer = new OpenLayers.Layer.Vector("POIs", {
                    strategies: [new OpenLayers.Strategy.BBOX({resFactor: 1.1})],
                    protocol: new OpenLayers.Protocol.HTTP({
                        url: "textfile.txt",
                        format: new OpenLayers.Format.Text()
                    })
                });

Da ist die Überschrift nur etwas irreführend.

Gruß,
ikonor

hallo,

probier auch gerade nach dieser möglichkeit pop ups anzuzeigen, jedoch kommt bei mir immer die fehlermeldung zugriff verweigert, weiß zufällig wer woran das liegen kann? mein wms wird zwar angezeigt aber marker sind nicht vorhanden

Hallo elpiojo_,

willkommen im Forum!

Evtl. ein Same-Origin-Policy Problem? Tritt auf, wenn Datei nicht vom selben Server oder vom lokalen Dateisystem nachgeladen wird (je nach Browser).

Gruß,
Norbert

vielen dank und auch für die antwort :wink: welche datei meinst du in diesem sinne? also bei mir liegt die datei auf einem uniserver und ich greif auch auf diesen immer zu! die abfrage mittels php script funktioniert auch einwandfrei, also könnte es ja eigentlich nur an openlayers liegen oder?

hi,

bitte immer, wenn es technisch machbar ist, ein Bild mit dem Fehler oder zumindest den Text der Fehlermeldung posten.
da gibt es soooooooo viele Möglichkeiten - und zum Rumraten hab ich echt keine Lust Zeit.

Gruss
walter

Stimmt, in diesem Fall ist das wohl eher ein php Aufruf, der die Marker liefert und keine txt Datei.

Dennoch muss das php-Script und die .html Datei der Anwendung auf dem selben Server liegen. Wenn die .html Datei mit OpenLayers zum Beispiel zum Entwickeln aus dem lokalen Dateisystem geöffnet wird und das php-Script auf dem Server aufruft, geht das erst mal nicht.

sorry, also ich bekomm leider nur folgende fehlermeldung:
zeile:508
zeichen:172
fehler: zugriff verweigert
code 0
url:http://www.openlayers.org/dev/OpenLayers.js

wenn ich dann auf ok klicke, wird die map zwar ausgeführt aber die marker sind nicht ersichtlich, außer einer der liegt aber im meer!

also das ist mir klar, ich öffne die datei auch immer über den server

meine php datei sieht wie folgt aus, ich glaube langsam das es eventuell doch an ihr liegt, mir kommt vor, das die abgefragten daten nicht in das vorgeschiebne format “point\ttitle\tdescription\ticon\n” passen oder irre ich mich?


$bbx = $_GET["bbox"] ; 

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

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


$betriebe = "SELECT name, homepage, telefon, breite, laenge FROM betriebe";


$result = pg_query($conn, $betriebe);
$header = "point\ttitle\tdescription\ticon\n" ;

echo $header ;

while($row = pg_fetch_object($result))
{
$daten = $row->breite.",".$row->laenge."\t".$row->name."\t"."homepage=".$row->homepage."<br>telefon=".$row->telefon."\t"."http://www.openlayers.org/dev/img/marker.png\n";
echo $daten ;
    }
pg_close($conn);
?>


Das ist noch nicht ausdiskutiert :wink:

a) wo steht der server?
b) wo wird der web-browser aufgerufen? (rechner?)
c) mit welchem url? z.B. http://mein-server.at.provider/karten/index.html
d) wo genau steht index.html? (rechner?)
e) wo genau liegt der php-script? (rechner?)

ein einfaches “ich öffne die datei auch immer über den server” reicht hier leider nicht - also Butter bei die Fische.

Die Fehlermeldung hat absolut nichts mit Dateninhalten oder Fehlern in Scripten zu tun - soweit sind wir noch garnicht.
Diese FM ist ganz charakteristisch für eine bestimmte Situation, in der sich OL einfach “weigert”, etwas zu machen ; das ist von OL aus Sicherheitsgründen so gewollt.
Und es hat nur was mit der Lage der Files zu tun.

deshalb hat sich ja ikonor bereits dazu geäußert.

gruss
walter

p.s. sag mal ein wenig zu deinem Umfeld: OS des Servers, OS des Clients, eingesetzter Browser und sowas.

alles klar :wink:

a) ich verwende den universitätsserver
b) den webbrowser wird zu hause mittels vpn augerufen damit ich überhaupt auf den server komme
c) mit folgender url ruf ich meine karte auf http://129.27.89.66/student/master_geom/hp/map.html
d) die index html ist gleich die map.html
e) das php file liegt ebenfalls imt ordner http://129.27.89.66/student/master_geom/hp/

als browser verwende ich firefox, was meist du mit os? zum server kann ich eigentlich nicht viel sagen, da ich hier keinen zugang zu den einstellungen habe.