首页 > 其他分享 >Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)

时间:2023-12-11 18:04:27浏览次数:40  
标签:点选 shp selected feature 切片 pickedFeature Cesium true 加载


一、shp模型拔高切片

shp如果数据量过大,做分类处理,加载会异常慢,所以需要先对其进行分割之后再进行切片(用qgis即可)

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_加载

切片规则设置

1、记得勾选构造底面 

2、如果你的shp数据中有高度字段的话,可以选择高度字段,如果没有的话,设置固定高度的高度比你的模型稍微高一点,可以保证包着整个模型,也可以对shp数据稍微做一些缓冲区设置,使其可以前后左右包围整个模型

3、如果你的shp数据原始中文编码是GBK的话,最好提前通过QGIS或者ArcGis转成UTF-8

 

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_开发语言_02

选择输出目录,点击确认即可 

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_前端_03

二、osgb切片

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_javascript_04

设置,选择xml,里面存储着位置信息和投影信息等 

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_前端_05

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_加载_06

 

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_数据_07

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_前端_08

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_开发语言_09

三、Cesium 代码加载实现

加载3dtiles模型

let defaultTilesetConfig = {
        skipLevelOfDetail: true,
        preferLeaves: true,
        maximumMemoryUsage: 256, // 内存分配变小有利于倾斜摄影数据回收,提升性能体验
        // debugShowContentBoundingVolume: true,
        baseScreenSpaceError: 256,
        maximumScreenSpaceError: 16, // 数值加大,能让最终成像变模糊
        skipScreenSpaceErrorFactor: 16,
        skipLevels: 2,//lod级别加载
        immediatelyLoadDesiredLevelOfDetail: true,
        loadSiblings: true, // 如果为true则不会在已加载完概况房屋后,自动从中心开始超清化房屋
        cullWithChildrenBounds: true,
        cullRequestsWhileMoving: true,
        cullRequestsWhileMovingMultiplier: 1, // 值越小能够更快的剔除
        preloadWhenHidden: true,
        progressiveResolutionHeightFraction: 1, // 数值偏于0能够让初始加载变得模糊
        dynamicScreenSpaceErrorDensity: 1, // 数值加大,能让周边加载变快
        dynamicScreenSpaceErrorFactor: 1, // 不知道起了什么作用没,反正放着吧先
        dynamicScreenSpaceError: true // 根据测试,有了这个后,会在真正的全屏加载完之后才清晰化房屋
      }
      //1osgb
      let osgb1 = new Cesium.Cesium3DTileset({
        url: `/upload/3dtiles/cfgzz_3dtiles/tileset.json`,
        ...defaultTilesetConfig
      });

      // 超出可视区的瓦片进行销毁,提高性能
      osgb1.tileLoad.addEventListener(function (tile) {
        tile.tileset.trimLoadedTiles();
      });
      // 贴地处理
      this.handle3dtilesHeight(osgb1, 10.0)
      viewer.scene.primitives.add(osgb1);
      //定位到当前模型位置
      viewer.zoomTo(osgb1)

用shp切片的3dtiles做分类处理

classificationVector = new Cesium.Cesium3DTileset({
        url: config3dtilesJson.vector,
        classificationType: Cesium.ClassificationType.CESIUM_3D_TILE
      });
      classificationVector.style = new Cesium.Cesium3DTileStyle({
        color: "rgba(255, 255, 255, 0.01)",
        // color: "rgba(0, 255, 0, 0.8)",
      });
      viewer.scene.primitives.add(classificationVector);

 添加鼠标移入选中模型效果

