最開始使用webpack進行cesium 集成, 出现了问题一大堆,最后只好选择传统的方法直接引入了,具体操作如下

一、安装cesium

首选创建一个测试项目 vue create vue-join-cesium

然后直接cd 到项目目录 ,使用npm 直接拉取cesium

	$ npm install cesium --save

安装成功后会在 node_modules 下 看见一个cesium的目录

二、使用script引用cesium

1、切换到 node_modules/cesium/Build/ 目录

2、将Cesium拷贝到项目中的 public 目录下

3、在index.html引入 js 与css

4、修改HelloWorld.vue


<template>
<div class="test-cesium">
<div id="cesiumContainer"></div>
</div>
</template> <script> export default {
data () {
return {
viewer :'',
tileset: '',
}
},
mounted (){
//103.37324413479338, 29.544684360197113
var initialLon = 103.37324413479338;
var lat = 29.544684360197113;
var height = 10.0;
// // 创建viewer实例
this.viewer = new Cesium.Viewer('cesiumContainer', {
// 需要进行可视化的数据源的集合
animation: false, // 是否显示动画控件
shouldAnimate: true,
homeButton: false, // 是否显示Home按钮
fullscreenButton: false, // 是否显示全屏按钮
baseLayerPicker: true, // 是否显示图层选择控件
geocoder: false, // 是否显示地名查找控件
timeline: false, // 是否显示时间线控件
sceneModePicker: true, // 是否显示投影方式控件
navigationHelpButton: false, // 是否显示帮助信息控件
infoBox: false, // 是否显示点击要素之后显示的信息
requestRenderMode: true, // 启用请求渲染模式
scene3DOnly: false, // 每个几何实例将只能以3D渲染以节省GPU内存
sceneMode: 3, // 初始场景模式 1 2D模式 2 2D循环模式 3 3D模式 Cesium.SceneMode
fullscreenElement: document.body, // 全屏时渲染的HTML元素 暂时没发现用处
})
// 去除版权信息
this.viewer._cesiumWidget._creditContainer.style.display = 'none'
// 将经纬度转换为世界坐标
var target = Cesium.Cartesian3.fromDegrees(initialLon, lat, height);
var offset = new Cesium.Cartesian3(-70.06, -68.64, 6.0908)
this.viewer .scene.camera.lookAt(target, offset); }
} </script>
<style>
.test-cesium{
width: 100%;
height: 100%;
}
</style>

5、修改 package.json

如果使用了eslint 会提示 Cesium 未定义,需要修改 package.json,设置no-undef

6、现在运行看看效果

三、使用webpack引入cesium

打开 vue.config.js

1、module路径声明

const cesiumSource = 'node_modules/cesium/Source';
const cesiumWorkers = '../Build/Cesium/Workers';

2、配置别名

    resolve: {
alias: {
// CesiumJS module name
cesium: path.resolve(__dirname, cesiumSource)
}
},

3、资源拷贝

    plugins: [
// Copy Cesium Assets, Widgets, and Workers to a static directory
new CopywebpackPlugin([{
from: path.join(cesiumSource, cesiumWorkers),
to: 'Workers'
}]),
new CopywebpackPlugin([{
from: path.join(cesiumSource, 'Assets'),
to: 'Assets'
}]),
new CopywebpackPlugin([{
from: path.join(cesiumSource, 'Widgets'),
to: 'Widgets'
}]),
new webpack.DefinePlugin({
// Define relative base path in cesium for loading assets
CESIUM_BASE_URL: JSON.stringify('./')
})
],

当然这一步需要安装 CopywebpackPlugin

 npm i copy-webpack-plugin -D

然后在顶部引入const CopywebpackPlugin = require('copy-webpack-plugin');

4、处理异常警告

    module: {
unknownContextCritical: /^.\/.*$/,
unknownContextCritical: false
}

最终完整内容

