cesium中限制地图浏览范围

项目中有限制用户地图浏览范围的需求,经过研究以及查找相关资料,得出了一个可行方法:1、限制用户浏览视角的高度范围,然后实时监测镜头的范围,最后用实时镜头范围与限制范围的经纬度进行对比,超出就跳回初始视角,如下:

*1、限制镜头高度

限制镜头的高度使用cesium自带api就可以直接实现,如下:

viewer.scene.screenSpaceCameraController.maximumZoomDistance =200000;
viewer.scene.screenSpaceCameraController.minimumZoomDistance = 10;

*2、实时监测镜头范围

想要实时监测镜头范围,通过查找相关的文章学习到到了两个cesium的方法:

//实时监测方法,该方法会不停的调用,频率相当高
viewer.scene.preRender.addEventListener();
//计算镜头范围方法,该方法会计算当前镜头地理坐标(弧度)范围并返回west,east,north,south 4个范围参数
viewer.camera.computeViewRectangle();

将两者组合就可以实时监测镜头地理坐标(弧度)范围了:

viewer.scene.preRender.addEventListener(function() {let rectangle = viewer.camera.computeViewRectangle();//rectangle 为当前镜头的实时范围}

*3、将获取的rectangle由地理坐标(弧度)转为经纬度坐标

通过查找相关资料找到了地理坐标(弧度)转经纬度坐标的方法,如下:

// 将弧度转为经纬度,west为左(西)侧边界的经度,以下类推
let west =rectangle.west / Math.PI * 180;
let north = rectangle.north / Math.PI * 180;
let east = rectangle.east / Math.PI * 180;
let south = rectangle.south / Math.PI * 180;

*4、设置可浏览的经纬度范围,判断镜头是否超出,超出则跳回

设置可浏览的经纬度范围:

//按需求设置可浏览的经纬度边界
let Range = {west:100.111111,north:25.11111,east:105.11111,south:28.111111};

判断超出跳回:

//如果视角超出设置经纬度范围则跳转视角
if(west < Range.west || north < Range.north || east > Range.east || south > Range.south){console.log("跳转视角");viewer.scene.camera.setView({destination: new Cesium.Cartesian3(-1264160.070654434, 5665789.912013389, 2654915.919083717),orientation: {heading: 0.16290833989833153,pitch: -0.43768116366765275,roll: 6.283129299301802}});}
//可以选择flyto方法,飞行更流畅

*5、完整代码

//限制地图浏览范围//限制镜头高度viewer.scene.screenSpaceCameraController.maximumZoomDistance =200000;viewer.scene.screenSpaceCameraController.minimumZoomDistance = 10;//实时监测镜头范围(该方法会一直调用)viewer.scene.preRender.addEventListener(function() {//计算镜头范围方法,该方法会计算当前镜头地理坐标(弧度)范围并返回west,east,north,south 4个范围参数let rectangle = viewer.camera.computeViewRectangle();// console.log(rectangle,'rectangle');//设置可浏览经纬度范围let Range = {west:100.111111,north:25.11111,east:105.11111,south:28.111111};//地理坐标(弧度)转经纬度坐标// 弧度转为经纬度,west为左(西)侧边界的经度,以下类推let west =rectangle.west / Math.PI * 180;let north = rectangle.north / Math.PI * 180;let east = rectangle.east / Math.PI * 180;let south = rectangle.south / Math.PI * 180;//如果视角超出设置范围则跳转视角if(west < Range.west || north < Range.north || east > Range.east || south > Range.south){//console.log("跳转视角");viewer.scene.camera.setView({destination: new Cesium.Cartesian3(-1264160.070654434, 5665789.912013389, 2654915.919083717),orientation: {heading: 0.16290833989833153,pitch: -0.43768116366765275,roll: 6.283129299301802}});})};
//可以选择flyto方法,飞行更流畅

*6、方法缺陷与更好的实现方式

该方式实现浏览范围限制,有两个弊端:
1、preRender.addEventListener()方法会一直调用,频率很高,不利于前端性能优化,尤其是加载大型地图后,本来就卡顿的界面,可能会更加卡顿,且如果初始范围小于设置的浏览范围,就会一直触发视角跳转,导致死循环,无法操作。
2、拉到地图边界跳转视角,不利于用户体验,到范围边界后禁止往更外面拖动与放大,才是更优秀的方法,但笔者未找到相关实现方式,有知道的大佬可以评论区留言。
更好的实现方式
因以上两个弊端,因此笔者项目中弃用了此方法,改为按需加载相应图层,这样既可减少图层加载数量,也不会有以上两个弊端,更利于前端性能优化。建议大家最好也使用此种方式实现范围限制。

参考大佬传送门:
https://www.cnblogs.com/xt112233/p/14044460.html
https://blog.csdn.net/u011495292/article/details/81207144
https://blog.csdn.net/pyx6119822/article/details/81208151
https://blog.csdn.net/zhengshaofeng1/article/details/113613138
https://blog.csdn.net/qq_42036616/article/details/90140636

cesium中限制地图浏览范围相关推荐

  1. 根据两个经纬度点调用百度地图应用查询路线 适用android或者ios中及网页浏览(手机网页同样适用)

    Intent intent = null;try {// 如果有安装百度地图 就启动百度地图StringBuffer sbs = new StringBuffer();sbs.append(" ...

  2. 谷歌历史版本_《地图中的历史》,本书中的地图,我们为你找到了高清版本

    <地图中的历史>,是英国畅销书作家约翰·O.E.克拉克2018年出版的地图史著作.本书大16开全彩精装,包含6大主题,共使用了200余张珍贵插图.其中包括了改变世界的58幅地图,遍及天文. ...

  3. Cesium中gltf模型的坐标系

    Cesium中使用gltf格式的模型,而gltf格式的模型的坐标系在加载到Cesium中后,Cesium会自动变换坐标系. 本文简要阐述gltf模型的坐标系加载前后的变化. gltf模型 可以使用各种 ...

  4. MapX系列-- 地图浏览

    地图浏览 mapX封装的很好,将ZoomIn,ZoomOut,Pan等基本地图浏览功能全部预制好了,用户只需要通过设置Map控件的CurrentTool属性即可,并且地图的CurrentTool属性值 ...

  5. tableau地图城市数据_Tableau 中的地图工作区

    Tableau 中的地图工作区由以下元素组成. "数据"窗格 "数据"窗格将位置数据组织为维度和度量.通常,位置字段(例如国家/地区.州/省/市/自治区和城市名 ...

  6. Cesium中实时显示经纬度及视角高

    如何在cesium中实时根据鼠标的位置显示经纬度以及视角高 具体效果如下: 具体代码如下: //html代码 <div id="latlng_show" style=&quo ...

  7. cesium 切换瓦片地图的加载方式

    cesium 切换瓦片地图的加载方式 如果你熟悉 cesium,那么你或多或少应该用过或者了解如何用 cesium 加载瓦片地图. 熟悉加载瓦片地图这本身不是一个太难的工作,一般来说,只要你照着官方的 ...

  8. 基于Cesium使高德地图、百度地图、腾讯地图与天地图无偏移叠加

    基于Cesium使高德地图.百度地图.腾讯地图与天地图无偏移叠加 需求的产生 方法的探索 经验总结 需求的产生 在Cesium框架中,可以支持很多ImageryProvider,但是Viewer只用一 ...

  9. cesium 经纬度绘制点_关于Cesium中的常用坐标系及说明

    Cesium是一个基于JavaScript的开源框架,可用于在浏览器中绘制3D的地球,并在其上绘制地图(支持多种格式的瓦片服务),该框架不需要任何插件支持,但是浏览器必须支持WebGL. Cesium ...

最新文章

  1. 全球智能制造发展现状及前景预测 工业机器人引领行业发展
  2. 使用 Caddy 自动化发布 Web 应用
  3. 一个项目从开工到交付使用需要经历的过程
  4. python从入门到精通书-Python从入门到精通,跟着《这本书》学就够了?
  5. matlab中所遇到的问题,【总结】【matlab】【机器学习】学习过程中遇到的问题总结...
  6. AngularJS select中ngOptions用法详解
  7. python esp8266模块_ESP8266使用笔记之常用固件
  8. ubuntu mysql ftp_ubuntu上搭建vsftpd且通过mysql来管理FTP账号
  9. TensorFlow 下 mnist 数据集的操作及可视化
  10. SQL Server和Oracle数据库索引介绍
  11. java的八大基本类型
  12. 计算机显卡型号中数字含义详解,显卡型号全解读:那么多字母如何理解?又分别代表啥意思?...
  13. 【转】MUD教程--巫师入门教程4
  14. javaweb基于JSP+Servlet开发水费管理系统+论文 大作业 毕业设计
  15. 压力测试是什么?为什么要压力测试?怎么使用压力测试?
  16. eclipse中svn冲突解决
  17. 网络游戏数据同步的实现 一:状态同步、帧同步的基本原理概述
  18. 计算机组成原理17----CPU指令流水线
  19. 物联网的2018,百花齐放的一年
  20. java 方法互斥_java – 互斥方法

热门文章

  1. NXP CPU 网卡性能优化的一次分析
  2. 身份证二进制数据解析
  3. window系统 任务计划程序
  4. 如何将excel.xls文件批量转换成.xlsx格式
  5. Windows通用克隆系统入门基础知识简介
  6. 详解 C/C++ 各大编程规范
  7. 随机生成英文字母 php,PHP生成随机英文用户名
  8. kafka eagel的使用
  9. P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。
  10. DC-DC升压和降压电路电感参数选择详解