const highlighted = {
        feature: undefined,
        originalColor: new Cesium.Color(),
      };
      viewer.screenSpaceEventHandler.setInputAction(function onm ouseMove(
        movement
      ) {
        // If a feature was previously highlighted, undo the highlight
        if (Cesium.defined(highlighted.feature)) {
          highlighted.feature.color = highlighted.originalColor;
          highlighted.feature = undefined;
        }
        // Pick a new feature
        const pickedFeature = viewer.scene.pick(movement.endPosition);
        if (!(pickedFeature instanceof Cesium.Cesium3DTileFeature)) return;
        if (!Cesium.defined(pickedFeature)) return;
        // Highlight the feature if it's not already selected.
        if (pickedFeature !== selected.feature) {
          highlighted.feature = pickedFeature;
          Cesium.Color.clone(
            pickedFeature.color,
            highlighted.originalColor
          );
          pickedFeature.color = new Cesium.Color(1, 1, 0, 0.2);
        }
      },
        Cesium.ScreenSpaceEventType.MOUSE_MOVE);

 添加鼠标点击展示弹窗效果

let _this = this


      // Information about the currently selected feature
      const selected = {
        feature: undefined,
        originalColor: new Cesium.Color(),
      };

      // Get default left click handler for when a feature is not picked on left click
      const clickHandler = viewer.screenSpaceEventHandler.getInputAction(
        Cesium.ScreenSpaceEventType.LEFT_CLICK
      );

      // Color a feature on selection and show metadata in the InfoBox.
      viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(
        movement
      ) {
        // 隐藏模态框 
        _this.showMLXCModal = false
        // If a feature was previously selected, undo the highlight
        if (Cesium.defined(selected.feature)) {
          selected.feature.color = selected.originalColor;
          selected.feature = undefined;
        }
        // Pick a new feature
        const pickedFeature = viewer.scene.pick(movement.position);
        if (!(pickedFeature instanceof Cesium.Cesium3DTileFeature)) {
          return;
        }
        if (!Cesium.defined(pickedFeature)) {
          clickHandler(movement);
          return;
        }
        // Select the feature if it's not already selected
        if (selected.feature === pickedFeature) {
          return;
        }
        selected.feature = pickedFeature;

        if (!(pickedFeature instanceof Cesium.Cesium3DTileFeature))  return;


        var position = viewer.scene.pickPosition(movement.position);
        let cartographic = Cesium.Cartographic.fromCartesian(position);
        // 有值则展示模态框,模态框的位置信息
        _this.showMLXCModal = true
        _this.positionXY.lng = Cesium.Math.toDegrees(
          cartographic.longitude
        );
        _this.positionXY.lat = Cesium.Math.toDegrees(cartographic.latitude);
        // height=viewer.camera.positionCartographic.height.toFixed(0);
        _this.positionXY.height = cartographic.height;

        // 获取属性信息
        _this.propertiesObj = pickedFeature.getPropertyNames()
        

        // Save the selected feature's original color
        if (pickedFeature === highlighted.feature) {
          Cesium.Color.clone(
            highlighted.originalColor,
            selected.originalColor
          );
          highlighted.feature = undefined;
        } else {
          Cesium.Color.clone(pickedFeature.color, selected.originalColor);
        }
        // Highlight newly selected feature
        pickedFeature.color = new Cesium.Color(0, 1, 0, 0.2);
        // Set feature infobox description

      },
        Cesium.ScreenSpaceEventType.LEFT_CLICK);

四、实现过程中遇到的问题记录

1、分类未正常显示,原因:shp数据量过大,导致分类要做很多算法,加载不出来

2、中文乱码问题,因为shp原始数据是gbk格式,即便切片时候选择了gbk编码但是依然未生效

3、鼠标移入,选中区域跑出来,如下图:原因是shp切片的时候没有构造底面

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_javascript_10

五、注意事项

电脑需要有显卡,配置越高越好

Cesium 加载倾斜摄影模型记录(osgb切片,shp拔高切片、模型加载、鼠标移入选中、点选查询功能)_数据_11

六、优化考虑

如果模型区域比较大的话,如果一些shp数据变化,就要对所有的shp数据重新切片,比较麻烦,所以有两种方式可以避免这种情况发生

1、请求接口的方式获取数据,通过primite做分类处理,这样不论数据怎么变化都不需要重新处理

2、shp上只存储唯一键值,其他信息通过唯一键值去获取数据

