【超图】SuperMap iClient3D for WebGL/WebGPU ——地形影像

news2024/11/25 4:24:09

作者:taco

        号外!号外!开新坑了!开新坑了!对于一个代码小白来讲,设置可能是刚接触开发的人(还没接触准备接触)的人来说。对于读代码或是在对产品的使用上会存在许许多多的疑惑。接下来的话准备开个新坑,帮大家了解超图官方示例中不同功能的数据是如何制作的。每一句代码都是什么意思。方便大家更好的入门。更好的开发。


        本系列博客从示例代码直接入手,关于环境配置,下载等内容。可以参考以前的博客——新产品使用指南中环境配置相关部分。https://mcaitaco.blog.csdn.net/article/details/125131936icon-default.png?t=N7T8https://mcaitaco.blog.csdn.net/article/details/125131936?spm=1001.2014.3001.5502

    好的我们直接开始正题啦!

     一、地形影像

  示例代码:http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#terrainAndImageryicon-default.png?t=N7T8http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#terrainAndImagery

        1、引用部分

        由于是新开的坑,我们优先介绍一些主要的引用,后面的文章中如果有新增的库我们继续介绍。如果重复的我会指引到这篇文章。

    <link href="../../Build/SuperMap3D/Widgets/widgets.css" rel="stylesheet">
    <link href="./css/pretty.css" rel="stylesheet">
    <script src="./js/jquery.min.js"></script>
     <script src="./js/spectrum.js"></script>
    <script type="text/javascript" src="../../Build/SuperMap3D/SuperMap3D.js"></script>
    <script src="./js/config.js"></script>

1.widgets.css

         在widgets.css文件中链接了很多其他的样式文件,这些文件包含了场景中的按钮、动画、信息框、时间轴等等控件的样式,当然也包含Viewer的样式信息。

        这里只说明一点,如果你场景出现了下图这种情况。则需要注意一下该css是否引用成功。很不幸的如果没引用成功他在屏幕中的占比会很小。

        关于这个样式内容都包含哪些内容,如果大家感兴趣的话后面单开一篇文章来做详细介绍。感兴趣的话可以点赞、收藏加评论哦~

2.pretty.css

         在pretty.css中记录了关于窗口中元素的样式,包含toolbar工具箱的样式、drawCur鼠标的样式等等。

         在实际的项目中,没必要非得引用该库文件,可以根据自行需要的样式进行设置。当然如果为了省事的话也可以使用该文件。引用中如果缺少了它的话。场景中的按钮样式则会丢失掉。变成默认摆放(见下图)

3.jquery.min.js

        jquery.min.js是由完整版的jQuery库经过压缩得来,功能与原始一致。jQuery封装了JavaScript常用的功能代码,优化了DOM操作、事件处理、动画设计和Ajax交互。当然如果项目中使用了其他版本的jQuery库,可以直接替换掉。主要内容都是一致的。具体api相关接口,可以在jQuery官网中查看。

jQueryjQuery: The Write Less, Do More, JavaScript Libraryicon-default.png?t=N7T8https://jquery.com/

4.spectrum.js

         由于该示例中需要更改设置的颜色透明,此时需要设置颜色表。这里直接调用了一个颜色表工具库即(spectrum.js)。

 5.SuperMap3D.js

         SuperMap3D.js是主要的库文件,基于 WebGL 技术实现的三维客户端开发平台,不依赖开源框架,可用于构建无插件、跨操作系统、 跨浏览器的三维 GIS 应用程序,可访问SuperMap iServer发布的多种服务、 实现了三维场景可视化浏览、交互操作和地理信息管理等功能。

        说白了就是其他你不引用都没问题。这个引用不对或者不引用的话。你球是出不来的。如下图所示。

6.config.js

        会有很多入手的小白迷惑一个问题。我看你代码里面也没有URL啊,这些URL到底是放到哪里的嘞。其实都在这个config文件中的。我们在config.js中可以看到每一个示例所引用到的服务地址。后续如果示例中有不清楚的可以直接从这里获取的哦~

2、代码部分

        上面讲完了具体的引用部分,我们接下来讲解一些接口的使用部分。我们逐行分析这些代码都干了啥,为什么这个干?这么干的目的是什么。以及相关的内容操作部分。

        2.1 引擎的使用

 var EngineType = getEngineType();

        getEngineType中的方法通过config.js中的getEngineType获取引擎类型,用于设置整个环境的启动方式。我们来看下config中的内容。可以发现如果我们没有拿到EngineTypelocalStorage的话会返回2,也就是相当于以webgl2.0去启动。如果我们拿到了EngineTypelocalStorage,则以该数值去启动。如果返回为2,则使用webgl2.0,如果返回为3则以webgpu去启动。

