Mehr

Cäsium 3D - Bestimmung des Kartenmaßstabs des betrachteten Globus


Ich arbeite im Moment mit Cäsium 3D und möchte herausfinden, in welchem ​​äquivalenten Kartenmaßstab der Globus angezeigt wird.

Ich bin in der Lage, die Betrachtungshöhe in Metern zu erhalten, auf der sich die Kamera befindet, aber nach dieser Diskussion würde ich auch den Augenabstand von der Oberfläche benötigen, und ich verstehe das nicht.

Mein ultimatives Ziel ist es, einen Kartenmaßstab zu bestimmen, diesen in eine Openlayers 2-Zoomstufe umzuwandeln, damit ich die beiden Ansichten (ungefähr) synchronisieren kann.


Aktualisierung, März 2016: Cäsium 1.19 wurde mit einer neuen Funktion, Camera.computeViewRectangle, veröffentlicht, die die Berechnung des Ansichtsrechtecks ​​unter Berücksichtigung der folgenden Einschränkungen so gut wie möglich macht. Ich empfehle jetzt, es zu verwenden, anstatt die Bildkacheln wie hier gezeigt zu schnüffeln. Ich behalte die ursprüngliche Antwort unten, weil sie die Probleme bei der Berechnung eines einfachen Ansichtsrechtecks ​​in einer 3D-Ansicht des Globus erklärt.

Ursprüngliche Antwort: Es gibt keine einfache Zuordnung von einem 3D-Globus zu einer 2D-Zoomstufe. Auf einem runden Globus befinden sich verschiedene Kacheln in unterschiedlichen Abständen von der 3D-Kamera: Einige Kacheln sind über den Horizont drapiert oder in steilen Winkeln betrachtet. Die Kamera kann in der Nähe eines Punkts auf dem Boden niedrig sein, aber in Richtung Horizont blicken, sodass sie im Vordergrund und im Hintergrund Kacheln mit hoher Ebene sehen kann.

Sie können dies grafisch mit dem Cäsium-Inspektor in Aktion sehen.

  1. Klicken Sie auf das winzige+Schild neben+ Geländeunten im Cäsium-Inspektor.
  2. Setzen Sie als Nächstes ein Häkchen aufKachelkoordinaten anzeigen.
  3. Zoomen Sie mit der Kamera herum und beobachten Sie, wie sich die Kacheln ändern.

Für ein noch tieferes Verständnis gehen Sie wie oben beschrieben vor und fahren dann fort:

  1. Zoomen Sie mit der Kamera in die Nähe einer Stadt oder eines Flecks auf dem Boden.
  2. Verwenden Sie die Mitteltaste (oder Strg-Links-Ziehen), um die Ansicht zum Horizont zu neigen.
  3. Setzen Sie ein Häkchen aufLOD-Update aussetzen.
  4. Richten Sie die Kamera gerade aus und gehen Sie ein wenig zurück, um zu sehen, wie Kacheln im Raum schweben. Beachten Sie, dass diejenigen, die sich in der Nähe der Kamera befanden (als Level-of-Detail ausgesetzt war), klein und hoch sind, aber diejenigen, die in der Ferne sichtbar waren, sind groß und niedrig.

Nachdem Sie nun gesehen haben, dass mehrere verschiedene Kachelebenen zu einer einzigen Kameraansicht beitragen, werde ich einen höchst inoffiziellen Code teilen. Der Cäsium-Inspektor verwendet einige private API-Punkte, um die geladenen Kacheln auszuspionieren, und da es sich um Open Source handelt, können Sie auch diese Kacheln ausspionieren. Die Verwendung privater APIs wird nicht unterstützt und kann in jeder zukünftigen Version von Cäsium unterbrechen. Bereit? Öffnen Sie eine Kopie von Cesium Sandcastle und fügen Sie den folgenden Code ein:

// Dieser Code gibt die Min/Max-Werte von ALLEN Kacheln an, die für das Rendern in Betracht gezogen werden. // Die Werte ändern sich asynchron, wenn der Server Kacheln auf höherer Ebene sendet. var viewer = new Cesium.Viewer('cesiumContainer'); Var West, Süd, Ost, Nord; var Symbolleiste = document.getElementById('toolbar'); viewer.clock.onTick.addEventListener(function () { west = south = 999; east = north = -999; // ACHTUNG: Der Zugriff auf _private-Variablen wird nicht offiziell unterstützt und // die API kann jederzeit ohne Vorwarnung unterbrochen werden. var TilesToRender = viewer.scene.globe._surface.tileProvider._tilesToRenderByTextureCount; if (Cesium.defined(tilesToRender)) { var numArrays = tileToRender.length; for (var j = 0; j < numArrays; ++j) { var quadtrees = tileToRender[j]; if (Cesium.defined(quadtrees)) { var numTrees = quadtrees.length; for (var i = 0; i < numTrees; ++i) { var Rechteck = quadtrees[i].rectangle; west = Math.min(West, Rechteck.West);Süd = Math.min(Süd, Rechteck.Süd);Ost = Math.max(Ost, Rechteck.Ost);Nord = Math.max(Nord, Rechteck.Nord); } } } } if (west > 900) { Toolbar.innerHTML = 'Standort nicht bekannt.'; } else { Toolbar.innerHTML = 'West: ' + Cäsium.Math.toDegrees(west).toFixed(4) + '
' + 'Süd: ' + Cäsium.Math.toDegrees(South).toFixed(4) + '
' + 'Ost: ' + Cäsium.Math.toDegrees(east).toFixed(4) + '
' + 'Norden: ' + Cäsium.Math.toDegrees(north).toFixed(4); } });

Wenn Sie in dieser Demo die Kamera bewegen, können Sie die Probleme mit dieser Methode erkennen. Wenn die Kamera weit genug von der Erde entfernt ist, sind die gemeldeten Koordinaten der gesamte Planet, aber wenn Sie sich einem bestimmten Ort nähern, verengen sich die gemeldeten Koordinaten auf nur einige Kacheln um diesen Ort herum. Wenn Sie die Kamera jedoch zum Horizont neigen, enthalten die gemeldeten Koordinaten Kacheln, die sich über diesen Horizont hinaus erstrecken, und die Kamera endet in der Nähe einer der Seiten oder Ecken dieser Koordinaten, nicht der Mitte. Dennoch kann es Anwendungen geben, bei denen es praktisch ist, eine ungefähre Vorstellung davon zu haben, welche Kacheln in der 3D-Szene überhaupt sichtbar sind.


Schau das Video: Cesium 3D Temperature 2m Compare Animation Meteomatics (Oktober 2021).