mars3d是火星科技 研发的一款基于 WebGL 技术实现的三维客户端开发平台,可快速接入与使用多种GIS数据和三维模型,呈现三维空间的可视化。
获取 Mars3D
Mars3D 提供了多种安装方式,你可以根据项目的实际情况和技术栈选择以下任意一种方式安装。
- 从 npm 安装
- 从 CDN 引入
- 从 Mars3D官网 下载
接下来我们将分别介绍这些安装方式,以及下载后的目录结构。
#安装方式
#1. 从 npm 获取
使用Node环境下的现代web前端技术栈时,可以使用npm或cnpm或yarn等方式来安装mars3d包
//安装mars3d主库
npm install mars3d --save
//安装mars3d插件(按需安装)
npm install mars3d-space --save
安装后在相关使用文件中引入使用即可
import 'mars3d/dist/mars3d.css'
import * as mars3d from 'mars3d'
//导入mars3d插件(按需使用,需要先npm install)
import 'mars3d-space'
详见在项目中引入 Mars3D, 您也可以参考 vue最简项目模板 、 react最简项目模板 、 angular最简项目模板
#2. 从 CDN 获取
在html的head标签中引入Mars3D包相关CDN资源.
<!--引入cesium基础lib-->
<link href="https://unpkg.com/mars3d-cesium/Build/Cesium/Widgets/widgets.css" rel="stylesheet" type="text/css" />
<script src="https://unpkg.com/mars3d-cesium/Build/Cesium/Cesium.js" type="text/javascript" ></script>
<script src="https://unpkg.com/@turf/turf/turf.min.js" type="text/javascript" ></script>
<!--引入mars3d库lib-->
<link href="https://unpkg.com/mars3d/dist/mars3d.css" rel="stylesheet" type="text/css" />
<script src="https://unpkg.com/mars3d/dist/mars3d.js" type="text/javascript" ></script>
<!--引入mars3d库插件lib(按需引入)-->
<script src="https://unpkg.com/mars3d-space/dist/mars3d-space.js" type="text/javascript" ></script>
<!--引入cesium基础lib-->
<link href="https://cdn.jsdelivr.net/npm/mars3d-cesium/Build/Cesium/Widgets/widgets.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/mars3d-cesium/Build/Cesium/Cesium.js" type="text/javascript" ></script>
<script src="https://unpkg.com/@turf/turf/turf.min.js" type="text/javascript" ></script>
<!--引入mars3d库lib-->
<link href="https://cdn.jsdelivr.net/npm/mars3d/dist/mars3d.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/mars3d/dist/mars3d.js" type="text/javascript" ></script>
<!--引入mars3d库插件lib(按需引入)-->
<script src="https://cdn.jsdelivr.net/npm/mars3d-space/dist/mars3d-space.js" type="text/javascript" ></script>
引入后在相关使用文件中直接使用window.mars3d
对象即可 。
- 传统技术栈请在需要呈现地图的html页面中加入,可以参考 原生js最简项目模板
- vue技术栈可以修改
public/index.html
文件,可以参考 Vue最简项目CDN版
#3. 从 Mars3D官网 下载获取
可以在Mars3D官网 下载 mars3d离线包 后在本地项目中引入相对路径资源来使用。
将下载的SDK放在项目目录内,使用方式与上面2种基本相同,区别在于url路径是本地项目的相对路径。
#3.1 类似CDN的head静态资源方式引入
<!--引入cesium基础lib-->
<link href="./lib/Cesium/Widgets/widgets.css" rel="stylesheet" type="text/css" />
<script src="./lib/Cesium/Cesium.js" type="text/javascript" ></script>
<script src="./lib/turf/turf.min.js" type="text/javascript" ></script>
<!--引入mars3d库lib-->
<link href="./lib/mars3d/dist/mars3d.css" rel="stylesheet" type="text/css" />
<script src="./lib/mars3d/dist/mars3d.js" type="text/javascript" ></script>
<!--引入mars3d库插件lib(按需引入)-->
<script src="./lib/mars3d/plugins/space/mars3d-space.js" type="text/javascript" ></script>
#3.2 类似npm的import方式导入
import './lib/mars3d/mars3d.css'
import * as mars3d from './lib/mars3d/mars3d.js'
如果引入本地版本build
编译很慢时,可以按下面配置修改babel.config.js
module.exports = {
//已忽略其他配置
ignore: [
'./src/components/Map/lib/mars3d/' //改成自己的本地地址
]
}
引入后的具体的使用请参考 下一篇教程 说明。
快速上手
获取 Mars3D
Mars3D 支持多种下载方式,可以在下一篇教程安装中查看所有方式。这里,我们以从 jsDelivr CDN 上获取为例,介绍如何快速安装。
关于这些文件的介绍,可以在下一篇教程安装中了解更多信息。
#引入 Mars3D
新建一个 index.html
文件,内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--引入cesium基础lib-->
<link href="https://cdn.jsdelivr.net/npm/mars3d-cesium/Build/Cesium/Widgets/widgets.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/mars3d-cesium/Build/Cesium/Cesium.js" type="text/javascript" ></script>
<!--引入mars3d库lib-->
<link href="https://cdn.jsdelivr.net/npm/mars3d/dist/mars3d.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/mars3d/dist/mars3d.js" type="text/javascript" ></script>
</head>
</html>
打开这个 index.html
,你会看到一片空白。但是不要担心,打开控制台确认没有报错信息,并有正确的mars3d版本等信息提示,就可以进行下一步。
#绘制一个简单的三维地球
在绘三维地球前我们需要为 Mars3D 准备一个定义了高宽的 DOM 容器。在刚才的例子 </head>
之后,添加:
<body>
<!-- 为 Mars3D 准备一个定义了宽高的 DOM -->
<div id="mars3dContainer" class="mars3d-container"></div>
</body>
然后就可以通过 new mars3d.Map 方法初始化一个 mars3d 实例并通过传入 mapOptions 参数生成一个简单的三维地球,下面是完整代码。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>mars3d</title>
<!--引入cesium基础lib-->
<link href="https://cdn.jsdelivr.net/npm/mars3d-cesium/Build/Cesium/Widgets/widgets.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/mars3d-cesium/Build/Cesium/Cesium.js" type="text/javascript" ></script>
<!--引入mars3d库lib-->
<link href="https://cdn.jsdelivr.net/npm/mars3d/dist/mars3d.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/mars3d/dist/mars3d.js" type="text/javascript" ></script>
</head>
<body>
<!-- 为 Mars3D 准备一个定义了宽高的 DOM -->
<div id="mars3dContainer" class="mars3d-container"></div>
<script type="text/javascript">
var mapOptions = {} //支持的参数请看API文档:http://mars3d.cn/api/Map.html
var map = new mars3d.Map('mars3dContainer', mapOptions)
</script>
</body>
</html>
这样你的第一个三维地球就诞生了!
在已有项目中集成Mars3D
1. 引入Mars3D类库
可以根据您自己的技术栈使用情况,获取 Mars3D 进行下载或引入Mars3D库到自己的项目中去使用。
#方式1:head静态资源方式引入
在html的head标签中引入Cesium官方包和Mars3D包相关资源,此方法比较简单,不会出现各类集成问题,引入资源后在代码即可通过window.mars3d
来使用相关mars3d类及方法。
在线CDN版本:
<!--引入cesium基础lib-->
<link href="https://cdn.jsdelivr.net/npm/mars3d-cesium/Build/Cesium/Widgets/widgets.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/mars3d-cesium/Build/Cesium/Cesium.js" type="text/javascript" ></script>
<script src="https://unpkg.com/@turf/turf/turf.min.js" type="text/javascript" ></script>
<!--引入mars3d库lib-->
<link href="https://cdn.jsdelivr.net/npm/mars3d/dist/mars3d.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/mars3d/dist/mars3d.js" type="text/javascript" ></script>
<!--引入mars3d库插件lib(按需引入)-->
<script src="https://cdn.jsdelivr.net/npm/mars3d-space/dist/mars3d-space.js" type="text/javascript" ></script>
本地版本(下载链接 ):
<!--引入cesium基础lib-->
<link href="./lib/Cesium/Widgets/widgets.css" rel="stylesheet" type="text/css" />
<script src="./lib/Cesium/Cesium.js" type="text/javascript" ></script>
<script src="./lib/turf/turf.min.js" type="text/javascript" ></script>
<!--引入mars3d库lib-->
<link href="./lib/mars3d/dist/mars3d.css" rel="stylesheet" type="text/css" />
<script src="./lib/mars3d/dist/mars3d.js" type="text/javascript" ></script>
<!--引入mars3d库插件lib(按需引入)-->
<script src="./lib/mars3d/plugins/space/mars3d-space.js" type="text/javascript" ></script>
- 传统技术栈请在需要呈现地图的html页面中加入,可以参考 原生js最简项目模板
- vue技术栈可以修改
public/index.html
文件,可以参考 Vue最简项目CDN版
#方式2: import方式导入
使用Node环境下的现代web前端技术栈时,可以使用npm等来安装mars3d包并import导入后来使用。
//引入npm版本时
import 'mars3d/dist/mars3d.css'
import * as mars3d from 'mars3d'
//引入下载的本地版本时
// import './lib/mars3d/mars3d.css'
// import * as mars3d from './lib/mars3d/mars3d.js'
//导入mars3d插件(按需使用,需要先npm install)
import 'mars3d-space'
//可以绑定下vue原型链,可以全局使用
Vue.prototype.mars3d = mars3d;
//在具体使用的vue等文件中
//直接使用 this.mars3d 进行相关调用。
#修改项目配置
因为mars3d所依赖的Cesium是一个多文件资源的js库,需要对其依赖的一些资源文件进行拷贝处理(这也是容易出问题的地方), 下面已Webpack
技术栈为例,vue等其他技术栈类似(可以参考开源项目清单内下载后的项目模板对应README说明处理)。
npm install copy-webpack-plugin -save --dev
// webpack.config.js
const path = require('path')
const webpack = require('webpack')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const cesiumSourcePath = 'node_modules/mars3d-cesium/Build/Cesium/' //cesium库目录
let cesiumRunPath = './cesium/'//cesium运行时主目录
module.exports = {
plugins: [
//标识cesium资源所在的主目录,cesium内部资源加载、多线程等处理时需要用到
new webpack.DefinePlugin({
CESIUM_BASE_URL: JSON.stringify(cesiumRunPath)
}),
//cesium相关资源目录需要拷贝到系统目录下面
new CopyWebpackPlugin([{ from: path.join(cesiumSourcePath, 'Workers'), to: path.join(cesiumRunPath, 'Workers') }]),
new CopyWebpackPlugin([{ from: path.join(cesiumSourcePath, 'Assets'), to: path.join(cesiumRunPath, 'Assets') }]),
new CopyWebpackPlugin([{ from: path.join(cesiumSourcePath, 'ThirdParty'), to: path.join(cesiumRunPath, 'ThirdParty') }]),
new CopyWebpackPlugin([{ from: path.join(cesiumSourcePath, 'Widgets'), to: path.join(cesiumRunPath, 'Widgets') }])
],
}
或
// vue.config.js
const path = require('path')
const webpack = require('webpack')
const CopyWebpackPlugin = require('copy-webpack-plugin')
module.exports = {
configureWebpack: (config) => {
let cesiumSourcePath = 'node_modules/mars3d-cesium/Build/Cesium/' //cesium库目录
let cesiumRunPath = config.output.publicPath || './cesium/' //cesium运行时主目录
let plugins = [
//标识cesium资源所在的主目录,cesium内部资源加载、多线程等处理时需要用到
new webpack.DefinePlugin({
CESIUM_BASE_URL: JSON.stringify(cesiumRunPath)
}),
//cesium相关资源目录需要拷贝到系统目录下面
new CopyWebpackPlugin([{ from: path.join(cesiumSourcePath, 'Workers'), to: path.join(config.output.path, cesiumRunPath, 'Workers') }]),
new CopyWebpackPlugin([{ from: path.join(cesiumSourcePath, 'Assets'), to: path.join(config.output.path, cesiumRunPath, 'Assets') }]),
new CopyWebpackPlugin([{ from: path.join(cesiumSourcePath, 'ThirdParty'), to: path.join(config.output.path, cesiumRunPath, 'ThirdParty') }]),
new CopyWebpackPlugin([{ from: path.join(cesiumSourcePath, 'Widgets'), to: path.join(config.output.path, cesiumRunPath, 'Widgets') }])
]
config.plugins = [
...config.plugins,
...plugins
]
},
//已省略其他配置
}
90% 的集成问题都是出现在这对cesium库的拷贝处理上,项目运行没有正确识别Cesium主目录造成各种问题。
#修改项目配置-CDN方式
如果上一步无法正常运行项目,也可以通过CDN方式引入Cesium,并还原上一步骤“修改项目配置”的所有配置。
mars3d库可以在import引入的方式下,兼容识别CDN引入的Cesium库。
<!--引入cesium基础lib-->
<link href="https://unpkg.com/mars3d-cesium/Build/Cesium/Widgets/widgets.css" rel="stylesheet" type="text/css" />
<script src="https://unpkg.com/mars3d-cesium/Build/Cesium/Cesium.js" type="text/javascript" ></script>
#2. 新建div容器
在需要呈现地图的页面或相关组件中,加上div容器,并注意设置div的css高宽样式。
<div id="mars3dContainer" class="mars3d-container"></div>
#3. 使用mars3d.Map方法创建地球
使用Map地图类 类创建三维地图场景。
var mapOptions = {} //支持的参数请看API文档:http://mars3d.cn/api/Map.html
var map = new mars3d.Map('mars3dContainer', mapOptions)