var EngineType = 0;

function getEngineType(){
    var type = getType();
    return type;
}

function getType(){
    var EngineTypelocalStorage = localStorage.getItem("EngineType");
    if(EngineType === 0 && EngineTypelocalStorage){
        return EngineTypelocalStorage;
    }else if(EngineType === 2 || EngineType === 3){
        return EngineType;
    }else if(EngineTypelocalStorage == null || !EngineTypelocalStorage){
        return 2;
    }else{
        return EngineTypelocalStorage;
    }
}

        不过此时会有个疑问?getItem是在那里存入的呢?又是存储在哪里的呢?我们打开浏览器调试工具,可以在应用下看到本地存储空间内是已经进行存储了的。

        而此处的存入则是在另一个页面内进行存入的。我们在示例主页可以看到示例运行引擎如下图所示。我们进而找到他的代码页面。可以发现在这里是直接set进入了浏览器的本地缓存中的。所以在运行示例的时候能直接读到。

        那如果不set或者get的话能否直接参数设置好呢?答案当然是可以的。我们直接在初始化场景时把number传入即可。

   var viewer = new SuperMap3D.Viewer('Container', {
        contextOptions: {
            contextType: Number(EngineType), // Webgl2:2 ; WebGPU:3
        }
    });

        2.2 初始化添加地形

        我们找到初始化场景代码部分可以看到,这里直接添加了地形数据。使用的接口为SuperMapTerrainProvider

    var viewer = new SuperMap3D.Viewer('Container', {
        //创建地形服务提供者的实例,url为SuperMap iServer发布的TIN地形服务
        terrainProvider: new SuperMap3D.SuperMapTerrainProvider({
            url: URL_CONFIG.SiChuan_TERRAIN,
            isSct: true,//地形服务源自SuperMap iServer发布时需设置isSct为true
            invisibility: true
        })
    });

        这里就是很多新人遇到的第一个问题,url怎么填写?其实对于一个经验老道的前端人来说你直接打印一下就知道了。但是很多刚上手的人来说我不想学那么多就直接想干,或者学完忘记的人来说确实有些困难了。这里我们输出下地址去访问。

 

        地址链接:

SuperMap iServer REST APIicon-default.png?t=N7T8http://www.supermapol.com/realspace/services/3D-dixingyingxiang/rest/realspace/datas/DatasetDEM

        我们可以看到链接是在Datas目录下面的,这里也就相当于我场景中的地形图层。所以直接索引到这里即可。而如何处理一份地形数据到发布服务可以参考下面这篇文章的内容(SuperMap GIS的TIN地形数据处理Q&A_tin数据-CSDN博客)

        这里在介绍一些其他的参数信息

2.2.1 proxy:服务代理

        会有一些服务存在代理信息。如果存在代理信息可以在这里进行填写。不过通常这里是没有的

requestVertexNormals:请求法线

        当场景中需要对地形数据进行分析的时候,如坡度坡向,地形阴影显示的时候我们需要设置requestVertexNormals:true去请求法线,否则分析将没有结果。于此同时需要注意的点在于地形缓存在idesktop中处理时需要设置法线。否则同样请求不回来的哦

2.2.2 requestWaterMask:水面特效

        当地形高度小于海平面的情况下开启水面效果才有效的。

2.2.3 ellipsoid:椭球体

        在webgpu的产品中默认读取的椭球体是真实的椭球。长短半轴的值分别为【6378137.06378137.06356752.3142451793】。

如若想要更改可以使用下方代码进行更改,不过非特殊情况并不建议修改该参数的值

var obj = [6378137.0, 6378137.0, 6356752.3142451793];
SuperMap3D.Ellipsoid.WGS84 = Object.freeze(new SuperMap3D.Ellipsoid(obj[0], obj[1], obj[2]));
 2.2.4 credit:描述信息

        这里我们可以将一些地形的描述信息写入进去,不过实际应用的花确实还没有想到有什么具体的应用可能我们并不需要地形里面的描述信息。

credit:"这里是描述信息"

credit:new Cesium.Credit("这里是描述信息")
 2.2.5 isSct:是否为iServer发布的TIN地形服务

        其实很好理解的是,在iDesktop中处理的TIN缓存配置文件是*.sct的格式。所以这里区分iServer发布的服务还是调用的第三方服务都是以是否为sct进行区分的。

