[3D地图-CesiumJS系列] 一、快速上手

今天要来介绍3D地图的一个API,CesiumJS
CesiumJS为一个开源JavaScript函式库,
在2011年由一群资料视觉化的团队开发,
并致力於Web的3D地图呈现,相较於ArcGIS,
Cesium具有较轻量的优势,所需记忆体空间较少,速度较快,
并支援WebGL,在行动装置上不需安装外挂应用程序。
其缺点为相关文件较少,功能不如ArcGIS完整。

专案建置

下载CesiumJS程序包
https://ithelp.ithome.com.tw/upload/images/20201012/20130604R6lfLTXsG2.jpg
解压缩後放在专案资料夹中。

↓ 打开package.json,观察dependencies,内有纪录依赖的函式库
https://ithelp.ithome.com.tw/upload/images/20201012/20130604HZtkSNqjXT.jpg
下载下来的档案为CesiumJS的一个node.js server,并没有包含外部函式库,要依靠package.json来安装外部函式库。

↓ 打开VSCode Terminal 移动至该专案路径

cd .\node_modules\cesium\

↓ npm藉由package.json安装函式库

npm install

↓ package.json,找建置的指令
https://ithelp.ithome.com.tw/upload/images/20201012/201306045ETb5hiOrQ.jpg

↓ 打开node.js server

npm run start

↓ 成功
https://ithelp.ithome.com.tw/upload/images/20201012/20130604fFUjNd9Fqe.jpg

↓ 开启8080 port页面
https://ithelp.ithome.com.tw/upload/images/20201012/20130604u3RqewEmJJ.jpg
看到这个画面就代表成功啦!!

初始化3D地图

在根目录下建立一个html页面,取名为Cesium.html,或者修改原本的index.html也可以。

↓ 建立一个存放地图的div

<div id="cmap"></div>

↓ 引入Cesium.js

    <script src="../Build/Cesium/Cesium.js"></script>

↓ 引入css

    <link rel="stylesheet" href="../Build/Cesium/Widgets/widgets.css" />

↓ css让地图满版

    <style>
        html,
        body,
        #cmap {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }
    </style>

↓ 初始化地图,新建一个Cesium.Viewer的物件,第一个参数存放地图的容器Id,第二个参数为设定(选填)。

        const viewer = new Cesium.Viewer('cmap');

↓ 结果
https://ithelp.ithome.com.tw/upload/images/20201012/20130604MOTaSuXTCX.jpg

地图功能介绍

↓ 搜寻列
图片

↓ 回到起始中心点
图片

↓ 投影
图片

↓ 底图切换
图片

点线面

↓ 在地图上新增物件,使用 [地图物件].entities.add()

        let point = viewer.entities.add({
            position: Cesium.Cartesian3.fromDegrees(121, 23.5),
            point: {
                pixelSize: 10,
                color: Cesium.Color.YELLOW,
            },
        });

点资料属性

  • position: 座标位置,使用Cesium.Cartesian3.fromDegrees设定座标,并填入经度及纬度。
  • point: 标记点的设定。

↓ 结果
https://ithelp.ithome.com.tw/upload/images/20201012/201306043AfLKntkK8.jpg

  • 线

↓ 新增线资料polyline

        let line = viewer.entities.add({
            name: "line",
            polyline: {
                positions: Cesium.Cartesian3.fromDegreesArray([121.523333, 25.15, 120.3508, 23]),
                width: 5,  // 线宽度
                material: Cesium.Color.RED,  // 红色
                clampToGround: true,  // 虚线
            },
        });

相较於点不同的地方,这边的positions放在polyline里面,是一组阵列座标组,经度、纬度依序排放。

