如何根据视图边界在铯地图中向左或向右旋转
How to rotate left or right in Cesium Map based on view bounds
想模仿 CesiumJS 应用中的左右箭头键,类似于 Google 地球导航。按向右或向左箭头键应将地球分别向右或向左旋转 ~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));
}
}
要进行测试,请访问 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
});
这里给中心视点添加一个固定的角度,但是这个角度需要是视图范围内最大和最小经度值之差的百分比;例如角度 = (maxLon - minLon) / 20
你很幸运。 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));
}
}
html, body, #cesiumContainer {
width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;
font-family: sans-serif;
}
<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>
想模仿 CesiumJS 应用中的左右箭头键,类似于 Google 地球导航。按向右或向左箭头键应将地球分别向右或向左旋转 ~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));
}
}
要进行测试,请访问 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
});
这里给中心视点添加一个固定的角度,但是这个角度需要是视图范围内最大和最小经度值之差的百分比;例如角度 = (maxLon - minLon) / 20
你很幸运。 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));
}
}
html, body, #cesiumContainer {
width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;
font-family: sans-serif;
}
<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>