当前位置: 首页 > news >正文

cesium获取当前窗口和相机高度

在项目开发中,有用到2/3维地图缩放,获取当前视口,绘制当前视口区域内容的功能首先我们先需要监听用户的缩放事件,然后在高度和视口内容

cesium监听缩放事件

方法1:camera.changed

优点:响应式,相机发生变化时触发

缺点:不灵敏,有时候缩放幅度小不触发,缩小也不触发

  viewer.camera.changed.addEventListener(() => {// 获取相机高度let height= viewer.camera.positionCartographic.height;})

 方法2:鼠标滚轮

优点:监听滚轮滚动时触发,响应灵敏

缺点:不用滚轮缩放无法监听到

  const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)handler.setInputAction((wheelment) => {// 获取相机高度let height= viewer.camera.positionCartographic.height;}, Cesium.ScreenSpaceEventType.WHEEL)

 方法3:时间监听clock.onTick

优点:根据cesium内置时钟每个时刻都执行

缺点:无论有无缩放都会触发

  viewer.clock.onTick.addEventListene(() => {// 获取相机高度let height= viewer.camera.positionCartographic.height;})

获取相机高度和位置姿态

获取相机高度


// 获取相机高度
let height= viewer.camera.positionCartographic.height;

获取相机位置姿态

    const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)handler.setInputAction((ev) => {// 获取当前相机xyz坐标let pos = viewer.scene.camera.positionconsole.log(pos)//将笛卡尔坐标转化为经纬度坐标var cartographic = Cesium.Cartographic.fromCartesian(pos);var lon = Cesium.Math.toDegrees(cartographic.longitude);var lat = Cesium.Math.toDegrees(cartographic.latitude);var alt = cartographic.height;console.log({lon, lat, alt })// 获取相机姿态参数var h = viewer.scene.camera.heading;var p = viewer.scene.camera.pitch;var r = viewer.scene.camera.roll;console.log({h, p, r})    }, Cesium.ScreenSpaceEventType.WHEEL)

获取窗口经纬度范围

获取视口经纬度范围有两种方式:

方法1:根据窗口左上角和右下角的点计算整个视口的经纬度范围,如果左上角有右下角不在地图是就无法得到结果,适用于2维

方法2:使用viewer.camera.computeViewRectangle() 方法获取可视矩形窗口经纬度范围

const getViewExtend = ()=> {let params = {};let extend = viewer.camera.computeViewRectangle();// 通过窗口左上角和右下角坐标获取经纬度范围if (typeof extend === "undefined") {//2D下会可能拾取不到坐标,extend返回undefined,所以做以下转换let canvas = viewer.scene.canvas;let upperLeft = new Cesium.Cartesian2(0, 0);//canvas左上角坐标转2d坐标let lowerRight = new Cesium.Cartesian2(canvas.clientWidth,canvas.clientHeight);//canvas右下角坐标转2d坐标let ellipsoid = viewer.scene.globe.ellipsoid;let upperLeft3 = viewer.camera.pickEllipsoid(upperLeft,ellipsoid);//2D转3D世界坐标let lowerRight3 = viewer.camera.pickEllipsoid(lowerRight,ellipsoid);//2D转3D世界坐标let upperLeftCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(upperLeft3);//3D世界坐标转弧度let lowerRightCartographic= viewer.scene.globe.ellipsoid.cartesianToCartographic(lowerRight3);//3D世界坐标转弧度let minx = Cesium.Math.toDegrees(upperLeftCartographic.longitude);//弧度转经纬度let maxx = Cesium.Math.toDegrees(lowerRightCartographic.longitude);//弧度转经纬度let miny = Cesium.Math.toDegrees(lowerRightCartographic.latitude);//弧度转经纬度let maxy = Cesium.Math.toDegrees(upperLeftCartographic.latitude);//弧度转经纬度console.log("经度:" + minx + "----" + maxx);console.log("纬度:" + miny + "----" + maxy);params.minx = minx;params.maxx = maxx;params.miny = miny;params.maxy = maxy;} else {//3D获取方式 通过computeViewRectangle 获取可视区域矩形范围params.maxx = Cesium.Math.toDegrees(extend.east);params.maxy = Cesium.Math.toDegrees(extend.north);params.minx = Cesium.Math.toDegrees(extend.west);params.miny = Cesium.Math.toDegrees(extend.south);}return params;//返回屏幕所在经纬度范围// return[params.maxx, params.maxy, params.maxx, params.miny, params.minx, params.miny, params.minx, params.maxy,params.maxx, params.maxy]
}

实现获取当前窗口范围的代码

// 获取相机高度
const getCameraH = () => {const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)handler.setInputAction((wheelment) => {let height= viewer.camera.positionCartographic.height;if(height<3516495) {let params = getViewExtend()let arr = [params.maxx, params.maxy, params.maxx, params.miny, params.minx, params.miny, params.minx, params.maxy,params.maxx, params.maxy]// 绘制范围createPolygon(arr, "id-123", "范围")}}, Cesium.ScreenSpaceEventType.WHEEL)}// 获取窗口范围
const getViewExtend = ()=> {let params = {};let extend = viewer.camera.computeViewRectangle();// 通过窗口左上角和右下角坐标获取经纬度范围if (typeof extend === "undefined") {//2D下会可能拾取不到坐标,extend返回undefined,所以做以下转换let canvas = viewer.scene.canvas;let upperLeft = new Cesium.Cartesian2(0, 0);//canvas左上角坐标转2d坐标let lowerRight = new Cesium.Cartesian2(canvas.clientWidth,canvas.clientHeight);//canvas右下角坐标转2d坐标let ellipsoid = viewer.scene.globe.ellipsoid;let upperLeft3 = viewer.camera.pickEllipsoid(upperLeft,ellipsoid);//2D转3D世界坐标let lowerRight3 = viewer.camera.pickEllipsoid(lowerRight,ellipsoid);//2D转3D世界坐标let upperLeftCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(upperLeft3);//3D世界坐标转弧度let lowerRightCartographic= viewer.scene.globe.ellipsoid.cartesianToCartographic(lowerRight3);//3D世界坐标转弧度let minx = Cesium.Math.toDegrees(upperLeftCartographic.longitude);//弧度转经纬度let maxx = Cesium.Math.toDegrees(lowerRightCartographic.longitude);//弧度转经纬度let miny = Cesium.Math.toDegrees(lowerRightCartographic.latitude);//弧度转经纬度let maxy = Cesium.Math.toDegrees(upperLeftCartographic.latitude);//弧度转经纬度console.log("经度:" + minx + "----" + maxx);console.log("纬度:" + miny + "----" + maxy);params.minx = minx;params.maxx = maxx;params.miny = miny;params.maxy = maxy;} else {//3D获取方式 通过computeViewRectangle 获取可视区域矩形范围params.maxx = Cesium.Math.toDegrees(extend.east);params.maxy = Cesium.Math.toDegrees(extend.north);params.minx = Cesium.Math.toDegrees(extend.west);params.miny = Cesium.Math.toDegrees(extend.south);}return params;//返回屏幕所在经纬度范围// return[params.maxx, params.maxy, params.maxx, params.miny, params.minx, params.miny, params.minx, params.maxy,params.maxx, params.maxy]
}// 绘制范围
const createPolygon =(lonlat, id, name)=> {var ploy = Cesium.Cartesian3.fromDegreesArray(lonlat);var polyCenter = Cesium.BoundingSphere.fromPoints(ploy).center;if(viewer.entities.getById(id)){viewer.entities.remove(viewer.entities.getById(id))}viewer.entities.add({id: id,position: polyCenter,polygon: {hierarchy: Cesium.Cartesian3.fromDegreesArray(lonlat),clampToGround: false,show: true,fill: true,material: Cesium.Color.RED.withAlpha(0.5),width: 3,outlineColor: Cesium.Color.BLACK,outlineWidth: 2,outline: true,},label: {fillColor:  Cesium.Color.fromCssColorString("#ffff00"),font: "12pt SiYuan",outlineColor: new Cesium.Color(0, 0, 0, 1),outlineWidth: 2,show: true,style: Cesium.LabelStyle.FILL_AND_OUTLINE,text: name,},});}

三维效果:

二维效果:

http://www.dtcms.com/a/479927.html

相关文章:

  • 西安网站建设培训学校flash网站代码
  • 石家庄电子商务网站建设深圳电器公司排名
  • 泰州模板自助建站华为应用商店下载
  • 医程通 网站做的太徐州做网站管理的公司
  • 四川住房城乡建设周刊网站文字转码unicode
  • 贵阳建设公司网站wordpress怎么搜索博客
  • Kubernetes资源管理与yaml文件详解
  • 常规的偏振镜头有哪些类型?能做什么?
  • 最长连续序列(Longest Consecutive Sequence)
  • 南宁建设信息网站单网页网站制作
  • 国网商旅云网站地址做网站文案用哪个软件
  • 产品做推广一般上什么网站网站建设php有哪些
  • 做装饰工程的在什么网站投标手机能用的网站
  • 血玥珏-文本段落处理器 1.0.0.1
  • 数据库自增 ID 耗尽?4 个落地级方案,从新表到老系统全覆盖
  • wordpress 手机端打开速度慢seo服务公司深圳
  • python线程间怎么通信
  • 重庆有名的网站建设商城网站建设课设
  • 网站建设招标需求wordpress卡死了
  • 昆明公司建设网站永久免费网站建商城
  • sql练习-4
  • 网站都是用什么编写的系统开发文档
  • 做网站建设的windows优化大师的特点
  • win8风格 网站模板可以做业务推广的网站有哪些
  • 安吉网站设计自己怎么制作logo图标
  • 深圳专业做网站排名哪家好家乡网页设计教程
  • 专业手机网站公司哪家好学校网站建设源代码
  • AI 超级智能体全栈项目阶段五:RAG 四大流程详解、最佳实践与调优(基于 Spring AI 实现)
  • 网站做管理后台需要知道什么软件开发和编程的区别
  • 网站源码下载插件泛华建设集团有限公司网站