标签:点选,shp,selected,feature,切片,pickedFeature,Cesium,true,加载
From: https://blog.51cto.com/u_15983333/8776429

相关文章

  • 列表 切片 动态数组
    切片(slice)是一种动态数组的抽象。切片提供了对数组的一段连续片段的引用,并且可以动态增长或缩小。与数组不同,切片的长度是可变的,可以根据需要进行调整,而且切片是引用类型 创建空切片varnumbers[]int创建切片2slice1:=[]int{1,2,3,4,5}packagemai......
  • go热加载
    Skiptocontent cosmtrek/air   CodeIssues84Pullrequests27DiscussionsActionsProjectsSecurityInsights         masterBreadcrumbsair/README-zh_cn.mdt Lates......
  • Home-图片懒加载指令实现
    场景和指令用法场景:某些网站首页通常会很长,用户不一定能访问到页面靠下面的图片,这类图片通过懒加载优化手段可以做到,只有进入视口区域才发送图片请求指令用法:<imgv-img-lazy="item.picture"/>在图片img身上绑定指令,该图片只有正式进入到视口区域时才会发送图片网络请求实现......
  • MFC CStatic 里面加载图片
    ▲效果头文件新增空间指针:private:CStatic*pBMP;BOOLCMFCApplicationBMPDlg::OnInitDialog()里面初始化://TODO:在此添加额外的初始化代码//初始化字段pBMP=(CStatic*)GetDlgItem(IDC_STATIC_BMP);//除了添加控件,还有这种方式获得控件的方式。pBMP->Mod......
  • 【scikit-learn基础】--『数据加载』之外部数据集
    这是scikit-learn数据加载系列的最后一篇,本篇介绍如何加载外部的数据集。外部数据集不像之前介绍的几种类型的数据集那样,针对每种数据提供对应的接口,每个接口加载的数据都是固定的。而外部数据集加载之后,数据的字段和类型是不确定的。简单来说,我们在实际的数据分析工作中,用到的......
  • Spring Boot学习随笔- @SpringBootApplication详解、加载绝对路径配置文件、工厂创建
    学习视频:【编程不良人】2021年SpringBoot最新最全教程3.5@SpringBootApplication详解这是一个组合注解,就是由多个注解组成。下列注解红框内称为元注解(jdk提供)@Target:指定注解作用范围@Retention:指定注解什么时候生效重要注解@SpringBootConfiguration:自动配置Spring......
  • 【scikit-learn基础】--『数据加载』之样本生成器
    除了内置的数据集,scikit-learn还提供了随机样本的生成器。通过这些生成器函数,可以生成具有特定特性和分布的随机数据集,以帮助进行机器学习算法的研究、测试和比较。目前,scikit-learn库(v1.3.0版)中有20个不同的生成样本的函数。本篇重点介绍其中几个具有代表性的函数。1.分类聚类......
  • Python NumPy 数组索引和切片
    1、普通索引普通索引是指使用单个整数或整数列表来索引数组中的元素。1)单个元素索引要访问NumPy数组的单个元素,可以使用单个整数索引。索引从0开始,表示数组的第一行第一个元素。2)多维元素索引2、高级索引高级索引允许使用布尔值或数组来索引数组中的元素。1)布尔索引布......
  • uniapp 图片懒加载的一种方式
    如果是列表页,可以采用前端分页,通过scroll-view下拉,在绑定图片地址信息,这样就能下拉部分,加载部分图片了。pageQuery(){letcurrentPage=this.pQuery.page;letpageSize=this.pQuery.size;constindex=(......
  • PHP+JS实现大文件切片上传功能实现实例源码
    近期公司的项目中,涉及到上传大文件的问题,大文件上传用普通表单上传时出现的问题是,无法断点续存,一但中途中断上传,就要重头开始,这很明显不是我们想要的,所以经过一番查询,学习了一下大文件分割上传的方法。并且使用简单的php做服务端处理程序实现一个功能demo,供以后回顾使用。本人也是......