1. 程式人生 > 實用技巧 >使用Mongodb存放檔案系統的離線柵格資料,供Cesium訪問

使用Mongodb存放檔案系統的離線柵格資料,供Cesium訪問

整體思路: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

      

  1. 將檔案系統中的資料夾匯入monogodb的方法如下,因為我的資料夾組織結構和文章中的不一樣所以自己又修改了一下,只有10級

  首先要下載python,然後肯定要裝pymongo的庫的嘛,然後我根據文章的程式碼自己修改了下就是下面這個樣子

from pymongo import MongoClient
import os
from bson import
binary 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的模板適配發布的服務即可