'use strict'
const path = require('path')
const webpack = require('webpack')
const cesiumSource = 'node_modules/cesium/Source';
const cesiumWorkers = '../Build/Cesium/Workers';
const CopywebpackPlugin = require('copy-webpack-plugin'); function resolve(dir) {
return path.join(__dirname, dir)
} module.exports = {
configureWebpack: {
resolve: {
alias: {
// CesiumJS module name
cesium: path.resolve(__dirname, cesiumSource)
}
},
plugins: [
// Copy Cesium Assets, Widgets, and Workers to a static directory
new CopywebpackPlugin([{
from: path.join(cesiumSource, cesiumWorkers),
to: 'Workers'
}]),
new CopywebpackPlugin([{
from: path.join(cesiumSource, 'Assets'),
to: 'Assets'
}]),
new CopywebpackPlugin([{
from: path.join(cesiumSource, 'Widgets'),
to: 'Widgets'
}]),
new webpack.DefinePlugin({
// Define relative base path in cesium for loading assets
CESIUM_BASE_URL: JSON.stringify('./')
})
],
module: {
unknownContextCritical: /^.\/.*$/,
unknownContextCritical: false
}
},
}

5、页面引用

最后页面使用如下

import * as Cesium from "cesium/Cesium";
import "cesium/Widgets/widgets.css"; export default{
created(){
var visual = new Cesium.Viewer('cessiumContainerId')
}
}

好了到这里使用webpack引入cesium完成,直接npm run dev 应该可以看见相同的一个地球界面了。

四、使用Geoserve 发布地图服务

1、安装geoserve

上面虽然加载cesium成功了,但是我们最终是为了加载一个本地的切片,所以还需要借助Geoserve

Geoserve官网下载 http://geoserver.org/download/

也可以到云盘下载 https://pan.baidu.com/s/1fe6ADFmML6sr3qrMztkVJQ 提取码 xl3h

然后点击 geoserver-2.3.2.exe 进行安装

安装成功后,在如下目录启动Geoserver



然后浏览器 输入http://localhost:28080/geoserver/web ,输入安装时的用户名和密码登录

有关shpe 文件的发布请参考 https://blog.csdn.net/sharetm/article/details/54931096 ,这里主要讲一下发布 arcgis 切片

将上面 云盘 下载的 geowebcache.rar 解压到 webapps目录下

2、修改配置

然后在 geowebcache 目录下创建一个 arcgis 用来缓存 arcgis相关切片

同时找到 web.xml



打开 web.xml 在 下增加如下代码


<context-param> <param-name>GEOWEBCACHE_CACHE_DIR</param-name>
<!-- 下面需 修改为自己上一步创建的真实目录 -->
<param-value>D:\develop\GeoServer 2.3.2\webapps\geowebcache\arcgis</param-value> </context-param>

然后重启 geoserver 会发现 刚才创建的 arcgis 下多了好几个文件

然后打开这 geowebcache.xml 文件 在 <layers>...</layers> 之间新增 arcgis 切片的目录如下

  <layers>
.... 省略其他的
<arcgisLayer> <name>fsRoads</name> <tilingScheme>D:\YLKJPro\testSource\leshan_ArcGis\conf.xml</tilingScheme> <tileCachePath>D:\YLKJPro\testSource\leshan_ArcGis\_alllayers</tileCachePath> <hexZoom>false</hexZoom> </arcgisLayer>
</layers>

fsRoads为服务名,GeoWebCache服务页面中可看到改名字,这里随便起的。conf.xml就是ArcGIS Server发布服务设置缓存后生成的配置文件,该目录就是瓦片所在目录,是不是很眼熟?

测试的瓦片 云盘 https://pan.baidu.com/s/1GwNcCiclaUa3a7rWiu0VLQ 提取码 6nbc

然后录入 localhost:28080/geowebcache/home 会看将如下页面



再点击 红箭头的地方, 会进入第二个页面,看如下红箭头的地方就是<name>fsRoads</name> 这里配置的



然后我们点击红框的 [png] 会进入如下的页面,这个就是我们服务发布的地址了

