CesiumJS+SuperMap3D.js混用实现天际线分析

 版本简介:

cesium:1.99;Supermap3D:SuperMap iClient JavaScript 11i(2023);

官方下载文档链家:SuperMap技术资源中心|为您提供全面的在线技术服务

示例参考:support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#analysis

support.supermap.com.cn:8090/webgl/examples/webgl/examples.html

1. Cesium的使用

  • 场景初始化与渲染

function onload(Cesium) {Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI...';var viewer = new Cesium.Viewer('Container');viewer.scenePromise.then(function(scene){init(Cesium, scene, viewer);});
}
  • Cesium.Ion.defaultAccessToken: Cesium Ion是用于访问Cesium中的3D地形、卫星影像等服务。在这里,初始化时提供了Ion的访问密钥。
  • Cesium.Viewer: 创建Cesium的3D场景,并绑定到Container这个div元素。这个viewer负责加载Cesium的地形、影像等基础资源。
  • scenePromise: Cesium.Viewer会返回一个scene对象,表示当前Cesium的场景。之后我们通过init函数进一步对场景进行设置。
  • 影像图层添加

    var labelImagery = new Cesium.TiandituImageryProvider({mapStyle: Cesium.TiandituMapsStyle.CIA_C,token: '04e319956d6385dcdf25089104eb8b5b'
    });
    
    • 这里使用了Cesium的TiandituImageryProvider来添加天地图中文标注图层,配合Cesium的地形渲染,使地图更加丰富。
  • 光源和环境光设置

    scene.lightSource.ambientLightColor = new Cesium.Color(0.65, 0.65, 0.65, 1);
    var position1 = new Cesium.Cartesian3.fromDegrees(116.261209157595,  39.3042238956531, 480);
    var targetPosition1 = new Cesium.Cartesian3.fromDegrees(116.261209157595, 39.3042238956531, 430);
    var dirLightOptions = {targetPosition: targetPosition1,color: new Cesium.Color(1.0, 1.0, 1.0, 1),intensity: 0.55
    };
    directionalLight_1 = new Cesium.DirectionalLight(position1, dirLightOptions);
    scene.addLightSource(directionalLight_1);
    
    • 设置了环境光和定向光(DirectionalLight)以增强场景的光照效果。
  • 天际线分析和场景状态判断

    if (!scene.pickPositionSupported) {alert('不支持深度纹理,天际线分析功能无法使用!');
    }
    
    • 使用Cesium的pickPositionSupported来判断浏览器是否支持深度纹理,这对天际线分析是必须的。

2. SuperMap的使用

  • 天际线分析功能(Skyline)

    var skyline = new SuperMap3D.Skyline(scene);
    
    • 使用SuperMap3D.Skyline来初始化SuperMap的天际线分析工具,这是SuperMap提供的高级空间分析功能,用于分析城市建筑物等的天际线轮廓。
  • 绘制限高体

    var polygonHandler = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Polygon);
    polygonHandler.drawEvt.addEventListener(function (result) {skyline.removeLimitbody("limitBody");var polygon = result.object;polygon.show = false;var pos = polygon.positions;var positions = [];for (var i = 0, len = pos.length; i < len; i++) {var cartographic = Ceisum.Cartographic.fromCartesian(pos[i]);var longitude = Ceisum.Math.toDegrees(cartographic.longitude);var latitude = Ceisum.Math.toDegrees(cartographic.latitude);positions.push([longitude, latitude]);}positions = unique(positions);var arr = [];for (var i = 0, len = positions.length; i < len; i++) {arr.push(positions[i][0]);arr.push(positions[i][1]);}skyline.addLimitbody({position: arr,name: "limitBody"});
    });
    
    • 这里使用了SuperMap3D.DrawHandler来进行多边形绘制,完成后调用skyline.addLimitbody来添加限高体,这是SuperMap提供的另一个分析功能。
  • 加载S3M场景

    var promise = scene.open(URL_CONFIG.SCENE_CBD);
    SuperMap3D.when(promise, function (layers) {scene.camera.setView({destination: SuperMap3D.Cartesian3.fromDegrees(116.4465, 39.9066, 47.9552),orientation: {heading: 0.34395448573153864,pitch: -0.0538346996932666,roll: 6.2831853071795685}});for (var i = 0; i < layers.length; i++) {layers[i].selectEnabled = false;}
    }, function (e) {var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';widget.showErrorPanel(title, undefined, e);
    });
    
    • 使用scene.open()加载SuperMap的S3M模型数据,并在加载完成后通过Cesium的setView来调整相机位置。