isSct: true,//地形服务源自SuperMap iServer发布时需设置isSct为true
2.2.6 isShowGlobe:是否剔除无效地形区域

        该方法会去除掉TIN地形范围外的地表区域。具体效果可参考下图。该方法建议与去除裙边效果同时使用,否则在去除后会出现方格样式的裙边。

//去除地形范围外数据 
isShowGlobe:false,

//去除裙边
 scene.globe.showSkirts =false;
 2.2.7 invisibility 是否开启设置地形显隐的功能

         当开启该方法后才可以使用visible方法控制地形的显隐。否则不能进行控制。

invisibility: true //开启地形显隐控制

viewer.terrainProvider.visible = true; //地形显示

viewer.terrainProvider.visible = false; //地形隐藏

 2.3 其他添加地形的方法

        如果我们在初始化的时候并没有添加上地形,想要中途通过按钮添加地形数据应该如何操作呢?

        可以重新new一个新的SuperMapTerrainProvider再赋予至viewer的地形上面即可。

var terrainProvider = new SuperMap3D.SuperMapTerrainProvider({
					url: URL_CONFIG.SiChuan_TERRAIN,
					isSct: true, //地形服务源自SuperMap iServer发布时需设置isSct为true
					invisibility: true
				})
viewer.terrainProvider = terrainProvider

        添加地形代码太过复杂了!我就不能直接打开场景,场景里带地形影像就不行的么?其实也可以,如果是iserver发布的服务。其实我们可以直接使用scene.open直接打开地形场景的。

viewer.scene.open("http://www.supermapol.com/realspace/services/3D-dixingyingxiang/rest/realspace")

        而该链接地址并非到datas下面的具体数据集(图层名),而是到realspace的场景下既能将完整的地形数据加载出来。

        2.4 resolutionScale

     viewer.resolutionScale = window.devicePixelRatio;

        设置渲染分辨率的缩放因子。 值小于1.0时能够在不太强大的设备上提高性能;相反,值大于1.0时将会以更高分辨率渲染,然后按比例缩小,以此提高视觉保真度。 例如窗口部件以640x480的大小布设,将此属性设置为0.5,将导致场景以320x240分辨率渲染,场景按比例放大,而将其设置为2.0将导致场景以1280x960渲染,场景按比例缩小。

        我们这里直接获取了window下的devicePixelRatio。若不是大屏或分辨率过高的屏幕暂不需要调整该参数。

        2.5 添加影像

        这里添加影像的部分我们简单介绍一下。后面会做一个影像专题专门来介绍影像部分的添加(点赞收藏越快制作的越快

使用方法SuperMapImageryProvider 该方法可以加载超图iServer发布的rest地图服务,也可以加载三维服务中的影像图层,在示例中使用的是三维服务中的影像服务。服务地址为(SuperMap iServer REST API)

 var layer = viewer.imageryLayers.addImageryProvider(new SuperMap3D.SuperMapImageryProvider({
        url : URL_CONFIG.SiChuan_IMG
    }));

        2.6 camera

        相机定位类,与影像一样后面将推出Camera专题来介绍相机类有哪些功能。当前代码中内容进行简单介绍。

viewer.scene.camera.setView({
        destination : new SuperMap3D.Cartesian3(-1206939.1925299785, 5337998.241228442, 3286279.2424502545),
        orientation : {
            heading : 1.4059101895600987,
            pitch : -0.20917672793046682,
            roll : 2.708944180085382e-13
        }
    });

        camera.setView方法可以实现加载完成后直接定位至相机设置位置。 destination为最终相机所在位置值。 new SuperMap3D.Cartesian3()中传入的为笛卡尔坐标系下的相机位置,如果想要传入经纬度可以设置为SuperMap3D.Cartesian3.fromDegrees()

 destination : new SuperMap3D.Cartesian3.fromDegrees(116, 42, 32),

         orientation中参数为当前相机的方向,分别由heading\pitch\roll 三个旋转角度组成。

        2.7 LightSource

viewer.scene.lightSource.ambientLightColor = new SuperMap3D.Color(0.65, 0.65, 0.65, 1);

        LightSource类为场景光源类,可以对当前场景的光照进行配置。在地形影像示例中默认添加了一个环境光,用于提高环境亮度。同时使场景变得更加美观。

        2.8 knockout

         SuperMap3D.knockout可以使球体监听到html的一些控件,用来动态的修改场景中的一些属性值。当然我们也可以直接使用对dom操作对属性值进行修改。

        1) 创建viewModel

                viewModel中配置初始的默认值,与dom中data-bind的value值内容对应。

