如何根据视图边界在Cesium Map中向左或向右旋转

Jas*_*nM1 9 rotation geospatial cesium

想要模仿CesiumJS应用程序中的左右箭头键,类似于Google Earth导航.按向右或向左箭头键应分别向右或向左旋转地球约5%的视图边界.如果缩小则它在很大程度上旋转并且放大旋转的程度较小.

已经查看了Viewer,Camera,Scene等的文档,但是如何做一些应该简单的事情并不明显.

能够向右或向左旋转固定量但是想要根据视图范围中的宽度旋转量.如何获得铯中视图的顶部,左侧,右侧,底部的最大范围?

var viewer = new Cesium.Viewer('cesiumContainer', {
  navigationHelpButton: false, animation: false, timeline: false
});
var camera = viewer.camera;
document.addEventListener('keydown', function(e) {
    setKey(e);
}, false);

function setKey(event) {  
 if (event.keyCode == 39) {  // right arrow 
  camera.rotateRight(Cesium.Math.toRadians(10.0));
 } else if (event.keyCode == 37) {  // left arrow
  camera.rotateLeft(Cesium.Math.toRadians(10.0));
 }
}
Run Code Online (Sandbox Code Playgroud)

要进行测试,请访问SandCastle应用并粘贴上面的javascript代码段.要激活键盘绑定,请单击全屏模式,箭头键将起作用.

或者,摄像机可用于访问positionCartographic,但这只是摄像机的制图位置,而不是视图边界.

  var positionCartographic = camera.positionCartographic;
  var height = positionCartographic.height;
  var lat = positionCartographic.latitude;              
  var lon = positionCartographic.longitude + Cesium.Math.toRadians(10.0);    
  camera.flyTo({
    destination: Cesium.Cartesian3.fromRadians(lon, lat, height),
    duration: 1.0
  });
Run Code Online (Sandbox Code Playgroud)

这里将固定角度添加到中心视点,但角度需要是视图范围中最大和最小经度值之差的百分比; 例如,angle =(maxLon - minLon)/ 20

ema*_*key 5

你很幸运.Camera.computeViewRectangle要求很高的功能刚刚在Cesium 1.19中添加,大约一周前发布.这是在行动.

请注意,浏览器通常不熟悉接收按键事件的嵌入式文档,因此这不适合作为Stack Snippet.您必须单击放大镜地理编码器搜索框(以获取文本输入字段),可以接收箭头键事件,然后此演示将起作用.在Stack Overflow之外,您可能会发现接收按键更容易.

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

var camera = viewer.camera;

document.addEventListener('keydown', function(e) {
    setKey(e);
}, false);

function setKey(event) {
    var horizontalDegrees = 10.0;
    var verticalDegrees = 10.0;
    var viewRect = camera.computeViewRectangle();
    if (Cesium.defined(viewRect)) {
        horizontalDegrees *= Cesium.Math.toDegrees(viewRect.east - viewRect.west) / 360.0;
        verticalDegrees *= Cesium.Math.toDegrees(viewRect.north - viewRect.south) / 180.0;
    }
    
    if (event.keyCode === 39) {  // right arrow 
        camera.rotateRight(Cesium.Math.toRadians(horizontalDegrees));
    } else if (event.keyCode === 37) {  // left arrow
        camera.rotateLeft(Cesium.Math.toRadians(horizontalDegrees));
    } else if (event.keyCode === 38) {  // up arrow
        camera.rotateUp(Cesium.Math.toRadians(verticalDegrees));
    } else if (event.keyCode === 40) {  // down arrow
        camera.rotateDown(Cesium.Math.toRadians(verticalDegrees));
    }
}
Run Code Online (Sandbox Code Playgroud)
html, body, #cesiumContainer {
  width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;
  font-family: sans-serif;
}
Run Code Online (Sandbox Code Playgroud)
<link href="http://cesiumjs.org/releases/1.19/Build/Cesium/Widgets/widgets.css" 
      rel="stylesheet"/>
<script src="http://cesiumjs.org/releases/1.19/Build/Cesium/Cesium.js">
</script>
<div id="cesiumContainer"></div>
Run Code Online (Sandbox Code Playgroud)