3、项目中调用geoserver

切记 不能直接拷贝这个网页上的url作为 cesium 调用服务的地址

如:


var layers = this.viewer.scene.imageryLayers;
let arcgis_layer = new Cesium.WebMapTileServiceImageryProvider({
url: 'http://localhost:28080/geowebcache/demo/fsRoads',
layer : 'EPSG:4326_fsRoads',
style : 'default',
tileMatrixSetID : 'fsRoads',
format : 'image/png'
});
layers.addImageryProvider(arcgis_layer);

这样不管怎么搞都访问不到滴,

其实真实的服务地址在 wmts-getcapabilities.xml 中,根据如下步骤下载 该xml文件打开,在脚底就是所需服务地址(当初因为不明白这个,自己搞了好几个小时都没对,)

根据如上图我们获得了服务地址和参数,所以将调用方法修改如下


var layers = this.viewer.scene.imageryLayers; let arcgis_layer = new Cesium.WebMapServiceImageryProvider({
url: "http://localhost:28080/geowebcache/service/wms",
layers: 'EPSG:4326_fsRoads',
parameters: {
'LAYERS': 'fsRoads',
'FORMAT': 'image/png',
'SRS': 'EPSG:4326',
'VERSION': '1.1.1'
}
}); layers.addImageryProvider(arcgis_layer);

4、实际运用

项目中实际运用出现的坑 这里结合我二次项目中使用时,在配置WebMapServiceImageryProvider参数时所遇到的问题,进行再次补充说明,当再次运用该方法加载图层是,由于对这种方式不是太理解,导致刚开始一直无法将图层成功加载,后来明白了要根据发布地址,请求的具体参数来配置

如:



根据请求headers配置参数 ,得到的方法大致如下

     var layersObj = this.viewer.scene.imageryLayers;
let arcgis_layer = new Cesium.WebMapServiceImageryProvider({
url: "http://192.168.1.253:8081/geoserver/jeethink-vue-process/wms",
layers: 'jeethink-vue-process:louqiaoDom',
parameters: {
SERVICE: 'WMS',
VERSION: '1.1.1',
REQUEST: 'GetMap',
FORMAT: 'image/jpeg',
TRANSPARENT: true,
SRS: 'EPSG:4549',
WIDTH: 768,
HEIGHT: 525,
BBOX: '446465.16772591084,3710404.2266346747,461124.6482224265,3720425.3558803396'
},
tileWidth: 768,
tileHeight: 525
}); layersObj.addImageryProvider(arcgis_layer);

尽管图层加载成功了,但是看如下界面,并不是最终想要的结果



在寻求解决之道是发现有个rectangle属性,于是在

        tileHeight: 525

下添加了一行

 rectangle: new Cesium.Rectangle.fromDegrees(119.46895155311788, 33.53363155152805, 119.54733748522395, 33.57874291923595)

然而最后结果为



出现了一个带背景的图层!

于是只有再次需求解决之法......

最后才发现是自己多加了BBOX rectangle,去掉这两个参数配置就了,最后正确方法如下

  var layersObj = this.viewer.scene.imageryLayers;
let arcgis_layer = new Cesium.WebMapServiceImageryProvider({
url: "http://192.168.1.253:8081/geoserver/jeethink-vue-process/wms",
layers: 'jeethink-vue-process:louqiaoDom',
parameters: {
SERVICE: 'WMS',
VERSION: '1.1.1',
REQUEST: 'GetMap',
FORMAT: 'image/jpeg',
TRANSPARENT: true,
SRS: 'EPSG:4326',
WIDTH: 768,
HEIGHT: 525,
// BBOX: '446465.16772591084,3710404.2266346747,461124.6482224265,3720425.3558803396',
},
tileWidth: 768,
tileHeight: 525,
//rectangle: new Cesium.Rectangle.fromDegrees(119.46895155311788, 33.53363155152805, 119.54733748522395, 33.57874291923595)
}); layersObj.addImageryProvider(arcgis_layer);

