开源

快速搭建Cesium离线应用

2019-05-22  本文已影响7人  杏壳

Cesium是一个用于构建GIS应用的Javascript开源库,本节将实现基于Cesium快速搭建离线的GIS应用demo。这个应用可以离线查看地图影像以及地形起伏信息,也就是包含两部分离线数据集:

地图影像有很多获取途径,可以使用地图下载器下载,如果你懒得自己做,这是我准备好的一个全球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 ejs = require("ejs")
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

上一篇下一篇

猜你喜欢

热点阅读