You are not logged in.
- Topics: Active | Unanswered
Announcement
Please create new topics on the new site at community.openstreetmap.org. We expect the migration of data will take a few weeks, you can follow its progress here.***
#1 2011-12-06 13:34:08
- brogo
- Member
- From: 54,11 +-1°
- Registered: 2009-06-02
- Posts: 553
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/Open … xt-js.html
Offline
#2 2011-12-06 13:48:07
- viw
- Member
- Registered: 2010-05-15
- Posts: 2,623
Re: Openlayers Datenbankanbindung
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.
Last edited by viw (2011-12-06 13:48:44)
Offline
#3 2011-12-06 15:15:38
- brogo
- Member
- From: 54,11 +-1°
- Registered: 2009-06-02
- Posts: 553
Re: Openlayers Datenbankanbindung
Jetzt musst du openlayers nur die URL verraten, aus welcher du den Inhalt deines Popups erstellst.
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.014552284368Mich 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.
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
Last edited by brogo (2011-12-06 15:16:58)
Offline
#4 2011-12-06 15:34:24
- viw
- Member
- Registered: 2010-05-15
- Posts: 2,623
Re: Openlayers Datenbankanbindung
Also ich würde es genau damit versuchen:
http://osm.duschmarke.de/dbcsv.php?&ble … +bri+\&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.
Offline
#5 2011-12-06 17:00:20
- ikonor
- Member
- Registered: 2010-11-08
- Posts: 637
- Website
Re: Openlayers Datenbankanbindung
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/dyna … 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
Offline
#6 2011-12-07 09:41:42
- brogo
- Member
- From: 54,11 +-1°
- Registered: 2009-06-02
- Posts: 553
Re: Openlayers Datenbankanbindung
Ich glaube halt, dass der Text Layer für dynamisches Nachladen nicht gemacht ist und man sich deshalb verbiegen muss, um das trotzdem hinzubekommen.
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.
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.
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
Offline
#7 2011-12-07 10:03:55
- wambacher
- Member

- From: Schlangenbad/Wambach, Germany
- Registered: 2009-12-16
- Posts: 16,769
- Website
Re: Openlayers Datenbankanbindung
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.
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
- 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
Offline
#8 2011-12-07 12:12:54
- ikonor
- Member
- Registered: 2010-11-08
- Posts: 637
- Website
Re: Openlayers Datenbankanbindung
Habe ich gamcht und jetzt läuft es auch. [1]
Danke fürs Feedback und den Code.
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.
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
Offline
#9 2011-12-07 14:39:16
- dimmer
- Member
- From: Belarus
- Registered: 2010-09-06
- Posts: 92
- Website
Re: Openlayers Datenbankanbindung
Habe ich gamcht und jetzt läuft es auch. [1]
Could you please explain how to upload data to mysql database?
Offline
#10 2011-12-07 14:59:40
- viw
- Member
- Registered: 2010-05-15
- Posts: 2,623
Re: Openlayers Datenbankanbindung
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.
Offline
#11 2011-12-07 20:20:02
- Lübeck
- Member

- Registered: 2009-02-17
- Posts: 2,874
Re: Openlayers Datenbankanbindung
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 :-)
Redmi Note 9 Pro mit Android 11, Tablet Android 8.1, PC: Win10
Offline
#12 2011-12-07 21:57:42
- maxbe
- Member
- Registered: 2010-01-19
- Posts: 3,255
- Website
Re: Openlayers Datenbankanbindung
ist denn mit Vektor auch die Verwendung von Symbolen möglich ?
Ja, Du kannst sogar deine alten TAB-getrennten Textdateien in sowas einlesen (so z.B.).
ist das schneller als der Textlayer und ließe sich das auch mit Textfiles machen ?
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.
Last edited by maxbe (2011-12-07 23:13:31)
Offline
#13 2011-12-07 23:59:23
- derstefan
- Member