【去掉背景】 这里还有一个容易疏忽的地方---就是加载的影像有一个白色背景,当时就纠结许久,多次查阅官方文档,最后发现竟是format 配置错了,设置image/jpeg会导致transparent:true无效,而出现一个白色背景:

看这个是不带背景色的:



其实就是修改 formatimage/png即可

FORMAT: 'image/png',

五、 解决cesium加载资源不允许跨越问题

这里还需要注意 跨域 问题 ,可根据下面的操作解决跨域问题

1、将cors-filter-2.4.jarjava-property-utils-1.9.1.jar,两个jar包文件放入geoserver目录下webapps\geoserver\web-inf\lib中。

2、打开geoserver目录下webapps\geoserver\web-inf中的web.xml

3、添加过滤器代码:


<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>

4、添加过滤器路由代码:


<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

5、添加完毕后,重启geoserver

6、如果目录中存在maven,需要在pom.xml中,添加


<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>[ version ]</version>
</dependency>

cors-filter-2.4.jarjava-property-utils-1.9.1.jar下载地址 https://pan.baidu.com/s/1R-R0FuzoNd5S2m_fRi3n_g 提取码 rpoi

注意 geowebcache 也需要进行如上几步配置 如图

六、最终效果呈现



需要项目原码可以访问 https://github.com/dengxiaoning/vueCli3-join-cesium-arcgis-images

另外使用 tomcat + GeoServer War包 和 GeoWebCache War包 来发布 服务其实步骤差不多,在官网下载war 放到webapps中重新运行tomcat,然后根据如上配置步骤配置即可;也可以参考https://blog.csdn.net/lynchee/article/details/87978099

官网地址

geoserver war http://geoserver.org/release/2.14.2/

geowebcache war https://sourceforge.net/projects/geowebcache/files/geowebcache/1.16.1/



