首页 > 其他分享 >Cesium 地图下钻 动态加载

Cesium 地图下钻 动态加载

时间:2023-02-24 12:12:24浏览次数:49  
标签:code viewer 地图 pickObj scene let Cesium 加载

有这样一个需求:

当鼠标滚轮向下滚动时,动态加载geojson数据,而向上滚动时,数据自动恢复原样。

1.gif

首先需要加载出全国的geojson数据,当选择某个省的时候,拾取到这个省的行政码信息,然后请求加载这个省的geojson数据。

我们可以用MOUSE_MOVE事件,获取鼠标移动时的坐标,从而拾取到这个物体,然后在鼠标滚轮WHEEL事件中,通过上下方向以及层级的判断来触发加载数据。

async addGeoJsonData(code) {//获取接口数据
      let data = await getGeojsonApi({ admincode: code })
      ...
},
setAction() {
            const Cesium = this.Cesium
            //球交互事件
            this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas)

            let leftclick = Cesium.ScreenSpaceEventType.MOUSE_MOVE
            this.viewer.screenSpaceEventHandler.removeInputAction(leftclick)
            this.handler.setInputAction((e) => {
                // let pickObj = this.viewer.scene.pick(e.position)
                // console.log(pickObj, e.position)
                let pickObj = this.viewer.scene.pick(e.endPosition)
                // 视角飞入
                if (pickObj && pickObj.id) {

                    this.pickObj = pickObj;
                }
            }, leftclick);
            let wheel = Cesium.ScreenSpaceEventType.WHEEL;
            this.handler.setInputAction((wheel) => {
                // let pickObj = this.viewer.scene.pick(e.position)
                console.log('wheeel>>>',wheel);
                let tiles = new Set();
                let tilesToRender = this.viewer.scene.globe._surface._tilesToRender;
                if(Cesium.defined(tilesToRender)){
                    for(let i=0;i<tilesToRender.length;i++){
                        
                        tiles.add(tilesToRender[i].level);
                    }
                    // console.log('当前地图瓦片级别为',tiles);
                    // console.log(Math.max(...tiles));
                    let level = Math.max(...tiles);
                    console.log('level',level);
                    if(wheel > 0) {//当放低镜头时
                    console.log('放低镜头');
                        if(this.pickObj) {
                            let pickObj = this.pickObj;
                            if(level > 3) {
                                //查询geojson
                                this.addGeoJsonData(`${pickObj.id.admincode}`)
                                
                            } 
                        }



                    } else {
                        console.log('拉高镜头');
                        if(level < 5) { //只有当拉高镜头时,清除数据

                            this.code = '';
                            this.hideGeoJsonData();
                            this.showGeoJsonData('100000_full');
                            Object.keys(this.labelCont).map(item=>this.labelCont[item].show = true);

                        }
                    }
                    

                }
            },wheel);

        },

但这样做有个问题,就是会频繁触发addGeoJsonData函数,从而导致数据重复叠加。我希望一个admincode行政区的数据仅加载一次。
我们可以利用watch来解决这个问题。

