2016-04-11 4 views
1

Wenn ol3-cesium verwendet wird und die Karte im 3D-Modus ist, ruft map.getView(). GetZoom() undefined zurück. Dies könnte sich auch auf setZoom auswirken.Höhe in z-Ebene umrechnen (und umgekehrt)

Ich verstehe, wir sind in einer 3D-Welt, so gibt es keine Z-Ebenen wie in den gekachelten Karten. Auf der anderen Seite berechnet Google Maps ein Z-Äquivalent bei der Rückkehr von 3D zu 2D.

Wie kann ich aus der Höhe in ein Z-Äquivalent konvertieren? Irgendeine Formel, die den Breitengrad und die Höhe berücksichtigt, um das z-Äquivalent zu bekommen?

Antwort

2

Es gibt keine einfache Formel, um einen 2D „Z“ Wert von 3D zu bekommen, weil die 3D-Kamera gekippt werden kann, verschiedene Ebene der Fliesen im Vordergrund gegen den Hintergrund sehen kann, usw.

Für einzelne Fliesen jedoch , gibt es spezifische bekannte "Level" -Werte aus dem Bilder-Quadtree. Sie können diese in Cesium Inspector sehen, indem Sie auf das kleine + neben dem Wort Terrain auf der rechten Seite klicken und dann ein Häkchen auf Show tile coordinates setzen. Die gezeigten Koordinaten umfassen L, X und Y, wobei L die Ebene der Kachel ist (0 ist die am meisten herausgezoomte, höhere Zahl mehr gezoomt), und X und Y sind 2D-Positionen innerhalb der Bildschicht.

Ich postete eine answer on GIS SE, die zeigt, wie man diese Fliesen in der gleichen Weise greifen und ergreifen, wie Cesium Inspector tut, zusammen mit einer Reihe von Vorbehalten beteiligt. Sie könnten möglicherweise nach der sichtbaren Kachel der höchsten Ebene suchen und diese als Ihren "Z" -Wert verwenden.

+0

Ihr Kommentar ist sehr wichtig, um die Z-Ebene der Bilder zu ermitteln, die abgerufen werden sollen. Auf der anderen Seite kann ich das Neigen für meine Bedürfnisse völlig ignorieren, da es in der 2D-Karte kein solches gibt (jedes Neigen wird ersetzt, wenn man gerade nach unten schaut). –

0

Ich weiß, das ist nicht genau, aber teilen, falls dies für jedermann von Nutzen ist.

Ich habe mehrere Höhen in Google Maps bewegt, zwischen den 2D- und 3D-Karten wechseln, die z oder Höhe in der Adressleiste angezeigt aufzuschreiben:

z  altitude (metres) 
----- ----------------- 
3   10311040 
4   5932713 
5   2966357 
6   1483178 
7   741589 
8.6   243624 
11.35   36310 
13.85   6410 
15.26   2411 
17.01   717 
18.27   214 
19.6    119 
20.77    50 
21    44 

Mit den obigen Korrespondenzen, ich habe approximated the following function:

function altitudeToZoom(altitude) { 
    var A = 40487.57; 
    var B = 0.00007096758; 
    var C = 91610.74; 
    var D = -40467.74; 

    return D+(A-D)/(1+Math.pow(altitude/C, B)); 
} 
0

Basierend auf Ihrer Formel sollte die umgekehrte Umwandlung sein:

Höhe = C * Math.pow ((AD)/(zoomlevel-D) -1, 1/B);

+0

Danke, jemand könnte es nützlich finden. Allerdings ist meine Formel nicht zu genau, um damit zu beginnen. –

+1

Und ich danke Ihnen für die Bereitstellung der ursprünglichen Berechnungen. Ich integriere Cäsium mit Mapstraction und die Formeln scheinen gut zu funktionieren. BTW, sollte Math.round sein (D + (A-D)/(1 + Math.pow (Höhe/C, B))). Ich stehe vor einigen Herausforderungen bei der Umwandlung der Cäsium-Kameraansicht (Ausdehnung, Skalierung) in Kartenausmaßrechteck (Kartenbegrenzungen), irgendwelche Ideen dazu (2D/3D)? –

+0

Nun, es wäre Math.round(), wenn Sie nur an ganzzahligen Zoomstufen interessiert wären. Aber wenn Sie den Unterschied zwischen Zoom 7 und Zoom 7.5 interessieren, sollten Sie die Runde nicht verwenden. –