2015-10-20 25 views
3

我需要在銫中創建一個setZoom()函數。爲此,我相信我需要評估當前的縮放比例,以便我可以決定是否必須使用zoomInzoomOut來顯示用戶提出的問題。獲取當前的放大銫

有誰知道在使用Cesium時是否可以從地圖獲取縮放級別?或者任何其他解決方案...任何提示都非常受歡迎。

函數getMagnitude()是否有訣竅?

謝謝!

解決方案:

我放在一起的所有emackey給我,得到了下面的代碼提示:

var iniPos = new Cesium.Cartesian3(); 
iniPos = this.viewer.camera.position; 
var cartographic = new Cesium.Cartographic(); 
cartographic.height = zoom * 1000; 
cartographic.longitude = iniPos.x; 
cartographic.latitude = iniPos.y; 
var newPos = new Cesium.Cartesian3(); 
Cesium.Ellipsoid.WGS84.cartographicToCartesian(cartographic, newPos); 
this.viewer.camera.setView({ 
    position: newPos 
}); 

隨着我能夠確定攝像機的高度縮放參數由用戶定義。

+0

將溶液從上述笛卡兒座標(x,Y,Z)與製圖座標(緯度,經度,ALT),其通常將不起作用混合值。我已在下面更新了我的答案,以包含「設置高度」功能。 – emackey

回答

1

Cesium的默認視圖是具有透視圖的3D地球儀。一個典型的2D縮放級別數字並不完全描述Cesium相機可以看到的不同分辨率。請花一分鐘閱讀我的完整答案Determining the Map Scale of the Viewed Globe以獲得更好的解釋。

編輯1:camera.getMagnitude函數獲取「相機位置的大小」,這意味着距離地球中心的距離。這可能不是你想要的,而是你想要的製圖位置的高度。

編輯2:我在這裏添加了一個代碼片段,其中有按鈕可以將攝像機的高度設置爲不同的高度。點擊底部的「運行代碼片段」即可看到該操作,或者僅將其中的JavaScript部分複製到Sandcastle以在此處運行。請注意,當相機正在向下看時,此功能效果最佳,因爲它可以在不改變緯度/經度的情況下將相機移動到特定高度。如果攝像機處於離軸狀態,鼠標可以沿着外觀矢量「縮放」攝像機,同時改變所有三個製圖座標(lat,lon和alt)。將攝像機移動到特定高度是一個棘手的計算,我沒有代碼,這可能不是你想要的。試試這個,看看它是否適合你。

var viewer = new Cesium.Viewer('cesiumContainer', { 
 
    navigationHelpButton: false, 
 
    animation: false, 
 
    timeline: false 
 
}); 
 

 
var cartographic = new Cesium.Cartographic(); 
 
var cartesian = new Cesium.Cartesian3(); 
 
var camera = viewer.scene.camera; 
 
var ellipsoid = viewer.scene.mapProjection.ellipsoid; 
 
var toolbar = document.getElementById('toolbar'); 
 
toolbar.innerHTML = '<div id="hud"></div>' + 
 
    '<button type="button" class="cesium-button" id="h1km">1km height</button>' + 
 
    '<button type="button" class="cesium-button" id="h10km">10km height</button>' + 
 
    '<button type="button" class="cesium-button" id="h500km">500km height</button>'; 
 

 
toolbar.setAttribute('style', 'background: rgba(42,42,42,0.9); border-radius: 5px;'); 
 

 
var hud = document.getElementById('hud'); 
 

 
viewer.clock.onTick.addEventListener(function(clock) { 
 
    ellipsoid.cartesianToCartographic(camera.positionWC, cartographic); 
 
    hud.innerHTML = 
 
     'Lon: ' + Cesium.Math.toDegrees(cartographic.longitude).toFixed(3) + ' deg<br/>' + 
 
     'Lat: ' + Cesium.Math.toDegrees(cartographic.latitude).toFixed(3) + ' deg<br/>' + 
 
     'Alt: ' + (cartographic.height * 0.001).toFixed(1) + ' km'; 
 
}); 
 

 
function setHeightKm(heightInKilometers) { 
 
    ellipsoid.cartesianToCartographic(camera.position, cartographic); 
 
    cartographic.height = heightInKilometers * 1000; // convert to meters 
 
    ellipsoid.cartographicToCartesian(cartographic, cartesian); 
 
    camera.position = cartesian; 
 
} 
 

 
document.getElementById('h1km').addEventListener('click', function() { 
 
    setHeightKm(1); 
 
}, false); 
 

 
document.getElementById('h10km').addEventListener('click', function() { 
 
    setHeightKm(10); 
 
}, false); 
 

 
document.getElementById('h500km').addEventListener('click', function() { 
 
    setHeightKm(500); 
 
}, false);
html, body, #cesiumContainer { 
 
    width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; 
 
    font-family: sans-serif; color: #edffff; 
 
} 
 
#toolbar { 
 
    padding: 2px 5px; 
 
    position: absolute; 
 
    top: 5px; 
 
    left: 5px; 
 
}
<link href="http://cesiumjs.org/Cesium/Build/Cesium/Widgets/widgets.css" 
 
     rel="stylesheet"/> 
 
<script src="http://cesiumjs.org/Cesium/Build/Cesium/Cesium.js"></script> 
 
<div id="cesiumContainer"></div> 
 
<div id="toolbar"></div>

+0

所以getMagnitude()方法給了我什麼?我看到你的解釋,並明白價值可以從一個點到另一個點改變,但是有沒有辦法將攝像機距離定義爲某個點?也許相對於地圖中心的相機高度?謝謝! –

+0

用一些示例代碼更新我的答案以獲取相機的高度,這是否適合您的情況? – emackey

+0

這幾乎是我所需要的,但除了獲得它的價值之外,我需要能夠設置它......這可能嗎? –