首页 > 其他分享 >cesium教程7-官方示例模型要素选择翻译

cesium教程7-官方示例模型要素选择翻译

时间:2022-09-21 13:44:21浏览次数:96  
标签:nameOverlay 教程 示例 viewer style var Cesium pickedFeature cesium

 

源代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>天地图</title>
  <!-- 引用cesium的js和css,天地图的扩展js -->
  <!-- <script src="https://cesium.com/downloads/cesiumjs/releases/1.92/Build/Cesium/Cesium.js"></script>
  <script src="http://api.tianditu.gov.cn/cdn/plugins/cesium/cesiumTdt.js" ></script>
  <link rel="stylesheet" href="https://cesium.com/downloads/cesiumjs/releases/1.92/Build/Cesium/Widgets/widgets.css"/> -->
  <script src="js/cesium1.97/Cesium.js"></script>
  <script src="js/cesiumTdt.js" ></script>
  <link rel="stylesheet" href="js/cesium1.97//Widgets/widgets.css"/>
  <style type="text/css">
    html, body, #tiandituContainer {
      width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;
    }
  </style>
 
</head>
<body onl oad="loadData()">
<div id="tiandituContainer">
</div>
<script>
  // 服务负载子域
  var subdomains=['0','1','2','3','4','5','6','7'];
  
  var viewer;
   function loadData()
   {
       //默认会调用微软virtualearth地图
        viewer = new Cesium.Viewer('tiandituContainer',{
          animation:false,       //是否显示动画控件
          homeButton:true,       //是否显示home键
          geocoder:true,         //是否显示地名查找控件,如果设置为true,则无法查询
          baseLayerPicker:true, //是否显示图层选择控件
          timeline:false,        //是否显示时间线控件
          fullscreenButton:true, //是否全屏显示
          infoBox:true,         //是否显示点击要素之后显示的信息
          sceneModePicker:true,  //是否显示投影方式控件  三维/二维
          navigationInstructionsInitiallyVisible:false, //导航指令
          navigationHelpButton:false,     //是否显示帮助信息控件
          selectionIndicator:false, //是否显示指示器组件
        });
        // 隐藏cesium ion
        viewer._cesiumWidget._creditContainer.style.display = "none";  
     
            add3DTiles("http://211.143.122.110:18062/fish/01911456/tileset.json",120.131172,30.471307,0);
             
       
          // 将三维球定位到中国
          viewer.camera.flyTo({
              destination: Cesium.Cartesian3.fromDegrees(120.131372,30.471317, 100),
              orientation: {
                  heading :  Cesium.Math.toRadians(250.4202942851978),
                  pitch : Cesium.Math.toRadians(-78.74026687972041),
                  roll : Cesium.Math.toRadians(0)
              },
              complete:function callback() {
                  // 定位完成之后的回调函数
              }
          });
          
          mapPickEvent();
   }
 
 
    
           function add3DTiles(url,longitude, latitude, height) {
                var tileset = viewer.scene.primitives.add(
                    new Cesium.Cesium3DTileset({
                        url:url,
                        maximumScreenSpaceError: 2,//默认16,最大屏幕空间错误
                        //maximumNumberOfLoadedTiles: 1000,
                        maximumMemoryUsage:512//默认512,内存MB的最大数量
                    }));
                tileset.readyPromise.then((tileset) => {
                    tileSetAll(tileset,longitude, latitude, height,0,0,108,1);
                    viewer.zoomTo(tileset);
                });
            }
            function tileSetAll(tileset,longitude,latitude,height,rotateX,rotateY,rotateZ,scale)
            {
                  //旋转角度设置
                  var mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(rotateX));
                  var my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(rotateY));
                  var mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(rotateZ));
                  var rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
                  var rotationY = Cesium.Matrix4.fromRotationTranslation(my);
                  var rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
                  //平移 修改经纬度
                  var position = Cesium.Cartesian3.fromDegrees(longitude,latitude,height);
                  var transform = Cesium.Transforms.eastNorthUpToFixedFrame(position);
                  //旋转、平移矩阵相乘
                  Cesium.Matrix4.multiply(transform, rotationX, transform);
                  Cesium.Matrix4.multiply(transform, rotationY, transform);
                  Cesium.Matrix4.multiply(transform, rotationZ, transform);
                  //缩放 修改缩放比例
                  var scale1 = Cesium.Matrix4.fromUniformScale(scale);
                  Cesium.Matrix4.multiply(transform, scale1, transform);
                  //赋值给tileset
                  tileset._root.transform = transform;

            }
            function mapPickEvent()
            {
                // 用html的div实现,在鼠标悬停时显示要素名称
                const nameOverlay = document.createElement("div");
                viewer.container.appendChild(nameOverlay);
                nameOverlay.style.display = "none";
                nameOverlay.style.position = "absolute";
                nameOverlay.style.bottom = "0";
                nameOverlay.style.left = "0";
                nameOverlay.style["pointer-events"] = "none";
                nameOverlay.style.padding = "4px";
                nameOverlay.style.backgroundColor = "black";
                nameOverlay.style.color = "white";
                
                // 关于当前选择要素的信息
                const selected = {
                  feature: undefined,
                  originalColor: new Cesium.Color(),
                };
                
                //实体对象,将用来保当前选择要素的信息
                const selectedEntity = new Cesium.Entity();
                
                // 左键点击的处理程序,???
                const clickHandler = viewer.screenSpaceEventHandler.getInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
                
                // Silhouette,如果支持轮廓,悬浮显示蓝色,点击显示绿色
                if (Cesium.PostProcessStageLibrary.isSilhouetteSupported(viewer.scene)) {
                  const silhouetteBlue = Cesium.PostProcessStageLibrary.createEdgeDetectionStage();
                  silhouetteBlue.uniforms.color = Cesium.Color.BLUE;
                  silhouetteBlue.uniforms.length = 0.01;
                  silhouetteBlue.selected = [];
                
                  const silhouetteGreen = Cesium.PostProcessStageLibrary.createEdgeDetectionStage();
                  silhouetteGreen.uniforms.color = Cesium.Color.LIME;
                  silhouetteGreen.uniforms.length = 0.01;
                  silhouetteGreen.selected = [];
                
                // 将2个轮廓绘制添加到viewer
                  viewer.scene.postProcessStages.add(
                    Cesium.PostProcessStageLibrary.createSilhouetteStage([
                      silhouetteBlue,
                      silhouetteGreen,
                    ])
                  );
                
                  // 悬浮要素事件,轮廓显示蓝色Blue
                  viewer.screenSpaceEventHandler.setInputAction(function onm ouseMove(movement) {
                    silhouetteBlue.selected = [];
                
                    // pick一个新要素
                    const pickedFeature = viewer.scene.pick(movement.endPosition);
                    //如果选择的要素没有定义,则返回空
                    if (!Cesium.defined(pickedFeature)) {
                      nameOverlay.style.display = "none";
                      return;
                    }
                
                    // pick要素之后,显示内容
                    nameOverlay.style.display = "block";
                    nameOverlay.style.bottom = `${viewer.canvas.clientHeight - movement.endPosition.y}px`;
                    nameOverlay.style.left = `${movement.endPosition.x}px`;
                    const name = pickedFeature.getProperty("name");
                    nameOverlay.textContent = name;
                
                    // 高亮要素,如果没有被选择
                    if (pickedFeature !== selected.feature) {
                      silhouetteBlue.selected = [pickedFeature];
                    }
                  },Cesium.ScreenSpaceEventType.MOUSE_MOVE);
                
                  // 鼠标点击事件,轮廓显示绿色Green,弹框显示详细信息
                  viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
                    silhouetteGreen.selected = [];
                
                    // pick要素
                    const pickedFeature = viewer.scene.pick(movement.position);
                    //如果选择的要素没有定义,就返回空
                    if (!Cesium.defined(pickedFeature)) {
                      //clickHandler(movement);
                      return;
                    }
                
                    // 如果选择要素不是选中内容,就返回
                    if (silhouetteGreen.selected[0] === pickedFeature) {
                      return;
                    }
                
                    // 保存选定要素的原始颜色
                    const highlightedFeature = silhouetteBlue.selected[0];
                    if (pickedFeature === highlightedFeature) {
                      silhouetteBlue.selected = [];
                    }
                
                    // 高亮最新的选择要素
                    silhouetteGreen.selected = [pickedFeature];
                
                    // 设置要素弹框描述信息
                    const featureName = pickedFeature.getProperty("id");
                    selectedEntity.name = featureName;
                    selectedEntity.description =
                      `${'<table class="cesium-infoBox-defaultTable"><tbody>'+
                      "<tr><th>ID</th><td>"}${pickedFeature.getProperty("id")}</td></tr>` +
                      `<tr><th>NAME</th><td>${pickedFeature.getProperty("name")}</td></tr>` +
                      `</tbody></table>`;
                    viewer.selectedEntity = selectedEntity;//选择实体添加到视图
                  },Cesium.ScreenSpaceEventType.LEFT_CLICK);
                } else {
                  // 如果轮廓不支持,则什么也不做
                
                  }
            }
