SuperMap iClient3D for Cesium等高线标注

ops/2024/12/31 23:43:35/

kele

前言

在三维地形分析中,等高线分析是一种非常重要的分析方法,它能直观的表达出地形的高低起伏特征,在三维系统中受到广泛应用。在SuperMap iClient3D for Cesium中,等高线分析是前端GPU分析,能够分析并渲染出等高线,但是无法获取高程标注,这对三维项目来说缺少一个重要的地形高度指标。那么如何实现等高线的高程数值展示呢?我们一起来看下吧

一、效果展示

在这里插入图片描述

二、实现方法

1、激活鼠标绘制类,绘制分析范围

//绘制多边形
var tooltip = createTooltip(document.body);
var polygonHandler = new Cesium.DrawHandler(viewer, Cesium.DrawMode.Polygon);
polygonHandler.activeEvt.addEventListener(function (isActive) {if (isActive == true) {viewer.enableCursorStyle = false;viewer._element.style.cursor = '';$('body').removeClass('drawCur').addClass('drawCur');} else {viewer.enableCursorStyle = true;$('body').removeClass('drawCur');}
});
polygonHandler.movingEvt.addEventListener(function (windowPosition) {tooltip.showAt(windowPosition, '<p>开始绘制分析区域,右键结束绘制</p>');
});
polygonHandler.drawEvt.addEventListener(function (polygon) {polygonHandler.polygon.show = false;polygonHandler.polyline.show = false;tooltip.setVisible(false);var array = [].concat(polygon.object.positions);let positions = [],geometries = [];for (var i = 0, len = array.length; i < len; i++) {var cartographic = Cesium.Cartographic.fromCartesian(array[i]);var longitude = Cesium.Math.toDegrees(cartographic.longitude);var latitude = Cesium.Math.toDegrees(cartographic.latitude);var h = cartographic.height;if (positions.indexOf(longitude) == -1 && positions.indexOf(latitude) == -1) {positions.push(longitude);positions.push(latitude);positions.push(h);var queryPoint = { // 查询点对象x: longitude,y: latitude};geometries.push(queryPoint)}}floodUpdate(positions);  //分层设色绘制等值线doQuery(geometries);  //根据范围进行空间分析,返回结果高程,前端绘制entity-label展示polygonHandler.deactivate();
});

2、根据绘制范围进行前端GPU分层设色,得到等高线效果

function floodUpdate(positions){//创建分层设色对象hyp = new Cesium.HypsometricSetting();//设置分层设色的显示模式为线hyp.DisplayMode = Cesium.HypsometricSettingEnum.DisplayMode.LINE;//设置线颜色为红色hyp._lineColor = new Cesium.Color(1.0, 0.0, 0.0, 1.0);//等高线间隔为100mhyp.LineInterval = 100.0;//设置分层设色的最大/最小可见高度hyp.MaxVisibleValue = 9000;hyp.MinVisibleValue = 0;//设置分层设色颜色表的最大/最小key值,表示在此高度范围内显示颜色表hyp.ColorTableMinKey = 2736.88110351563;hyp.ColorTableMaxKey = 5597.06640625;//新建颜色表var colorTable = new Cesium.ColorTable();colorTable.insert(4262.3132649739609,new Cesium.Color(102/255, 255/255, 153/255));//设置分层设色的颜色表hyp.ColorTable = colorTable;//设置分层设色的透明度hyp.Opacity = 0.4;hyp.CoverageArea = positions;hyp.DisplayMode = Cesium.HypsometricSettingEnum.DisplayMode.LINE; //以等值线方式展示viewer.scene.globe.HypsometricSetting = {hypsometricSetting : hyp,analysisMode : Cesium.HypsometricSettingEnum.AnalysisRegionMode.ARM_REGION //自定义分析范围};
}

3、使用SuperMap iServer将dem数据集发布为空间分析服务,根据绘制范围进行数据集的等高线分析。需要注意的是,SuperMap iServer等高线分析的分析间距需要和第二步中分层设色等高线间隔保持一致

function doQuery(geometries) {var queryObj = {"extractParameter":{"datumValue":0,"interval":100, //等高线见距"resampleTolerance":0.7,"smoothMethod":"BSPLINE","smoothness":3,"clipRegion":{"points":geometries, //分析范围"type":"REGION"}},"resultSetting":{"dataset":"","dataReturnMode":"RECORDSET_ONLY","expectCount":100,"deleteExistResultDataset":true}};var queryData = JSON.stringify(queryObj); // 转化为JSON字符串作为查询参数$.ajax({type: "post",url: "http://localhost:8090/iserver/services/spatialAnalysis-DengGaoXian/restjsr/spatialanalyst/datasets/BeijingTerrain@BeijingTerrain/isoline.rjson?returnContent=true",data: queryData,success: function (result) {},error: function (msg) {console.log(msg);},})
}

4、分析结果中包含等高线节点以及对应的高度,由于以上步骤已经通过GPU分层设色实现了等高线的渲染,这里只需添加高度标注即可。
在标注过程中有这样一个困扰,分析结果等值线可能为复合对象并且有很多节点,高程标注放在哪个节点位置合适呢?小编的做法是将复合等值线对象进行拆分为简单对象,在每个简单对象的第一个节点上进行标注,以下是实现代码

var resultObj = JSON.parse(result);
let features = resultObj.recordset.features;
for(let fea of features){let num = fea.geometry.parts.length;  //parts长度表示子对象数量,parts内容表示每个子对象的节点数量for(let i=0;i<num;i++){let index = 0;if(i === 0){index = 0}else{index = fea.geometry.parts[i-1];}viewer.entities.add({position: new Cesium.Cartesian3.fromDegrees(fea.geometry.points[index].x,fea.geometry.points[index].y,Number(fea.fieldValues[5])),label:{text: fea.fieldValues[5],fillColor: Cesium.Color.ORANGE,scaleByDistance: new Cesium.NearFarScalar(1000, 1, 100000, 0.1)}})}
}

http://www.ppmy.cn/ops/145981.html

相关文章

如何使用流式渲染技术提升用户体验

提示:记录工作中遇到的需求及解决办法 文章目录 什么是流式渲染?Node.js 实现简单流式渲染声明式 Shadow DOM,不依赖 javascript 实现react 实现流式渲染总结提示:以下是本篇文章正文内容,下面案例可供参考 什么是流式渲染? 流式渲染主要思想是将HTML文档分块(chunk)…

更改 pnpm 的全局存储位置

pnpm 的全局存储位置可以通过配置来改变&#xff0c;默认情况下&#xff0c;pnpm 会将全局存储位置设置在系统盘的 AppData\Local\pnpm 目录下&#xff08;在 Windows 系统上&#xff09;。但是&#xff0c;用户可以通过配置来更改这个位置。以下是如何查看和设置 pnpm 的全局存…

计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Kubernetes对象-标签和选择器

Kubernetes对象-标签和选择器 Kubernetes对象标签和选择器动机语法和字符集标签选择器基于等值的需求基于集合的需求 APILIST 和 WATCH 过滤在 API 对象中设置引用Service and ReplicationController支持基于集合的需求的资源选择节点集 高效使用标签更新标签 链接 Kubernetes对…

PaddlePaddle飞桨Linux系统Docker版安装

PaddlePaddle飞桨Linux系统Docker版安装 最近学习和了解PP飞桨&#xff0c;一切从安装开始。官网的安装教程很详细&#xff1a; https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/docker/linux-docker.html 记录我在安装过程中遇到的问题…

简单发布一个npm包

将自己封装的组件上传到 npm&#xff0c;并在其他项目中下载并使用&#xff0c;是一个非常有用的技能。看完下面这些你就可以自己完成从封装组件到上传 npm 并使用的全过程。 1: 封装组件 首先&#xff0c;你需要创建一个符合标准的 npm 包。假设你已经写好了组件代码&#xf…

基于Spring Boot的工商局商家管理系统

一、系统背景与意义 随着市场经济的不断发展&#xff0c;商家数量日益增多&#xff0c;工商局对商家的管理需求也日益复杂。传统的管理方式存在诸多弊端&#xff0c;如信息不透明、管理效率低下等。因此&#xff0c;开发一种高效、便捷、智能化的工商局商家管理系统显得尤为重…

Hessian 矩阵与函数的凸性

Hessian 矩阵的定义 Hessian 矩阵是一个方形矩阵&#xff0c;用来描述多元函数的二阶偏导数信息。对于一个 n n n 维函数 f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \dots, x_n) f(x1​,x2​,…,xn​)&#xff0c;Hessian 矩阵的定义是&#xff1a; H [ ∂ 2 f ∂ x 1 2 ∂ …