vue/cli3整合Cesium,加载离线arcgis 切片的更多相关文章

  1. vue cli3.0 首次加载优化

    项目经理要求做首页加载优化,打包后从十几兆优化到两兆多,记下来怕下次忘记 运行report脚本 可看到都加载了那些内容,在从dist文件中index.html 查看首次加载都加载了那些东西,如下图:然 ...

  2. Openlayer 3加载本地ArcGIS切片

    第一篇博客,简单的开个头吧.希望自己能坚持记录.一般什么情况什么人需要这样的需求呢,伐木的光头强大哥说我们在深山老林里,没网的啊,地图就手机本地duang的加载一下吧.那么Server啊就要丢掉丢掉. ...

  3. Cesium加载ArcGIS Server4490且orgin -400 400的切片服务

    Cesium在使用加载Cesium.ArcGisMapServerImageryProvider加载切片服务时,默认只支持wgs84的4326坐标系,不支持CGCS2000的4490坐标系. 如果是A ...

  4. 遥感影像和DEM数据获取处理、GeoServer切片发布并使用Cesium加载

    1. 数据获取 笔者这里使用的是哨兵一号(Sentinel-1).ALOS的遥感影像和ALOS的DEM数据 下载地址为:ASF Data Search (alaska.edu) ASF(Alaska ...

  5. 获取某地模型并用Cesium加载(一)

    2023-01-04 最近想用Cesium给学校做一个类似智慧校园的东西,要做的东西很多,首先是获取学校模型的问题,然后怎么用Cesium加载3Dtile 1.获取学校模型 想到之前被老师抓苦力去做春 ...

  6. vue 中监测滚动条加载数据(懒加载数据)

    vue 中监测滚动条加载数据(懒加载数据) 1:钩子函数监听滚动事件: mounted () { this.$nextTick(function () { window.addEventListene ...

  7. Vue——轻松实现vue底部点击加载更多

    前言 需求总是不断改变的,好吧,今天就把vue如何实现逐步加载更多和分布加载更多说下,默认你知道如何去请求数据的哈 一次请求 页面 使用slice来进行限制展现从0,a的数据 <div v-fo ...

  8. Maven SSH三大框架整合的加载流程

    <Maven精品教程视频\day02视频\03ssh配置文件加载过程.avi;> 此课程中讲 SSH三大框架整合的加载流程,还可以,初步接触的朋友可以听一听. < \day02视频\ ...

  9. 深入浅出的webpack4构建工具---webpack+vue+router 按需加载页面(十五)

    1. 为什么需要按需加载? 对于vue单页应用来讲,我们常见的做法把页面上所有的代码都打包到一个bundle.js文件内,但是随着项目越来越大,文件越来越多的情况下,那么bundle.js文件也会越来 ...

  10. vue使用nprogress页面加载进度条

    vue使用nprogress页面加载进度条 NProgress是页面跳转是出现在浏览器顶部的进度条 官网:http://ricostacruz.com/nprogress/ github:https: ...

随机推荐

  1. Javaweb知识复习--MyBatis+Mapper代理开发

    一种持久层框架,主要用于简化JDBC MyBatis应用步骤 1.在数据库里面创建一个表 2.创建模块,导入坐标 就是新建一个Maven项目,在pom.xml里面导入mybatis相应导包依赖代码: ...

  2. 认识流媒体协议,从 RTSP 协议解析开始!

    RTSP 是 Internet 协议规范,是 TCP/IP 协议体系中的一个应用层协议级网络通信系统.专为娱乐(如音频和视频)和通信系统的使用,以控制流媒体服务器.该协议用于在端点之间建立和控制媒体会 ...

  3. MySQL 高级查询截取分析

    慢日志分析流程如下:[1]观察(至少跑一天),看看生产慢 SQL 情况.[2]开启慢查询日志,设置阈值,比如对超过5秒的 SQL 语句进行抓取.[3]explain+慢 SQL 分析.[4]show ...

  4. mongodb导入数据,保创建新项目

    1.回顾 2.导入数据 2.1 excel数据表格 2.2 设计导入数据的路由 routes/users.js router.get('/upload', function (req, res, ne ...

  5. CANN训练:模型推理时数据预处理方法及归一化参数计算

    摘要:在做基于Ascend CL模型推理时,通常使用的有OpenCV.AIPP.DVPP这三种方式,或者是它们的混合方式,本文比较了这三种方式的特点,并以Resnet50的pytorch模型为例,结合 ...

  6. 关于Cookie要懂的知识

    ☞演示 什么是Cookie? http是一个无状态协议,它不对之前发生过的请求和响应的状态进行管理.这样就可能导致,我们登陆一个网站后,每次跳转新页面,之前的登陆状态都不能被记住,要重新登陆等问题. ...

  7. [Git]解决GIT冲突问题:git pull failed

    1 文由 花了很长时间一次性修改了项目的一大堆文件,准备最后git pull同步一下本地仓库代码,再一次性git commit,git push新代码的. but天不遂人愿,git pull时产生冲突 ...

  8. 用Abp实现双因素认证(Two-Factor Authentication, 2FA)登录(一):认证模块

    @ 目录 原理 用户验证码校验模块 双因素认证模块 改写登录 在之前的博文 用Abp实现短信验证码免密登录(一):短信校验模块 一文中,我们实现了用户验证码校验模块,今天来拓展这个模块,使Abp用户系 ...

  9. 四月十九号java基础知识

    1.总括:类的继承是使用已有的类为基础派生出新的类.通过类继承的方式,便能开发出新的类,而不需要编写相同的程序代码,所以说类的继承是程序代码再利用的概念抽象与接口都是类概念的扩展.通过继承扩展出的子类 ...

  10. 近万字总结:Java8 Stream流式处理指南

    总结/朱季谦 在实际项目当中,若能熟练使用Java8 的Stream流特性进行开发,就比较容易写出简洁优雅的代码.目前市面上很多开源框架,如Mybatis- Plus.kafka Streams以及F ...