Marker nicht sichtbar - JSON

Hallo,

ich habe anhand dieses Beispiels eine Anbindung zur Datenbank geschaffen.
http://wiki.openstreetmap.org/wiki/User:Brogo/OpenLayers_Datenbankanbindung

Da mir das Ergebnis mit Format.Text nicht gefallen hat bin ich dazu übergegangen das Beispiel für den Gebrauch mit JSON umzubauen.
Nun werden die Marker allerdings nicht mehr angezeigt und es kommt auch keine Fehlermeldung.

Der Aufruf erfolgt über:

new OpenLayers.Layer.Vector("Blah", {
        projection: "EPSG:4326",
        strategies: [
            new OpenLayers.Strategy.BBOX({resFactor: 1.1}),
            new OpenLayers.Strategy.Cluster()
        ],
        protocol: new OpenLayers.Protocol.HTTP({
						url: "dbcsv.php",
            format: new OpenLayers.Format.JSON()
        }),
        styleMap: new OpenLayers.StyleMap({
            "default": style
        })
    });

In der dbcsv.php habe ich den Header entfernt und die Daten wie folgt in JSON umgewandelt:

$arr = array (
			'layer'=>null,
			'lonlat'=>null,
			'data'=>array(
					'id'=>$i,
					'lon'=>$row['lon'],
					'lat'=>$row['lat'],
					'title'=>$row['headline'],
					'bild'=>$row['bild'],
					'description'=>$content
			),
			'attributes'=>array(
					'id'=>$i,
					'lon'=>$row['lon'],
					'lat'=>$row['lat'],
					'title'=>$row['headline'],
					'bild'=>$row['bild'],
					'description'=>$content
			),
			'style'=>array(
					'externalGraphic'=>'marker.png',
					'graphicHeight'=>37,
					'graphicWidth'=>32,
					'graphicYOffset'=>-35,
					'graphicXOffset'=>-16
			)
	);
	echo json_encode($arr);

Dies ergibt dann einen Eintrag wie folgenden:

{"layer":null,"lonlat":null,"data":{"id":0,"lon":7.82006,"lat":48.5129,"title":"blah","bild":"test.png","description":"blub"},"attributes":{"id":0,"lon":7.82006,"lat":48.5129,"title":"blah","bild":"test.png","description":"blub"},"style":{"externalGraphic":"marker.png","graphicHeight":37,"graphicWidth":32,"graphicYOffset":-35,"graphicXOffset":-16}}

Wenn ich die Daten direkt ins JS einbaue, so dass die Marker erscheinen und dann mit Format.JSON.write einen Eintrag ausgebe bekomme ich in etwa so einen Text:

{"layer":null,"lonlat":null,"data":{"id":0,"lon":7.82006,"lat":48.5129,"title":"blah","bild":"test.png","description":"blub"},"id":"OpenLayers.Feature.Vector_3306","geometry":{"id":"OpenLayers.Geometry.Point_3305","x":870525.09705167,"y":6192611.2709086,"bounds":{"left":870525.09705167,"bottom":6192611.2709086,"right":870525.09705167,"top":6192611.2709086,"centerLonLat":{"lon":870525.09705167,"lat":6192611.2709086}}},"state":null,"attributes":{"id":0,"lon":7.82006,"lat":48.5129,"title":"blah","bild":"test.png","description":"blub"},"style":{"externalGraphic":"marker.png","graphicHeight":37,"graphicWidth":32,"graphicYOffset":-35,"graphicXOffset":-16}}

Wie man sieht fehlen bei mir die Einträge für “id” und “geometry”.
Kann das der Fehler sein? Wenn ja, wie kann ich die Einträge dem JSON mit geben? Wenn nicht, wo liegt der Fehler dann?

Schau dir mal ein paar Daten als Geo-JSON formatiert an. Z.B. indem Du hier ein bisschen rumklickst und dann…

Edit: Gelöscht. Ikonor in #3 hat das fehlende Geo vor JSON gesehn, ich habs mir dazugedacht… :wink:

Warum nimmst Du nicht OpenLayers.Format.GeoJSON anstatt OpenLayers.Format.JSON? Das wäre einiges einfacher. Noch besser wäre natürlich eine PostGIS DB, die könnte passende Formate direkt liefern.

Ich vermute, Format.JSON ist gar nicht zur direkten Verwendung gedacht, sondern eher eine abstrakte Oberklasse für JSON-basierte Formate wie GeoJSON.

Das Problem liegt daran, dass der Vector Layer als Ergebnis einer Format.read Methode ein Array von OpenLayers.Feature.Vector Objekten erwartet. Format.JSON liefert aber direkt das aus dem String deserialiserte Objekt. D.h. Du musst das Vector Objekt nachbilden, inklusive id und geometry (ist kein GeoJSON, sondern ein serialisiertes OpenLayers.Geometry Objekt), so wie es OpenLayers intern erzeugt (hast Du Dir ja schon ausgeben lassen). Das ist aber eigentlich nicht zum Datenaustausch gedacht und könnte evtl. ein paar Probleme verursachen, andererseits ist die Performance vermutlich besser.

Der Style muss eigentlich nicht mitgegeben werden, wenn eine styleMap definiert ist.

Gruß,
Norbert