data() {
  return {
    code: ''
  }
},
watch: {
        code: {
            handler(val, oldVal) {
                
                if(val !== oldVal) {
                    
                    this.addGeoJsonData(val);
                    
                }
            },
            deep: true,
            immediate: true
        },
},
methods: {
    async addGeoJsonData(code) {//获取接口数据
          let data = await getGeojsonApi({ admincode: code })
          ...
    },
    setAction() {
            const Cesium = this.Cesium
            //球交互事件
            this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas)

            let leftclick = Cesium.ScreenSpaceEventType.MOUSE_MOVE
            this.viewer.screenSpaceEventHandler.removeInputAction(leftclick)
            this.handler.setInputAction((e) => {
                // let pickObj = this.viewer.scene.pick(e.position)
                // console.log(pickObj, e.position)
                let pickObj = this.viewer.scene.pick(e.endPosition)
                // 视角飞入
                if (pickObj && pickObj.id) {

                    this.pickObj = pickObj;
                }
            }, leftclick);
            let wheel = Cesium.ScreenSpaceEventType.WHEEL;
            this.handler.setInputAction((wheel) => {
                // let pickObj = this.viewer.scene.pick(e.position)
                console.log('wheeel>>>',wheel);
                let tiles = new Set();
                let tilesToRender = this.viewer.scene.globe._surface._tilesToRender;
                if(Cesium.defined(tilesToRender)){
                    for(let i=0;i<tilesToRender.length;i++){
                        
                        tiles.add(tilesToRender[i].level);
                    }
                    // console.log('当前地图瓦片级别为',tiles);
                    // console.log(Math.max(...tiles));
                    let level = Math.max(...tiles);
                    console.log('level',level);
                    if(wheel > 0) {//当放低镜头时
                    console.log('放低镜头');
                        if(this.pickObj) {
                            let pickObj = this.pickObj;
                            if(level > 3) {
                                //查询geojson
                                this.code = pickObj.id.admincode;
                                
                            } 
                        }



                    } else {
                        console.log('拉高镜头');
                        if(level < 5) { //只有当拉高镜头时,清除数据

                            this.code = '';
                            this.hideGeoJsonData();
                            this.showGeoJsonData('100000_full');
                            Object.keys(this.labelCont).map(item=>this.labelCont[item].show = true);

                        }
                    }
                    

                }
            },wheel);

        },
}



本文转自 https://www.jianshu.com/p/6bfbfce7f100,如有侵权,请联系删除。

标签:code,viewer,地图,pickObj,scene,let,Cesium,加载
From: https://www.cnblogs.com/hustshu/p/17150834.html

相关文章

  • Cesium 使用canvas 自定义 label 样式
    https://blog.csdn.net/tutouxiaoyaonie/article/details/127306197项目需求:车辆按照轨迹移动,模型上方要有文本框显示车辆信息,但是cesium自带的label设置样式有限,不美观,所......
  • Cesium 聚合 开始时未聚合
    解决方法:billboard加宽高billboard:{heightReference:Cesium.HeightReference.CLAMP_TO_GROUND,image:"../../../../../static/img/POI/餐饮.png",width:50,//一定......
  • Cesium label 换行
    字符串中加换行符"\n"label:{//文字标签text:newCesium.CallbackProperty((result)=>{lettextTipsArr=textTips......
  • 【踩坑】lua加载模块但找不到模块最蠢的原因
    这个问题比较蠢,我用MinGW编译的lua去加载了MSVC编译的lua模块导致找不到符号,然后花了几个小时找为什么我VS项目使用函数导出接口了但是函数依然没有导出(使用dumpbin和nm都......
  • 动态加载
    1、dlopen#include<dlfcn.h>void*dlopen(constchar*filename,intflags);功能:将动态库加载到内存。参数:filename:共享库路径。如果只给定文件的名字。按照动态链接器的......
  • JavaFX相关问题--在使用JavaFX加载本地图片时图片会无法显示
    开发环境及开发工具Eclipse+JDK10问题描述在使用JavaFX加载本地图片时图片会无法显示解决方案解决方法1——使用file:+绝对路径解决方法2——使用相对......
  • cesium 颜色赋值
     constline2=newCesium.Primitive({      geometryInstances:newCesium.GeometryInstance({        geometry:newCesium.Polyline......
  • vue中页面加载进度条效果的实现
    我们在vue项目中,为了减少首屏加载的时间,通常会开启路由的懒加载。路由懒加载配合gizp确实能帮助我们大大的加快首屏的加载时间。然而,路由懒加载会使得我们在第一次打开一......
  • Cesium 键盘漫游
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>键盘场景漫游</title><scripttype="text/javascript"src="https://cdnjs.cloud......
  • Linux 根系统中增加自动加载网口
    最近在学习复旦微的核心版。遇到的问题是:网卡没法自动加载。在学习资料中也没有提供完整的可行方法。经过研究,按照下面方法可行:1在buildrootf/fmsh/下新建/并拷贝/lib......