- From: OpenTopoMap
- Registered: 2010-03-28
- Posts: 504
- Website
Re: Openlayers Datenbankanbindung
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
Offline
#14 2011-12-08 06:33:09
- Lübeck
- Member

- Registered: 2009-02-17
- Posts: 2,874
Re: Openlayers Datenbankanbindung
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 :-)
Redmi Note 9 Pro mit Android 11, Tablet Android 8.1, PC: Win10
Offline
#15 2011-12-08 07:59:16
- wambacher
- Member

- From: Schlangenbad/Wambach, Germany
- Registered: 2009-12-16
- Posts: 16,769
- Website
Re: Openlayers Datenbankanbindung
snip
Last edited by wambacher (2011-12-08 08:12:42)
Offline
#16 2011-12-08 13:12:31
- dimmer
- Member
- From: Belarus
- Registered: 2010-09-06
- Posts: 92
- Website
Re: Openlayers Datenbankanbindung
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?
Offline
#17 2011-12-09 08:43:28
- brogo
- Member
- From: 54,11 +-1°
- Registered: 2009-06-02
- Posts: 553
Re: Openlayers Datenbankanbindung
Could you please explain how to upload data to mysql database?
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.
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?
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:
point<Tab>title<Tab>description<Tab>icon.
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
Offline
#18 2011-12-13 15:13:56
- dimmer
- Member
- From: Belarus
- Registered: 2010-09-06
- Posts: 92
- Website
Re: Openlayers Datenbankanbindung
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 ;
}
?>Offline
#19 2011-12-16 13:57:43
- brogo
- Member
- From: 54,11 +-1°
- Registered: 2009-06-02
- Posts: 553
Re: Openlayers Datenbankanbindung
Changed my dbcsv.php to the following, but it doesn't work.
$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() );
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 iconVector-Layer:
point title description iconTrennzeichen sind immer Tab-Stopps.
Daher muß Deine Ausgabe nicht so,
$header = "lat\tlon\ttitle\tdescription\ticon\ticonSize\ticonOffset\n" ;
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 … 761661239) 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.pngIch hoffe, Du kommst damit weiter.
Christian
Offline
#20 2011-12-17 11:31:43
- dimmer
- Member
- From: Belarus
- Registered: 2010-09-06
- Posts: 92
- Website
Re: Openlayers Datenbankanbindung
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 ;
}
?>Offline
#21 2012-01-05 12:48:49
- Lübeck
- Member

- Registered: 2009-02-17
- Posts: 2,874
Re: Openlayers Datenbankanbindung
hi !
weiter oben wurde geschrieben das man auch bei Vektorlayers die Textdateien verwenden kann.
Der Link http://openlayers.org/dev/examples/dyna … layer.html arbeitet noch mit Text-Layern - kennt einer ein passendes Gegenstück für Vector-Layer ?
Gruß Jan :-)
Redmi Note 9 Pro mit Android 11, Tablet Android 8.1, PC: Win10
Offline
#22 2012-01-05 13:01:39
- ikonor
- Member
- Registered: 2010-11-08
- Posts: 637
- Website
Re: Openlayers Datenbankanbindung
Der Link http://openlayers.org/dev/examples/dyna … layer.html arbeitet noch mit Text-Layern - kennt einer ein passendes Gegenstück für Vector-Layer ?
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
Offline
#23 2012-07-11 15:31:10
- elpiojo_
- Member
- Registered: 2012-07-11
- Posts: 25
Re: Openlayers Datenbankanbindung
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
Offline
#24 2012-07-11 19:44:07
- ikonor
- Member
- Registered: 2010-11-08
- Posts: 637
- Website
Re: Openlayers Datenbankanbindung
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
Offline
#25 2012-07-16 17:10:03
- elpiojo_
- Member
- Registered: 2012-07-11
- Posts: 25
Re: Openlayers Datenbankanbindung
vielen dank und auch für die antwort
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?
Offline