Cesium是一个用于构建GIS应用的Javascript开源库,本节将实现基于Cesium快速搭建离线的GIS应用demo。这个应用可以离线查看地图影像以及地形起伏信息,也就是包含两部分离线数据集:
- map imagery
- terrain dataset
地图影像有很多获取途径,可以使用地图下载器下载,如果你懒得自己做,这是我准备好的一个全球0-7级的地图测试影像,点此下载。
地形数据集基于SRTM开放数据来制作,可以使用docker的这个image: tumgis/ctb-quantized-mesh来制作Quantized-Mesh
格式的数据集合,以SRTM的数据srtm_56_05(嘉峪关市机场附近)为例,制作地形数据集的步骤请参考我的这篇文章,点此下载已做好的地形数据集。
有了离线的地图和地形数据集之后,就可以写代码了,下面基于node搭建一个简单的服务器demo。
目录结构如下:
.
├── node_modules
│ ├── .....
├── package-lock.json
├── package.json
├── public
│ ├── js
│ ├── map
│ ├── terrain
├── server.js
└── views
└── index.html
server.js的示例代码如下:
let express = require("express")
let url = require('url')
let path = require('path')
let app = express()
let options = {
maxAge: 3600000
};
// 应用级中间件
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
// 应用级中间件
app.use(function (req, res, next) {
// 去除查询参数,支持heightMap和Quantized-Mesh
let filePath = path.join(__dirname, url.parse(req.url).pathname);
let pathTmep = path.extname(filePath)
if (pathTmep === '.terrain') {
res.set({
'Content-Type': 'application/octet-stream',
'Content-Encoding': 'gzip',
});
// Content-Disposition: attachment;filename=2948.terrain
res.set('Content-Disposition', 'attachment;filename='+path.basename(filePath))
}
next();
})
app.get("/", function (req, res, next) {
res.sendFile(path.join(__dirname + '/views/index.html'));
})
// 静态资源中间件放到最后,确保应用级中间件被使用加上http头部信息
app.use(express.static(__dirname + "/node_modules/cesium/Build", options));
app.use(express.static(__dirname + "/public", options));
// 异常处理中间件
app.use(function (req, res, next) {
res.status(404).send('So sorry, we cannot find that!');
})
app.listen("8080", "localhost")
这是一份完整demo,下载下来后, npm install & node server.js
have fun