OpenLayer.Layer.Vector KML Datei wird nicht angezeigt

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

Hi WOlf,

also ich habe folgendes Problem.

wenn ich auf http://www.yournavigation.org/ nach mexico in die stadt Tijuana
gehe bekomme ich Routen angezeigt, die ja auf gosmore basieren.

Allerdings bekomme ich über gosmore

http://www.yournavigation.org/api/1.0/gosmore.php?format=kml&flat=75.2201521972&flon=34.4204242479&tlat=75.2270697172&tlon=34.4295223001&v=motorcar&fast=1&layer=mapnik

keine route übergeben.

Weist du vielleicht wieso oder woran das liegt?

Danke
Andy

Nahmd,

Also: der ganze Ärger der Kartenmalens hängt daran, dass die Erde als mehr oder weniger Kugel eine räumliche Krümmung hat. Egal wo Du stehst, egal in welche Richtung du guckst, es geht (räumlich) abwärts.

Das gilt nicht beim Zylinder (siehe Papieraufkleber auf Konservenbüchse) oder beim Kegel (Schultüte, kann man aus Papier zusammenrollen). Die haben an jedem Punkt eine Richtung (plus die Gegenrichtung), in der sie nicht gekrümmt sind.

Weil die Erde also räumlich gekrümmt ist (ein Gaußsches Krümmungsmaß ungleich 0 hat), kann man sie nicht aus einem Blatt Papier herstellen. Damit gibt es auch keine Karte, die die Erdoberfläche (bis auf Verkleinerung) exakt wiedergibt.

Das ist lästig, aber die Kartografen haben sich davon nicht beirren lassen, und sich diverse listige sogenannte “Projektionen” einfallen lassen. Eine Projektion ist einfach eine Umrechung von einem (Länge, Breite)-Paar auf eine (X,Y)-Koordinate in einem rechtwinkligen Koordinatensystem (wie man es in der Schule lieben oder hassen gelernt hat).

Eine solche Abbildung kann nun verschiedene Eigenschaften haben:
→ sie kann die Fläche exakt abbilden.
→ sie kann Richtungen exakt abbilden.
→ sie kann Entfernungen exakt abbilden.
→ sie kann Formen exakt abbilden.
→ sie kann Großkreise (=Längengrade+Äquator) als geraden abbilden.
→ sie kann die Breitengrade als Linien abbilden
→ usw. usw.

Einige der Eigenschaften schließen sich aber aus. Da muss man wählen.

Die Merkatorabbildung soll nun folgende Eigenschaften haben:
→ Längengrade werden auf Graden abgebildet.
→ Breitengrade werden auf Geraden abgebildet.

Diese beiden Charakterisierungen reichen aber noch nicht zur Eindeutigkeit. Denn jeder kennt die großen Welt-Wandkarten, die oben und unten eine gleichförmige Skala von -180° bis +180° haben, und an den Seiten eine gleichmäßige Skala von -90° bis +90°. An diesen Typ Projektion hast Du wahrscheinlich gedacht. Die hat aber eine merkwürdige Eigenschaft: Nordpol und Südpol, Punkte, sind zu je einer Linie geworden, genau so lang wie der Äquator. Was ist da passiert?

