OpenLayer.Layer.Vector KML Datei wird nicht angezeigt

Hallo,

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();

und hier die KML

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>

    <StyleMap id="Wo1">
        <Pair>
            <key>normal</key>
            <styleUrl>#Wo1_n</styleUrl>
        </Pair>
        <Pair>
            <key>highlight</key>
            <styleUrl>#Wo1_s</styleUrl>
        </Pair>
    </StyleMap>
    <Style id="Wo1_n">
        <IconStyle>
            <scale>1</scale>
            <Icon>
                <href>stecknadel_rot.png</href>
            </Icon>
            <hotSpot x="23" y="48" xunits="pixels" yunits="pixels"/>
        </IconStyle>
        <LabelStyle>
            <color>ff00aaff</color>
        </LabelStyle>
    </Style>
    <Style id="Wo1_s">
        <IconStyle>
            <scale>1</scale>
            <Icon>
                <href>stecknadel_blau.png</href>
            </Icon>
            <hotSpot x="23" y="48" xunits="pixels" yunits="pixels"/>
        </IconStyle>
        <LabelStyle>
            <color>ff00aaff</color>
        </LabelStyle>
    </Style>
    
    <Placemark>
                <name>Test</name>
                <description><![CDATA[Beschreibung hier]]></description>
                <LookAt>
                    <longitude>6.8913295</longitude>
                    <latitude>50.82572</latitude>
                    <altitude>0</altitude>
                    <range>0</range>
                    <tilt>0</tilt>
                    <heading>0</heading>
                </LookAt>
                <styleUrl>#Wo1</styleUrl>
                <Point>
                     <coordinates>6.8913295,50.82572</coordinates>
                </Point>
    </Placemark>
</Document>
</kml>

oder einfacher

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
            <Placemark id="Test">
                <name>Test</name>
                <Point>
                     <coordinates>6.6406395,50.94658</coordinates>
                </Point>
            </Placemark>
</Document>
</kml>

Ich habe es nicht ans laufen bekommen

Benötige dringend Hilfe

Gruß

Byte

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

Hallo,

das Beispiel funktioniert nicht.

Hat jemand ein anderes Beispiel, das funktioniert?

Danke
Andy

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.

Moins,

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.

Gruß Wolf

Moins,

Bevor ich Werbung für CSV mache (und dafür wieder verprügelt werde), fixe ich doch lieber das KML-Problem.

.oO (Gedanken sind frei: Wie wahr, wie wahr!)

Gruß Wolf

Hi Wolf,

vielleicht kannst du mir helfen.

Ich habe die gosmore kml (route Datei), nach Aufruf der folgenden URL

http://www.yournavigation.org/api/1.0/gosmore.php?format=kml&flat=52.215676&flon=5.963946&tlat=52.2573&tlon=6.1799&v=motorcar&fast=1&layer=mapnik

auf meinem Server gespeichert.

Allerdings bekomme ich die kml Datei mit der methode die hier angewandt wird nicht angezeigt.

Hast du eine Lösung parat?

Danke im voraus
Andy

Nahmd,

Es wäre schön zu erfahren, ob die bisherigen Tipps geholfen haben.

Gruß Wolf

Hi,

nein keins von denen. :frowning:

Zur Info: Ich nutze openlayer 2.11

Weil ich mal einen Wolf prügeln will:

Da ist doch kein Pop-Up dabei!!! :wink: (beim gefixeden KML-Problem)

@cleerclouds:
Du speicherst die KML wie ab? So wie sie dir in deinem Browser angezeigt wird? Das hat so noch nie geklappt… (Zeichencodierung, usw…)

PS: Was? Auch das nicht mit der CSV-Datei? Das wundert mich jetzt ein wenig… (mit der habe sogar ich Erfolge binnen kürzester Zeit erzielt)

Also,

ich verwende php

mit diesem sourcecode

$kml = file_get_contents(gosmore_url);
$xml = simplexml_load_string($kml);

$myFile = "myfile.kml";
$fh = fopen($myFile, 'w') or die("can't open file");
if($fh==false){
	print "unable to create file";
}
fwrite($fh, $kml);
fclose($fh);

damit bin ich immer gut gefahren und die Editoren haben auch den gleichen Zeichensatz und Codierung angezeigt.

Gruß
Andy

Moins,

Also bei mir setzt http://www.netzwolf.info/service/forum/kmlpoints.htm brav einen Punkt nach Bergheim.

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).

Gruß Wolf

Hi,

hmm interessant.
Wärst du so nett und nimmst die url die ich hier gepostet habe und bindest die da mal ein, weil ich jetzt für 2-3 raus muss?

Das wäre super, so würde ich zeit sparen. Hättest dann auch einen gut bei mir. :slight_smile:

Danke
Andy

Moins,

Du kennst die Same Origin Policy?

Gruß Wolf

Neben Wolfs Bedenken:

http://osm.quelltextlich.at/wizard-kml-osmtools.html

Damit bist du schneller fertig… :wink:

Nachtrag: Entnommen aus: http://wiki.openstreetmap.org/wiki/KML

Hallo Wolf,

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.

Gruß
Andy

Nahmd,

[×] Guter Plan.

Bei kleinen Schritten kommt man nicht so leicht ins Stolpern.

Übrigens funktionieren auch die Linienfeatures.

Gruß Wolf

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…) :wink:

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.

Grüße, Max (der bei Bedarf ein Bild nachreicht…)

Edit: Da gibts Bilder: http://mathworld.wolfram.com/CylindricalProjection.html