cesium应用篇:静态图添加与平移、缩放

本文介绍了如何在HTML页面中使用Cesium库添加静态图,并通过键盘事件实现对静态图的移动和缩放操作,同时展示了如何添加OSM底图和实时更新primitive的过程。
摘要由CSDN通过智能技术生成

应用说明

  1. 添加静态图到指定extent
  2. 通过键盘事件对static image进行调整
    • 向东、西、南、北移动
    • 沿东西、南北方向缩放
    • 命令行侧输出当前extent,可用于几何匹配

初始化

  1. Earth 初始化
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <!-- Include the CesiumJS JavaScript and CSS files -->
  <script src="https://cesium.com/downloads/cesiumjs/releases/1.111/Build/Cesium/Cesium.js"></script>
  <link href="https://cesium.com/downloads/cesiumjs/releases/1.111/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
  <style>
    html, body{ margin:0; height:100%; }
    #cesiumContainer {
      width: 100%;
      height: 100%;
    }
  </style>
</head>
<body>
<div id="cesiumContainer"></div>
<script>
  Cesium.Ion.defaultAccessToken = 'your_key';

  const viewer = new Cesium.Viewer('cesiumContainer',
    {
      geocoder: true, //搜索框
      homeButton: false, //home按钮
      sceneModePicker: false, //3d/2d 模式切换按钮
      baseLayerPicker: false, //图层选择按钮
      baseLayer: false,
      navigationHelpButton: false, //右上角的帮助按钮
      animation: false, //左下角的动画控件的显示
      shouldAnimate: false, //控制模型动画
      timeline: false, //底部的时间轴
      fullscreenButton: false, //右下角的全屏按钮
      selectionIndicator: false, //选择指示器
      infoBox: false, //信息面板
    });

  viewer._cesiumWidget._creditContainer.style.display = "none"; //隐藏logo版权


</script>
</div>
</body>
</html>

在这里插入图片描述
2. 添加OSM底图

viewer.imageryLayers.addImageryProvider(
  new Cesium.OpenStreetMapImageryProvider()
)

在这里插入图片描述

添加静态图

  1. 配置初始参数