↓ 也可以使用fromDegreesArrayHeights来设定z座标,让线段具备高低落差。

        let lineHeight = viewer.entities.add({
            name: "lineHeight",
            polyline: {
                positions: Cesium.Cartesian3.fromDegreesArrayHeights([121.523333, 25.15, 3000, 120.3508, 23, 12000]),
                width: 5,  // 线宽度
                material: new Cesium.PolylineOutlineMaterialProperty({
                    color: Cesium.Color.ORANGE,  // 橘色
                    outlineWidth: 2,  // 线外框宽度
                    outlineColor: Cesium.Color.BLACK,  // 线外框颜色
                }),
            },
        });

↓ 结果
https://ithelp.ithome.com.tw/upload/images/20201012/20130604WqtCXD7UVh.jpg

↓ 剖面图
https://ithelp.ithome.com.tw/upload/images/20201012/20130604W2vwgmgrRX.jpg
可以发现橘线从12000m高空慢慢下降到3000m,逐渐贴近红线。

↓ 面图徵与线的呼叫方式大同小异

        let polygon = viewer.entities.add({
            name: "polygon",
            polygon: {
                hierarchy: Cesium.Cartesian3.fromDegreesArray([
                    120.6, 22.8,
                    120.7, 22.6,
                    120.5, 22.5,
                ]),
                material: Cesium.Color.RED,
            },
        });

↓ 还可以让每个点具备延伸高度,让面图徵变成柱状型

        let polygon3D = viewer.entities.add({
            name: "polygon3D",
            polygon: {
                hierarchy: Cesium.Cartesian3.fromDegreesArray([
                    121, 23.5,
                    121.5, 23.5,
                    121.2, 23,
                ]),
                extrudedHeight: 5000,  // 拉伸高度(m)
                material: Cesium.Color.GREEN,  // 绿色
                closeTop: false,  // 顶部是否密合
                closeBottom: false,  // 底部是否密合
            },
        });

有拉伸高度的面图徵,可以想像只要把建筑物的棱角及高度记录下来,即可把建筑物的外框描绘出来。

↓ 结果
https://ithelp.ithome.com.tw/upload/images/20201012/20130604Bqrm1T5ADg.jpg

↓ 点击面图徵会聚焦
https://ithelp.ithome.com.tw/upload/images/20201012/201306049DkLjhUw1R.jpg

↓ 资讯视窗会显示name属性
https://ithelp.ithome.com.tw/upload/images/20201012/20130604S8TTsOR4Ko.jpg


今天简单介绍了CesiumJS的特色、操作、初始专案建置的方式,及点线面图徵,
那麽3D地图究竟还能给予我们什麽样的视觉体验呢?

不知道大家有没有坐过飞机的体验?
在飞航时座位前的萤幕都会显示起讫点、飞行高度、飞行轨迹,
而且那个飞航示意图总是3D的方式呈现的,并且飞机起降时还有动画呢!
明天就要来介绍,如何使用CesiumJS做出飞航路线图。
飞机控们不要错过罗!/images/emoticon/emoticon15.gif


<<:  Day 27 |> Elixir 并行性 (一)

>>:  Day [27] Azure 认知服务-Custom Vision

开发环境

基本的开发环境要求为一台效能足够的电脑,可以是PC也可以是笔电,但依目前Google 的要求,至少要...

新零售行销模式案例,全通路时代来临该如何布局

新零售行销模式案例,全通路时代来临该如何布局,一直以来都在担任辅导顾问为中小企业解决网路行销问题但都...

[DAY 14] 轮回故事里的那些因果 : RNN 简介

前言 这一场 LOL 的掉排位来自於之前自己已经雷了千万场 ---阿峻20190928 在资料的世界...

Day 29 - 到客户端执行弱点扫瞄并修复的心得分享 第十六天

由於客户长官要求要连同低风险弱点也要一起修补,所以时间会再拉长1~2天 不过也还来得及在期限内将这个...

用 Line LIFF APP 实现信箱验证绑定功能(2) - 使用 Vite 快速打造输入页面

昨天提到,LIFF APP 有可能因为使用者没有绑定 email,或是不授权 email 使用导致无...