3. 前端按钮交互

  • 通过按钮与用户交互,调用不同的功能。

  • 提取天际线

    $('#chooseView').click(function () {var cartographic = scene.camera.positionCartographic;var longitude = Ceisum.Math.toDegrees(cartographic.longitude);var latitude = Ceisum.Math.toDegrees(cartographic.latitude);var height = cartographic.height;skyline.viewPosition = [longitude, latitude, height];skyline.pitch = Ceisum.Math.toDegrees(scene.camera.pitch);skyline.direction = Ceisum.Math.toDegrees(scene.camera.heading);skyline.radius = 10000;skyline.build();
    });
    
    • 点击chooseView按钮后,会获取当前相机的经纬度和高度,并使用SuperMap的skyline对象来构建天际线分析。
  • 绘制限高体

    $('#setLimitBody').click(function () {if (polygonHandler.active) {return;}polygonHandler.activate();
    });
    
    • 通过点击setLimitBody按钮,激活多边形绘制功能(由SuperMap提供),绘制完成后会自动调用skyline.addLimitbody来添加限高体。
  • 清除

    $('#clear').click(function () {viewer.entities.removeAll();skyline.clear();polygonHandler.clear();
    });
    
    • 通过clear按钮清除场景中的所有实体(Cesium)和天际线分析数据(SuperMap)。
  • 二维天际线

    $('#getSkyline2D').click(function () {skyline.getSkyline2DAsync().then(object => {var myChart = echarts.init(document.getElementById("map"));var option = { ... };myChart.setOption(option);});
    });
    
    • 获取天际线的二维数据(由SuperMap提供),并使用Echarts库在前端绘制图表。