![// 配置参数信息
// 边界列表
const extent = \[115.5141293319635, 116.44787066803651, 38.67539196000001, 39.21660804000001\]
// 解析西、东、南、北参数
let west = extent\[0\], east = extent\[1\], south = extent\[2\], north = extent\[3\]
// 纬度移动幅度、经度移动幅度、纬度缩放比例、经度缩放比例
let latDelta = 0.001, lonDelta = 0.001, latScale = 0.01, lonScale = 0.01;](https://img-blog.csdnimg.cn/direct/5b604d9cb241470781800c153e7a9434.png)

  1. 创建静态图片材质和对应primitive
// 创建一个静态图片材质
const imageMaterial = new Cesium.Material({
  fabric: {
    type: 'Image',
    uniforms: {
      image: "../../SampleData/10236.jpg"  // 替换为您的静态图片路径
    },
    components: {
      // 透明度
      alpha: 0.5,
    },
  }
});

// 获取primitive
function getPrimitive(){
  return new Cesium.Primitive({
    geometryInstances: new Cesium.GeometryInstance({
      geometry: new Cesium.RectangleGeometry({
        rectangle: Cesium.Rectangle.fromDegrees(
          west,
          south,
          east,
          north
        ),
        vertexFormat: Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT,
      }),
    }),
    appearance: new Cesium.EllipsoidSurfaceAppearance({
      material: imageMaterial,
      aboveGround: false,
    }),
  })
}
  1. 添加primitive并flyTo
// 添加primitive
let staticImagePrimitive = viewer.scene.primitives.add(
  getPrimitive()
);

// flyTo 添加的 primitive
viewer.camera.flyTo({
  destination : Cesium.Rectangle.fromDegrees(west, south, east, north)
});

在这里插入图片描述

添加事件响应

  1. 开启键盘事件响应
const scene = viewer.scene;
const canvas = viewer.canvas;
canvas.setAttribute("tabindex", "0"); 
canvas.onclick = function () {
  canvas.focus();
};
  1. 对键盘事件进行解析
// 根据键盘事件信息 解析 并返回对应关键词信息
function getFlagForKeyCode(keyCode) {
  switch (keyCode) {
    case "W".charCodeAt(0):
      return "moveUp";
    case "S".charCodeAt(0):
      return "moveDown";
    case "Q".charCodeAt(0):
      return "xScale";
    case "E".charCodeAt(0):
      return "yScale";
    case "Z".charCodeAt(0):
      return "xDownScale";
    case "C".charCodeAt(0):
      return "yDownScale";
    case "D".charCodeAt(0):
      return "moveRight";
    case "A".charCodeAt(0):
      return "moveLeft";
    default:
      return undefined;
  }
}
  1. 添加监听事件
document.addEventListener(
  "keydown",
  function (e) {
    const flagName = getFlagForKeyCode(e.keyCode);
    // 向北移动
    if (flagName == "moveUp"){
      north = north + latDelta;
      south = south + latDelta;
    } 
    // 向南移动
    else if (flagName == "moveDown"){
        north = north - latDelta;
        south = south - latDelta;
    }
    // 向东移动
    else if (flagName == "moveRight"){
      west = west + lonDelta;
      east = east + lonDelta;
    }
    // 向西移动
    else if (flagName == "moveLeft"){
      west = west - lonDelta;
      east = east - lonDelta;
    }
    // 东西方向放大
    else if (flagName == "xScale"){
      let xDelta = (east - west) * lonScale;
      west = west - xDelta;
      east = east + xDelta;
    }
    // 南北方向放大
    else if (flagName == "yScale"){
      let yDelta = (north - south) * latScale;
      north = north + yDelta;
      south = south - yDelta;
    }
    // 东西方向缩小
    else if (flagName == "xDownScale"){
      let xDelta = (east - west) * lonScale;
      west = west + xDelta;
      east = east - xDelta;
    }
    // 南北方向缩小
    else if (flagName == "yDownScale"){
      let yDelta = (north - south) * latScale;
      south = south + yDelta;
      north = north - yDelta;
    } else {
        return
    }
    
    updatePrimitive(staticImagePrimitive)
    console.log(west,  east, south, north)
  }
);

// 更新primitive
function updatePrimitive(primitive){
  viewer.scene.primitives.remove(primitive)
  staticImagePrimitive = viewer.scene.primitives.add(
    getPrimitive()
  );
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当你在cesium实体多边形(polyline)上添加纹理图片后,缩放操作会导致它的宽度发生变化。这是由于纹理图片随着缩放比例的变化而进行了拉伸或压缩。使用纹理图片的实体在Cesium中被称为贴多边形(PolylineMaterialAppearance),它使用一个材质对象(PolylineMaterialProperty)设置纹理图片和其他一些材质属性。当你缩放这个多边形,它不仅根据比例缩放自己的大小,而且也同时缩放纹理图片的宽度,导致它的宽度也发生变化。如果你希望保持纹理图片宽度不变,你可以使用另一种实体类型,称为基础多边形(PolylineGeometry),它允许你使用geometryOptions来设置线宽和其他外观属性,而不需要纹理图片。因此,如果你希望在Cesium中创建一个不随缩放而改变的实体线条,你应该使用基础多边形而不是贴多边形。这可以确保你的纹理图片不会出现拉伸或压缩的情况,从而保持它的原始宽度。 ### 回答2: 在Cesium中,可以使用PolylineGraphics对象来添加多边形线并绘制纹理图片。当我们在PolylineGraphics对象上添加纹理图片后,Cesium会将其展示在多边形线上,并按照线的长度和宽度等比例进行缩放。 这意味着,当我们调整多边形线的宽度时,它会同时影响纹理图片的展示大小。例如,如果我们将线的宽度变宽,纹理图片也会随之变大;反之,如果线变窄,纹理图片也会变小。 如果我们希望在调整线的宽度时保持纹理图片的大小不变,我们可以使用纹理图片缩放因子进行处理。具体来说,我们需要根据线的长度来计算纹理图片缩放因子,然后使用该缩放因子来设置纹理图片的宽度和高度,从而实现纹理图片大小的不变。 总之,在Cesium添加纹理图片后,由于Cesium会根据多边形线的长度和宽度等比例进行缩放,可能会导致纹理图片宽度的变化。但是,通过一些计算和处理,我们可以实现纹理图片大小的不变,以满足不同需求。 ### 回答3: Cesium Entities的Polyline可以使用纹理图片进行添加,但在缩放时可能会出现宽度变化的情况。这是因为Polyline是由一系列点和线段组成的,当缩放时,点和线段的位置和长度会发生改变,而纹理图片的宽度是固定的,因此在缩放时会出现宽度变化的现象。 解决这个问题的方法是在创建Polyline时,设置宽度属性为与纹理图片的宽度相等,这样在缩放时,宽度和纹理图片的宽度就可以保持一致。另外,为了确保纹理图片的比例不变,还可以设置Polyline的高度属性与其宽度属性成比例变化。 在使用纹理图片添加Polyline时,还需要注意一些问题。首先,确保图片的格式是支持使用为纹理的,例如png、jpg等格式。其次,图片的大小和分辨率需要适当调整,以免影响程序的性能。最后,在渲染时,应选择合适的着色器和光照设置,以确保纹理图片的效果最佳。 综合来看,Polyline添加纹理图片缩放宽度变化的问题可以通过设置宽度属性和高度属性的方式来解决。同时,需要注意纹理图片的大小、格式和渲染设置,以获得最佳的效果和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值