使用Mongodb存放檔案系統的離線柵格資料,供Cesium訪問
阿新 • • 發佈:2020-07-13
整體思路:1.使用python將檔案系統的瓦片資料匯入到mongodb資料庫中,根據層級和圖片編號建立索引
2.使用node和mongooes搭建一個地圖服務供cesium的介面使用,
3.根據Cesium載入瓦片資料的內部實現,是通過UrlTemplateImageryProvider()實現的
主要是這個介面內部有一個templateValue通過正則表示式
var templateRegex = /{[^}]+}/g;來替換掉檔案伺服器上的模板url:
根據釋出的服務介面,修改原本的模板url來匹配發布的地圖服務介面,就可以是使用Cesium添加了
這個思路是參考網上別人的訪問OpenLayer的方法來實現的,別人的文章地址如下https://blog.csdn.net/u013420816/article/details/84141464
- 將檔案系統中的資料夾匯入monogodb的方法如下,因為我的資料夾組織結構和文章中的不一樣所以自己又修改了一下,只有10級
首先要下載python,然後肯定要裝pymongo的庫的嘛,然後我根據文章的程式碼自己修改了下就是下面這個樣子
from pymongo import MongoClient import os from bson importbinary class file2db(object): def __init__(self,database,setname,level): mongodb_url='localhost' mongodb_port=27017 conn=MongoClient(mongodb_url,mongodb_port) db=conn[database] self.my_set=db[setname] self.max_level=level def read_png_file(self,root_path): _files=[] if os.path.exists(root_path): list=os.listdir(root_path) print(list) for i in range(0,len(list)): path=os.path.join(root_path,list[i]) if os.path.isdir(path): _files.extend(self.read_png_file(path)) if os.path.isfile(path): _files.extend(path) file_name=os.path.basename(path).split('.')[0] file_type=os.path.basename(path).split('.')[1] print(file_name) print(file_type) dir_path=os.path.dirname(path).split("\\") row_name=dir_path[len(dir_path)-1] zoom_name=dir_path[len(dir_path)-2] if file_type=='png': self.insert_file(zoom_name,row_name,file_name,path) return _files else: return None def insert_file(self,zoom,row,column,path): level=zoom if int(level)<=self.max_level: png_list=self.my_set.find({"x":row,"y":column,"z":zoom}) print(png_list.count()) if png_list.count()==0: print("------") print(zoom) print(row) print(column) print(path) ## print('zoom:%s row:%s fileName:%s path:%s' (zoom,row,column,path)) file=open(path,mode='rb') content=binary.Binary(file.read()) self.my_set.insert({"x":row,"y":column,"z":zoom,"img":content}) file.close() else: print('this file is exist') else: print('this zoom greater than max level') if __name__=='__main__': file2db=file2db('png','layer',10) file2db.read_png_file('F:\worldImage_鏁版嵁澶囦喚\Img')
插入資料庫中的瓦片資料如下
2.使用node和monogoose來搭建一個地圖伺服器連線mongodb這一部分也是借鑑文章中的程式碼,同時在node伺服器這端處理了一個跨域問題
'use strict'; var mongoose = require('mongoose'), DB_URL = 'mongodb://localhost:27017/png'; mongoose.connect(DB_URL); mongoose.connection.on('connected', function () { console.log('Mongoose connection open to ' + DB_URL); }); mongoose.connection.on('error',function (err) { console.log('Mongoose connection error: ' + err); }); mongoose.connection.on('disconnected', function () { console.log('Mongoose connection disconnected'); }); module.exports = mongoose;
'use strict'; var mongoose = require('./db'), Schema = mongoose.Schema; var GGSchema = new Schema({ x : { type: String }, y: {type: String}, z: {type: String}, img : { type: Buffer}, }); module.exports = mongoose.model('layer',GGSchema,'layer');
'use strict'; var express = require('express'); var mylayer = require("./layer"); var app = express(); // 獲取圖片 app.get('/getimage/',function(req, res) { res.header("Access-Control-Allow-Origin","*") var x = req.query.x var y = req.query.y var z = req.query.z console.log(req.originalUrl+"node"); var whereStr = {"x":x,"y":y,"z":z}; console.log(whereStr); mylayer.findOne(whereStr,function(err, doc){ if(err){ console.log("Error: "+err) }else{ let img = null if(doc){ if(doc.img){ img = doc.img } } if(img){ res.writeHead('200', {'Content-Type': 'image/png'}); //寫http頭部資訊 res.end(img,'binary'); }else{ res.status(404); res.end() } } }) }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("應用例項,訪問地址為 http://%s:%s", host, port) })
一共三個檔案,第一個連線資料庫,第二個模式約束,第三個使用express釋出服務
3.修改Cesium.UrlTemplateImageryProvider中預設的Url的模板適配發布的服務即可