Ganz einfach: der Abstand zwischen den Meridianen (Längengradlinien) nimmt zu den Polen hin ab und erreicht an den Polen den Wert 0 (genauer: er geht mit dem Cosinus der Breite: cos(0°)=1 (am Äquator), cos(90°)=0 (am Pol). Die Karte in rektilinearer Projektion aber zieht die einfach soweit auseinander, dass der Abstand konstant bleibt. Je weiter zu den Polen hin, um so mehr zieht sie auseinander.

Dieses Auseinanderziehen hat aber einen unangenehmen Effekt: Formen werden zerstört. Stell Dir ein Gebäude mit quadratischen Grundriss vor: in der Karte würde das in der Breite auseinandergezogen und würde rechteckig. Aus einem kreisförmigen Brunnen würde ein ellipsenförmiger.

Die Merkatorprojektion verhindert das mit einem genialen Trick: sie zieht nicht nur in der Breite auseinander, sondern um den gleichen Faktor auch in der Höhe. Dadurch bleiben Formen erhalten. Abbildungen mit dieser Eigenschaft nennt man auch “konforme Abbildungen”, falls Du das mal irgendwo liest. Konform heißt (vereinfacht): Ein Objekt mag verschoben, vergrößert, verkleinert oder sogar gedreht (siehe UTM-Gitter) werden: die Form aber bleibt erhalten (zumindest bei hinreichend kleinen Objekten).

Die Frage ist jetzt: wie groß wird eine Karte der ganzen Erde in Merkator-Projektion. Ich nehme die Antwort vorweg: unendlich groß. Man kann keine Merkatorkarte erstellen, die bis an die Pole reicht.

Warum das? Gucken wir uns einen Streifen der Höhe 1m z.B. auf 60° Breite an. Auf 60° Breite haben die Meridiane nur noch die Hälfte des Abstandes, den sie am Äquator hatten. Wir ziehen also den Streifen auf das doppelte auseinander und auch auf das doppelte in die Höhe. Der ist jetzt also 2m hoch.

Das machen wir mit allen Streifen immer weiter in Richtung Pol. Bei 78.46° ist der Cos noch 0.2, wir müssen unseren Streifen also um das 5-Fache in Länge und Breite dehnen.

Auf 89.94° ist der Cos noch 0.001, wir dehnen also in Länge und Breite auf das Tausendfache. Und Du ahnst es schon: je näher wir dem Pol kommen, umso extremer wird die Dehnung. Der Streifen bei 89.99994° muss auf das Millionenfache gestreckt werden, aus 1m werden also 1000km in der Höhe: die Merkatorkarte explodiert nach oben und unten.

Das kann man auch als Formel ausdrücken: wenn ich jeden infinitesimal schmalen Streifen um den Faktor 1/cos(phi) dehne, so ist die Gesamtstrecke das Integral über 1/cos. Die Funktion 1/cos wird auch als Secans bezeichnet, die Stammfunktion kann man selbst herleiten, man kann aber auch - listig listig - bei Wikipedia nachschauen.

Integral (1/cos(φ)) = log (1/cos(φ) + tan(φ)) = log ( tan (½φ + ¼π))


merkatorbreite = log (tan (½geographischebreite + ¼π))   [IM BOGENMASS!]

Wo schneiden wir jetzt die Merkatorkarte ab? Da bietet sich die Merkatorbreite -180° und +180° an, denn dann wird die entstehen Karte in Merkatorprojektion quadratisch (tile=0/0/0) :slight_smile:

180° im Bogenmaß ist gerade π.

Wir suchen also die geographische Breite zur Merkatorbreite π:

π = log ( tan (½geographischeBreite + ¼π))
exp(π) = tan (½geographischeBreite + ¼π)
arctan(exp(π)) = ½geographischeBreite + ¼π
arctan(exp(π)) - ¼π = ½geographischebreite
geographischebreite = 2*arctan(exp(π)) -½π

Flugs Taschenrechner auf Bogenmass umgeschaltet und ausgerechnet: 1.48442223

Umgewandelt in Grad (÷ π × 180°): 85.05113°

Also wenn Dich nochmal jemand fragt, woher die 85.0…° kommen, lautet die Antwort:

Und der Frager verstummt. :slight_smile:

Gruß Wolf

Nahmd,

Kleine Korrektur, denn ich muss die Zylinderprojektionen in Schutz nehmen: Merkmal der Zylinderprojektion ist ausschließlich, dass sowohl Längengrade als auch Breitengrade auf gerade Linien abgebildet werden.

Denn nur die konforme Zylinderprojektion (=Merkatorprojektion) verhält sich ungehörig, sowohl die rektilineare Projektion (die von der Welt-Wandkarte) als auch die flächentreue Zylinderprojektion (Albersprojektion, gruselig verzerrend, aber politisch korrekt) sind brav (und haben auch einfachere Mathematik).

Gruß Wolf

Nahmd,

Das ist allein Sache des Bundestrainers von yournavigation.org. Frag die Jungs (und Mädels) dort.

Gruß Wolf