ich versuche seit Tagen Marker über eine KML Datei
auf meiner Karte anzuzeigen…
Leider funktioniert es nicht. Ich bekomme nichts angezeigt…
Ich nutze die KML-Datei, da ich verschiedene Ereignispunkte mit
verschiedenen Icons und einem Popup darstellen möchte…
var zip_layer = new OpenLayers.Layer.Vector("KML", {
format: OpenLayers.Format.KML,
extractAttributes: true
});
var kml = new OpenLayers.Format.KML().read("lines.kml");
zip_layer.addFeatures(kml);
map.addLayer(zip_layer);
// select *should be global
select = new OpenLayers.Control.SelectFeature(zip_layer);
zip_layer.events.on({
"featureselected": onFeatureSelect,
"featureunselected": onFeatureUnselect
});
map.addControl(select);
select.activate();
Ich hab grad keine Zeit mir deinen Code anzusehen, hier aber mal ein Link zu einem funktionierenden Beispiel (KML-Layer über OSM inkl. Eventhandler und Popups) - einfach in den Quelltext schauen. (Sollte auch mit Einzelpunkten statt Polygonen funktionieren).
Vielleicht hilt es ja. http://amorphe-welt.de/openstreetmap/unikml.html
Nur mal so als Frage am Rand: Muss es denn wirklich eine kml sein?
Sowas kann man auchmit einer csv umsetzen in der die Punkte definiert sind (inkl. popup und Symbol)… Dabei lässt sich - aus meiner Sicht - die csv auch wesentlich einfacher aktualisieren.
Ich finde auf die Schnelle zwei Probleme in Deinem Code:
(1)
var kml = new OpenLayers.Format.KML().read("lines.kml");
Die “OpenLayers.Format.*.read()”-Methoden erwarten keine URL, sondern entweder einen XML-Baum oder einen Text (letzter wird sogleich zu einem XML-Baum geparst).
Um das Abholen musst Du Dich selbst kümmern.
Diese Aufteilung “Abholen” und “Parsen” ist sinnvoll, weil während des synchronen Abholens die Karte ja “hängt” und Du auch asynchron abholen kannst.
Also (in kleinen Happen, die kannst Du natürlich zusammenfassen) mit vernünftigen Variablennamen:
var request = OpenLayers.Request.GET ({async: false, url: "kmlpoints.kml"});
//alert ("request=" + request);
var data = request.responseXML || request.responseText;
//alert ("data=" + data);
var features = new OpenLayers.Format.KML().read(data);
//alert ("features)" + features);
(2)
Nach dieser Änderung zeigt die Karte einen Marker, allerdings vor der Küste von Kamerun. Der Grund dafür ist meistens die Nutzung einer falschen Projektion.
Geographisch Koordinaten umfassen -180…+180,-85…+85. Das intern verwendete System aber ~-20000000…~20000000, ~-20000000…~20000000. Wenn Du geographische Koordinaten übergibst, das System aber interne Koordinaten erwartet, sind Deine Werte viel zu klein und werden in der Nähe von 0°,0° dargestellt.
Meines Wissens kann das OpenLayers.Format.KML anders als viele anderen Formate keine Koordinatentransformation: Du musst also bereits auf dem Server konvertieren.
Ich bin mir da aber nicht sicher und dankbar, wenn mich ein (OL/)KML-Experte korrigiert.
Ich schlage vor, dass Du das mal runterlädtst, die URL anpasst und dann bei Dir laufen lässt. Und bevor Du nicht den Punkt in Bergheim bei Dir auf der Karte siehst, guck ich mir das LineString-Problem noch nicht einmal an.
Außerdem wäre es schön, die URL zu erfahren, unter der Du das Zeug testest. Manchmal haben Fehler auch mit der Serverumgebung zu tun und verschwinden, wenn man das Problem nachzuvollziehen versucht (Heisenbugs).
ich habe nun dein script angepasst und bei mir laufen gelassen, das läuft auch.
Aber der sourcecode deiner datei sieht ganz anders aus als hier beschreiben.
Ich werde nun schauen, ob ich dein script dynamisch aufbauen kann.
Stell dir einen um die Erdkugel gewickelten Zylinder vor. Und dann im Mittelpunkt der Kugel eine Lampe. Und dann paust Du die Kontinente auf dem Papierzylinder ab (oder sieh dir besser ein Wikipedia-Bild zur Zylinderprojektion an, ich kanns so schlecht erklären…)
Die Mercatorprojektion sieht in etwa so aus wie da oben erklärt (blos noch ein bisschen gestaucht). Das Licht der Lampe durch den Nordpol trifft den Zylinder nie, weil das fällt oben durch die Zylinderbohrung. Das Licht durch einen Punkt gleich neben dem Pol trifft den Zylinder ziemlich weit oben, fast im Unendlichen.
Dass polnahe Regionen stark verzerrt sind und die Pole überhaupt nicht drauf sind, ist ein Merkmal der Zylinderprojektion. Irgendwo macht man dann Schluss, weil es zu hässlich wird und das kann man auch bei 85 Grad machen.
Für gerade 85.xxx Grad spricht, dass dann die Mercatorprojektion zufällig genau ein quadratisches Kartenbild für die ganze Erde ergibt und das passt dann wunderbar ins Kachelschema von Karten im Web.