OpenLayer.Layer.Vector KML Datei wird nicht angezeigt

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

Habe es raus das liegt an der konvertierung in php von der Mercator projection nach WGS 1984 falsch ist und falsche coordinaten rausgibt.

Suche nach gerade nach einer neuen convertierungmethode.

Oder kennt ihr eine gute, die bei openstreetmap ist nämlich falsch bzw. funktioniert nicht.

Gruß
Andy

Achso, deshalb hatte ich so große Probleme den Yeti-Zoo am Südpol einzuzeichnen:

nahmd,

:slight_smile: :slight_smile: :slight_smile:

Die Fehlerbox ist fast so gut wie:

Gruß Wolf

Nahmd,

Der Funktion “lon2x()” aus dem Wiki war defekt. Ich habe sie repariert und die schließende Klammer an die richtige Stelle geschoben. Die übrigen Funktionen waren korrekt.


function lon2x ($lon) {
        return deg2rad($lon) * 6378137;
}

function lat2y($lat) {
        return log(tan(M_PI/4 + deg2rad($lat)/2)) * 6378137;
}

function x2lon($x) {
        return rad2deg($x / 6378137);
}

function y2lat($y) {
        return rad2deg (2 * atan(exp($y/6378137)) - M_PI/2);
}

echo "lon2x(-180): ", lon2x(-180), "\n";
echo "lon2x(+180): ", lon2x(+180), "\n";

echo "x2lon(-20037508.34): ", x2lon(-20037508.34), "\n";
echo "x2lon(+20037508.34): ", x2lon(+20037508.34), "\n";

echo "lat2y(-85.0511288): ", lat2y(-85.0511288), "\n";
echo "lat2y(+85.0511288): ", lat2y(+85.0511288), "\n";

echo "y2lat(-20037508.34): ", y2lat(-20037508.34), "\n";
echo "y2lat(+20037508.34): ", y2lat(+20037508.34), "\n";

Gruß Wolf

Hi Wolf,

danke dir, habe das nun zum laufen bekommen.:slight_smile:

Nun möchte ich noch die Farbe und die Dicke der Linie ändern.
Finde hier im Forum nichts.
Hast du da auch was parat?

Gruss
Andy

0Moins,

Die Dokumentation zu OpenLayers ist Dein Freund.

Gruß Wolf

Hi Wolf,

ich habe nun das style eingebunden, es wird aber nicht angezeigt.

hier der Code

var lineLayer = new OpenLayers.Layer.Vector('Line Layer', {styleMap: new OpenLayers.StyleMap({strokeColor: "#3399FF", strokeOpacity: 1, strokeWidth: 6})});	
var request = OpenLayers.Request.GET ({async: false, url: "mykmlfile.kml"});
var data = request.responseXML || request.responseText;
var features = new OpenLayers.Format.KML().read(data);
lineLayer.addFeatures(features);	
map.addLayer(lineLayer);	

Weist du vielleicht wo der Hase im Pfeffer liegt?

Gruß
Andy

Nahmd,

Diesen Code hast Du aber nicht aus der OL-Doku?

StyleMap will als Argument keine Liste von Attributen haben, sondern ein Objekt mit Zuordnung von Objektzuständen zu Styles:


[…]
styleMap: new OpenLayers.StyleMap({
        'default': new OpenLayers.Style ({
                strokeColor: "#3399FF",
                strokeOpacity: 1,
                strokeWidth: 6
        })
}),
[…]

Gruß Wolf

Nahmd,

Wie wahr, wie wahr!

Gruß Wolf