</script>
</body>
</html>

最后附上官方示例:

3D Tiles feature picking 

 

标签:nameOverlay,教程,示例,viewer,style,var,Cesium,pickedFeature,cesium
From: https://www.cnblogs.com/tiandi/p/16715318.html

相关文章

  • 【教程】喜马拉雅如何下载mp3? (教你喜马拉雅下载mp3格式文件音频)
    喜马拉雅用声音连接了全中国数亿人,为内容创作者和用户搭建了共同成长的平台。一方面,创作者用声音分享自己的故事、观点、知识,并因此收获粉丝、成就感或IP增值、商业变现的......
  • Git使用教程
    目录1.主要的两类版本控制模式1.1集中式控制(代表:SVN)1.11简介1.12优点1.13缺点1.2分布式控制(代表:GIT)1.21简介1.22优点1.23缺点2.GIT的环境安装2.1通过Homebrew安......
  • PS小白教程:如何在Photoshop中制作神奇的图案文字效果?
    Photoshop是一款我们常用的图片处理软件,在Mac版的Photoshop中如何制作神奇的图案文字效果?下面我们分享在Mac版Photoshop中制作神奇图案文字效果的操作步骤。1、打开Mac电......
  • C#教程 - 程序集(Assembly)
    更新记录转载请注明出处:2022年9月21日发布。2022年9月10日从笔记迁移到博客。程序集(Assembly)说明运行在CLR上的版本化的、自描述的二进制文件Anassemblymaybe......
  • C#教程 - 命名空间(Namespace)
    更新记录转载请注明出处:2022年9月21日发布。2022年9月10日从笔记迁移到博客。命名空间(Namespace)说明一串字符串,解决代码标识符命名重复问题作用:减少命名冲突、增......
  • PyQt完整入门教程
    PyQt完整入门教程https://blog.csdn.net/baidu_37503452?spm=1000.2115.3001.53431、GUI开发框架简介19年来,一直在做AndroidROM相关测试,也有了一定的积累;20年......
  • Typora使用教程
    为便于copy,文字版本将放在后半部分   一级标题(#+空格+标题)二级标题(##+空格+标题)  左右两个*:加粗左右一个*:斜体鼠标右击选择''引用列表:数字+点+空格+......
  • Python 使用requests下载图片的方法及示例代码
    Python中可以使用requests模块执行GET和POST请求,requests继承了urllib2的所有特性。requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响......
  • 路由聚合示例
    原理不作介绍,前置掌握,仅示例常规题:212.56.132.0/24212.56.133.0/24212.56.134.0/24212.56.135.0/24流程:212.56.1000......
  • 保姆级教程:一看就懂的《企业应用现代化行动指南》(附下载)
     在数字化浪潮下,应用现代化已经成为企业数字化创新的基石。 云原生应用正在爆发性增长。国际权威知名分析机构Gartner预测到2025年,云原生平台将成为95%以上新数字倡......