6.代码部分:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"><meta name="viewport"content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"><title>天际线分析</title><link href="../../public/SuperMap3D/Widgets/widgets.css" rel="stylesheet"><link href="../css/pretty.css" rel="stylesheet"><link href="../css/skyline.css" rel="stylesheet"><script type="text/javascript" src="../js/jquery.min.js"></script><script type="text/javascript" src="../js/echarts.min.js"></script><script src="../js/config.js"></script><script type="text/javascript" src="../../public/SuperMap3D/SuperMap3D.js"></script><script src="../../../Cesium-1.99/Build/Cesium/Cesium.js"></script><link href="../../../Cesium-1.99/Build/Cesium/Widgets/widgets.css">
</head>
<body><div id="Container"></div><div id='loadingbar' class="spinner"><div class="spinner-container container1"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div><div class="spinner-container container2"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div><div class="spinner-container container3"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div></div><div id="toolbar" class="param-container tool-bar"><button type="button" id="chooseView" class="button black">提取天际线</button><button type="button" id="getSkyline2D" class="button black">二维天际线</button><button type="button" id="setLimitBody" class="button black">绘制限高体</button><button type="button" id="getSkylineArea" class="button black">拉伸闭合体</button><button type="button" id="clear" class="button black">清除</button></div><div id="map" style="position : absolute;right : 5%; bottom : 5%;width:450px;height:400px;"></div><script type="text/javascript">function onload(Cesium) {Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJlZjRiNDQyMi1mZDBhLTQxYTAtYWU4NC1hZDY4YzhjNWU3ZGEiLCJpZCI6MjMyMDI3LCJpYXQiOjE3MjI1MDEzMTd9.3lFzziTrt3ggC3pfiVmNRbSidI52EL4CsOqWKgYxHkM'var viewer = new Cesium.Viewer('Container');viewer.scenePromise.then(function(scene){init(Cesium, scene, viewer);});}function init(Cesium, scene, viewer) {viewer.resolutionScale = window.devicePixelRatio;var labelImagery = new Cesium.TiandituImageryProvider({mapStyle: Cesium.TiandituMapsStyle.CIA_C,//天地图全球中文注记服务token: '04e319956d6385dcdf25089104eb8b5b' //由天地图官网申请的密钥});var scene = viewer.scene;scene.shadowMap.darkness = 1.275; //设置第二重烘焙纹理的效果(明暗程度)scene.debugShowFramesPerSecond = false;scene.hdrEnabled = false;scene.sun.show = true;// 01设置环境光的强度-新处理CBD场景scene.lightSource.ambientLightColor = new Cesium.Color(0.65, 0.65, 0.65, 1);// 添加光源var position1 = new Cesium.Cartesian3.fromDegrees(116.261209157595,  39.3042238956531, 480);//光源方向点var targetPosition1 = new Cesium.Cartesian3.fromDegrees(116.261209157595, 39.3042238956531,430);var dirLightOptions = {targetPosition: targetPosition1,color: new Cesium.Color(1.0, 1.0, 1.0, 1),intensity: 0.55};directionalLight_1 = new Cesium.DirectionalLight(position1, dirLightOptions);scene.addLightSource(directionalLight_1);if (!scene.pickPositionSupported) {alert('不支持深度纹理,天际线分析功能无法使用!');}var skyline = new SuperMap3D.Skyline(scene);//创建天际线分析对象var polygonHandler = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Polygon);var widget = viewer.Widget;try {var promise = scene.open(URL_CONFIG.SCENE_CBD);SuperMap3D.when(promise, function (layers) {scene.camera.setView({//图层加载完成,设置相机位置destination: SuperMap3D.Cartesian3.fromDegrees(116.4465, 39.9066, 47.9552),orientation: {heading: 0.34395448573153864,pitch: -0.0538346996932666,roll: 6.2831853071795685}});for (var i = 0; i < layers.length; i++) {layers[i].selectEnabled = false;}}, function (e) {if (widget._showRenderLoopErrors) {var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';widget.showErrorPanel(title, undefined, e);}});}catch (e) {if (widget._showRenderLoopErrors) {var title = '渲染时发生错误,已停止渲染。';widget.showErrorPanel(title, undefined, e);}}try {// 绘制多边形结束的回调事件polygonHandler.drawEvt.addEventListener(function (result) {// 清除之前的限高体对象skyline.removeLimitbody("limitBody");var polygon = result.object;polygon.show = false;var pos = polygon.positions;var positions = [];// 遍历多边形,取出所有点for (var i = 0, len = pos.length; i < len; i++) {//转化为经纬度,并加入至临时数组var cartographic = Cesium.Cartographic.fromCartesian(pos[i]);var longitude = Cesium.Math.toDegrees(cartographic.longitude);var latitude = Cesium.Math.toDegrees(cartographic.latitude);positions.push([longitude, latitude]);}//去除重复点positions = unique(positions);var arr = [];//再次遍历转化为接口所需的数组格式for (var i = 0, len = positions.length; i < len; i++) {arr.push(positions[i][0]);arr.push(positions[i][1]);}//添加限高体对象skyline.addLimitbody({position: arr,name: "limitBody"});});//去重函数unique = function (arr) {var res = [];var json = {};for (var i = 0; i < arr.length; i++) {if (!json[arr[i]]) {res.push(arr[i]);json[arr[i]] = 1;}}return res;};function mousestyle() { //鼠标样式viewer.enableCursorStyle = false;viewer._element.style.cursor = '';$('body').removeClass('drawCur').addClass('drawCur');}$('#chooseView').click(function () {var cartographic = scene.camera.positionCartographic;var longitude = Cesium.Math.toDegrees(cartographic.longitude);var latitude = Cesium.Math.toDegrees(cartographic.latitude);var height = cartographic.height;//天际线分析的视口位置设置成当前相机位置skyline.viewPosition = [longitude, latitude, height];//设置俯仰和方向skyline.pitch = Ceisum.Math.toDegrees(scene.camera.pitch);skyline.direction = Ceisum.Math.toDegrees(scene.camera.heading);skyline.radius = 10000; // 天际线分析半径设置为10000米skyline.build();$("#getSkyline2D").show();$("#setLimitBody").show();$("#map").hide();});$('#setLimitBody').click(function () {mousestyle();if (polygonHandler.active) {return;}polygonHandler.activate();});$('#clear').click(function () {viewer.entities.removeAll();skyline.clear();polygonHandler.clear();$("#map").hide();});$('#getSkylineArea').click(function () {var cartographic = scene.camera.positionCartographic;var longitude = SuperMap3D.Math.toDegrees(cartographic.longitude);var latitude = SuperMap3D.Math.toDegrees(cartographic.latitude);var height = cartographic.height;var points = skyline.getSkyline3D();var pointArr = new Array();var cameraPoint = SuperMap3D.Cartesian3.fromDegrees(longitude, latitude, height);pointArr.push(cameraPoint);for (var i = 0; i < points.x.length; i++) {var point = SuperMap3D.Cartesian3.fromDegrees(points.x[i], points.y[i], points.z[i]);pointArr.push(point);}viewer.entities.add({polygon: {extrudedHeight: 30,hierarchy: pointArr,perPositionHeight: true,material: SuperMap3D.Color.ORANGE.withAlpha(1.0)}})});$('#getSkyline2D').click(function () {//获取二维天际线对象,兼容webgpuskyline.getSkyline2DAsync().then(object=>{//用echarts绘制二维天际线var myChart = echarts.init(document.getElementById("map"));var option = {backgroundColor: "rgba(73,139,156,0.9)",title: {text: "二维天际线"},tooltip: {trigger: "axis"},calculable: true,xAxis: [{type: "category",boundaryGap: false,data: object.x,show: false}],yAxis: [{type: "value",min: 0,max: 1}],series: [{name: "",type: "line",data: object.y}]};myChart.setOption(option);$("#map").show();});});}catch (e) {if (scene.context.depthTexture) {swal("天际线分析", "该浏览器不支持深度纹理检测", "warning");}}$("#toolbar").show();$('#loadingbar').remove();}if (typeof SuperMap3D !== 'undefined') {window.startupCalled = true;onload(SuperMap3D);}</script></body></html>

7.实现效果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1535285.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:git

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;git》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff01;&#xff01;&…

Istio下载及安装

Istio 是一个开源的服务网格&#xff0c;用于连接、管理和保护微服务。以下是下载并安装 Istio 的步骤。 官网文档&#xff1a;https://istio.io/latest/zh/docs/setup/getting-started/ 下载 Istio 前往Istio 发布页面下载适用于您的操作系统的安装文件&#xff0c;或者自动…

远程跨境传输大文件如何做到安全又稳定?

在当今全球化的商业环境中&#xff0c;企业跨境传输大文件的需求日益增长。这不仅涉及到数据的快速迁移&#xff0c;还包括了安全性、稳定性和合规性等多重挑战。本文将探讨企业在跨境传输大文件时可能遇到的问题&#xff0c;以及在传输过程中应注意的事项&#xff0c;并重点介…

AI重塑视觉体验:将图像与视频转化为逼真可编辑的3D虚拟场景

在这个数字化飞速发展的时代&#xff0c;AI技术正以前所未有的方式重塑我们的视觉体验。特别是当AI能够轻松将普通的照片和视频转化为高度逼真、可交互的3D虚拟场景时&#xff0c;它不仅简化了3D内容创作的复杂性&#xff0c;还极大地拓宽了应用场景的边界。今天&#xff0c;我…

测试工具笔记

性能测试是软件测试中非常重要的一部分&#xff0c;它可以帮助识别软件在高负载条件下的性能瓶颈。市面上有许多性能测试工具&#xff0c;它们各有特点和优势。以下是一些流行的性能测试工具&#xff1a; 1. LoadRunner&#xff1a; 由Micro Focus提供&#xff0c;是一个业界广…

PHP 环境搭建教程

搭建一个稳定的PHP开发环境是开发Web应用的基础。在Linux系统上&#xff0c;LAMP&#xff08;Linux, Apache, MySQL/MariaDB, PHP&#xff09;堆栈是最广泛使用的组合。本文将详细介绍如何在Linux上搭建PHP开发环境&#xff0c;涵盖安装步骤、配置和测试。更多内容&#xff0c;…

【方法】如何禁止PDF转换成其他格式文件?

在工作中&#xff0c;PDF文件因其易于阅读和不易修改的特性&#xff0c;成为了广泛使用的文件格式。然而&#xff0c;出于安全性或版权保护的考虑&#xff0c;有时候我们不希望他人将PDF文件转换为其他格式。下面一起来看看禁止PDF转换格式的方法&#xff01; 我们只需要通过P…

152-钓鱼篇邮件钓鱼Ewomail系统网页克隆劫持用户后门上线

承接上节课没讲完的邮件钓鱼和全部的网页钓鱼 #知识点&#xff1a; 1、红队技能-网络钓鱼-邮件系统 2、邮件钓鱼-平台-Gophish&Swaks 3、邮件钓鱼-系统-smtp2go&SendCloud 4、邮件钓鱼-自定义-Ewomail&Postfix 5、网页钓鱼-克隆修改-劫持口令&下载后门 这…

【Linux】ICMP

一、ICMP协议 ICMP协议是一个网络层协议&#xff0c;基于IP协议&#xff1b;一个新搭建好的网络&#xff0c;往往需要先进行一个简单的测试&#xff0c;来验证网络是否通畅&#xff1b;但是IP协议并不提供可靠传输。如果进行丢包了&#xff0c;IP协议并不能通知传输层是否丢包以…

专访阿里云:AI 时代服务器操作系统洗牌在即,生态合作重构未来

编者按&#xff1a;近日&#xff0c;2024 龙蜥操作系统大会已于北京圆满举办。大会期间&#xff0c;CSDN 采访了阿里云基础软件部资深技术总监、龙蜥社区技术委员会主席杨勇&#xff0c;前瞻性宏观解读面向 AI 智算时代&#xff0c;服务器操作系统面临的挑战与机遇。以下为采访…

Java 语法基础

计算机存储规则 text 文本 : 数字、字母、汉字imagesound声音计算机中,任意数据都是以二进制的形式存储的 汉字存储: 计算机的存储规则 1. GB2312编码: 1981年5月1日发布的简体中文汉字编码国家标准。收录7445个图形字符,其中包括6763个汉字。 2. B1G5编码:台湾地区繁体…

基于SpringBoot+Vue的考务报名平台(带1w+文档)

基于SpringBootVue的考务报名平台(带1w文档) 基于SpringBootVue的考务报名平台(带1w文档) 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进…

CesiumJS+SuperMap3D.js混用实现可视域分析 S3M图层加载 裁剪区域绘制

版本简介&#xff1a; cesium&#xff1a;1.99&#xff1b;Supermap3D&#xff1a;SuperMap iClient JavaScript 11i(2023)&#xff1b; 官方下载文档链家&#xff1a;SuperMap技术资源中心|为您提供全面的在线技术服务 示例参考&#xff1a;support.supermap.com.cn:8090/w…

切换淘宝最新镜像源npm详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 在中国大陆&#xff0c;npm&#xff08;Node Package Manager&#xff09;的默认源由于网络限制&#xff0c;速度可能较慢。为了解决这个问题&#xff0c;淘宝提供了一个镜像源&#xff0c;它同步了 npm 的…

电商API接口安全:警惕常见漏洞,筑牢数据防线

在电子商务的蓬勃发展中&#xff0c;API接口扮演着至关重要的角色&#xff0c;它们使得数据交换和业务流程自动化成为可能。然而&#xff0c;随着API的广泛应用&#xff0c;安全问题也日益凸显。本文将探讨电商API接口中常见的安全漏洞&#xff0c;并提供有效的防范措施。 一、…

第158天:安全开发-Python-Socket编程反弹Shell分离免杀端口探针域名爆破

前置知识 使用 socket 模块 1. 导入模块 首先&#xff0c;你需要导入 Python 的 socket 模块。 import socket 2. 创建套接字 使用 socket.socket() 函数创建一个新的套接字。这个函数可以接收两个参数&#xff1a;地址族和套接字类型。 地址族&#xff08;Address Family&…

大厂硬件梦:字节、腾讯“向首”,华为、小米“向手”

涉足可穿戴设备的大厂们&#xff0c;都抱着再造用户入口的野望&#xff0c;大模型治不好的痼疾&#xff0c;仍需继续前行寻找解药。 转载&#xff1a;科技新知 原创 作者丨茯神 编辑丨蕨影 苹果发布会再次令网友失望&#xff01;相比iPhone新机配色丑上热搜&#xff0c;反而苹…

《PostMan(一):配置全局令牌》

文章目录 一、配置全局token1、设置2、添加全局3、添加全局变量名称4、选中全局&#xff0c;并查看5、添加赋值脚本6、配置令牌取值7、即可成功获取用户信息 一、配置全局token 1、设置 2、添加全局 3、添加全局变量名称 4、选中全局&#xff0c;并查看 5、添加赋值脚本 // 把…

2024年智能船舶与机电系统国际学术会议(ICISES 2024)

2024年智能船舶与机电系统国际学术会议&#xff08;ICISES 2024&#xff09;初定于2024年12月27-29日在中国广州举行。会议主要围智能船舶与机电系统等研究领域展开讨论。会议旨在为从事相关研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术&#xf…

门磁模块详解(防盗感应开关 STM32)

目录 一、介绍 二、程序设计 main.c文件 gate_guard.h文件 gate_guard.c文件 三、实验效果 四、资料获取 项目分享 一、介绍 MC-38常闭式门磁开关是作为IO开关输入数字信号的&#xff0c;原理是合在一起信号是导通的 , 配合有线主机使用 不能单独使用。适用于非铁质&a…