var viewModel = {
        color : '#ffffff',
        tolerance : 0
    };


<label>颜色透明</label>
<input class="colorPicker" size="8" data-bind="value: color,valueUpdate: 'input'" id="colorPicker">>
<label>颜色透明容限</label>
<input type="range" min="0" max="1" step="0.02" data-bind="value: tolerance,valueUpdate: 'input'" id="tolerance" style="display: block;width:200px;margin: 5px 0">

           2) track监听属性修改

        通过knockout.track方法对参数进行监听。

 SuperMap3D.knockout.track(viewModel);

        3) 激活与绑定

        激活属性并将viewModel与html中的控件进行绑定。

 var toolbar = document.getElementById('toolbar');
 SuperMap3D.knockout.applyBindings(viewModel, toolbar);

        4) 值变化赋予新值

        当监听的tolerance值发生变化后,knockout将返回新的值传入。

SuperMap3D.knockout.getObservable(viewModel,'tolerance').subscribe(
        function(newValue) {
            layer.transparentBackColorTolerance = newValue;
        }
    );

        2.9 影像指定颜色透明(去除影像黑边)

        使用transparentBackColor设置需要过滤的颜色值(关于颜色值如何设置可以参考下面文章https://mcaitaco.blog.csdn.net/article/details/134977611)

        使用transparentBackColorTolerance来设置过滤的阈值,取值区间在0-1范围内,数值越大该颜色过滤的越多。

var color = new SuperMap3D.Color();
imageryLayer.transparentBackColor = color;
imageryLayer.transparentBackColorTolerance = 0.5;

        如果遇到前端影像需要去除黑边或白边通常使用该方法。

imageLayer.transparentBackColor= Cesium.Color.fromCssColorString('#ffffff');
imageLayer.transparentBackColorTolerance = Number(0.1);

        如果担心前端过滤的性能问题可以从原始数据入手。可参考下方博客内容(SuperMap iDesktop 提取影像边界裁剪去除无值区域处理方案_supermap提取栅格边界-CSDN博客)经验测试来看前端设置并不会消耗过多性能、但如果图层过多的话设置起来还是有些费劲的。

        2.10 地形显隐

        地形图层可以通过设置其visible来控制其显示与隐藏。

viewer.terrainProvider.visible = true;
//地形显示

viewer.terrainProvider.visible = false;
//地形隐藏

        这样我们对产品中地形影像中代码的解读就完成了。欢迎大家来讨论其中的使用问题。

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

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

相关文章

Mybatis基本操作

目录 准备工作 删除操作 预编译SQL 增加操作 获取返回的主键 更新操作 准备工作 准备数据库表 emp创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&#xff09;application.properties中引入数据库连接信息创建对应…

HTML+CSS做一个冰立方体时钟

文章目录 💕效果展示💕代码展示HTMLJS💕效果展示 💕代码展示 HTML <!DOCTYPE html> <html lang

Python简介:一种强大的编程语言

Python是一种高级、通用的编程语言&#xff0c;以其简洁易读的语法和强大的功能而闻名。它广泛应用于各种领域&#xff0c;包括软件开发、数据分析、人工智能等。本文将详细介绍Python的特点、应用领域以及如何开始学习Python。 &#xfeff; &#xfeff;一、Python的特点 1…

vue2 el-table 行按钮过多,按钮超出指定个数,显示为下拉菜单(简单的自定义组件)01

vue2 el-table 行按钮过多&#xff0c;按钮超出指定个数&#xff0c;显示为下拉菜单&#xff08;简单的自定义组件01&#xff09; 上图 优化前 按钮太多不美观 优化后 默认展示三个按钮 超出显示下拉菜单 上代码 封装按钮组件 OperateBtn.vue // OperateBtn.vue<templ…

mysql中的事务和索引

1. 索引 索引&#xff1a;index&#xff08;下标&#xff09;->目录 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c; 并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 1.1 索引的作用 MyS…

MVVM响应式

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介MVVM响应式1. 什么是MVVM模式?2. Vue中的响应式数据3. 数据绑定与视图更新⭐ 写在最后⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习…

SWUST-会理财的小明

一波操作之后我发现我在乱写&#xff0c;发现原来利息是这样算的 然后我一波操作之后发现也不是这样算的。原来利息是这样算的 原来是幂运算&#xff01; 什么东西。。。 原来总金额就是本金*&#xff08;1利率&#xff09;^年限。利息就是总金额-本金&#xff01;&#xff01…

一款DC-DC控制器应用方案

一、General Description The TX5121 is a step-up DC/DC converter specifically designed to drive up to 6 series white LEDs with constant current. Series connection of the LEDs provides identical LED currents resulting in uniform brightness and eliminates th…

要使自己用C++制作的游戏可以多人在不同电脑上对战要学什么?

要使自己用C制作的游戏可以多人在不同电脑上对战要学什么&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享…

揭秘 Go 中 Goroutines 轻量级并发

理解 Goroutines、它们的效率以及同步挑战 并发是现代软件开发的一个基本概念&#xff0c;使程序能够同时执行多个任务。在 Go 编程领域&#xff0c;理解 Goroutines 是至关重要的。本文将全面概述 Goroutines&#xff0c;它们的轻量级特性&#xff0c;如何使用 go 关键字创建…

【Mode Management】CanSM详细介绍

1. Introduction and functional overview AUTOSAR BSW栈为每个通信总线指定一个总线特定的状态管理器。CANSM实现CAN总线的数据流控制。CanSM隶属于通信服务层。CanSM和通信硬件抽象层以及系统服务层交互。 CanSM只用用于控制CAN通信。CanSM的任务就是操作CanIf模块去控制一个…

实现单链表的基本操作(力扣、牛客刷题的基础笔试题常客)

本节来学习单链表的实现。在链表的刷题中&#xff0c;单链表占主导地位&#xff0c;很多oj题都在在单链表的背景下进行&#xff1b;而且很多链表的面试题都是以单链表为背景命题。所以&#xff0c;学好单链表的基本操作很重要 目录 一.介绍单链表 1.链表及单链表 2.定义一个…

【设计模式--结构型--代理模式】

设计模式--结构型--代理模式 代理模式概述结构静态代理案例&#xff1a;卖车票jdk动态代理cglib代理三种代理对比优缺点使用场景 代理模式 概述 由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时&#xff0c;访问对象不适合或者不能直接引用目标对象&#xff0…

Java集合大家族(学习推荐版,通俗易懂)

4.集合&#xff08;ArrayList&#xff09;、其他集合框架及容器遍历方式 1.ArrayList 注意&#xff1a;索引从0开始 该集合可以添加任意类型的数据&#xff0c;要约束添加数据的类型&#xff0c;需用泛型约束&#xff08;jdk1.7开始支持泛型&#xff09; 删除遍历集合方式1&a…

卡尔曼(kalman)滤波学习测试例

下面两套代码一套是python&#xff0c;一套是matlab&#xff0c;效果是一样的。 PYTHON import numpy as np import matplotlib.pyplot as pltt np.arange(1, 1001) nsig 5 * np.sin(0.01 * t) np.random.rand(len(t)) np.random.randn(len(t)) 5 * np.cos(0.05 * t np.…

mac电脑m1 arm架构安装虚拟机教程

1、准备一台虚拟机&#xff0c;安装CentOS7 常用的虚拟化软件有两种&#xff1a; VirtualBoxVMware 这里我们使用VirtualBox来安装虚拟机&#xff0c;下载地址&#xff1a;Downloads – Oracle VM VirtualBox 001 点击安装 002 报错&#xff1a;he installer has detected an…

js禁止打开控制台,如何强行打开控制台?

当我在查看某个网站的源码时&#xff0c;按F12会跳转到百度页面&#xff0c;或者先打开F12再输入网站也会进入到百度首页。 首先我们要关闭控制台进入到这个网站的首页&#xff0c;然后右键查 看网站的源码。 1.找到这个js文件&#xff0c;点进去。 2.点击这个js文件之后&a…

sensitive-word 敏感词之 DFA 双数组实现源码学习

拓展阅读 敏感词工具实现思路 DFA 算法讲解 敏感词库优化流程 java 如何实现开箱即用的敏感词控台服务&#xff1f; 各大平台连敏感词库都没有的吗&#xff1f; v0.10.0-脏词分类标签初步支持 v0.11.0-敏感词新特性&#xff1a;忽略无意义的字符&#xff0c;词标签字典 …

SpringSecurity深度解析与实践(2)

目录 引言1.Springboot结合SpringSecurity用户认证流程1.1 配置pom文件1.2.配置application.yml 2.自定义MD5加密3.BCryptPasswordEncoder密码编码器4.RememberMe记住我的实现5.CSRF防御5.1.什么是CSRF 引言 上篇网址 1.Springboot结合SpringSecurity用户认证流程 1.1 配置p…

【Date对象】js中的日期类型Date对象的使用详情

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续…