mapbox-gl-native是mapbox后端渲染引擎,与mapbox-gl-js使用同样的样式规范,可以运用于Android、IOS、MacOS、Linux等各种平台,本文主要讨论Linux下源码编译nodejs版本。
$ npm install
$ make node
var mbgl = require('../platform/node/index.js');
var sharp = require('sharp');
var request = require('request');
var options = {
request: function(req, callback) {
request({
url: req.url,
encoding: null,
gzip: true
}, function(err, res, body) {
if (err) callback(err)
callback(null, {data: body})
});
},
ratio: 1
};
var map = new mbgl.Map(options);
map.load(require('./style.json'));
map.render({
center: [119.58398,29.828955],
zoom: 10,
width: 1024,
height: 1024
}, function(err, buffer) {
if (err) throw err;
map.release();
var image = sharp(buffer, {
raw: {
width: 1024,
height: 1024,
channels: 4
}
});
// Convert raw image buffer to PNG
image.toFile('./image.png', function(err) {
if (err) throw err;
});
});
需要注意的是这里mbgl引用的是platform文件夹中的js文件,platform文件夹是各种平台引用的入口,可以打开platform/node中的index.js文件,发现刚才编译生成的node文件在index.js中被引用了。
var mbgl = require('../../lib/mbgl-node.abi-' + process.versions.modules);
上面贴出的示例是利用刚编译的node-mapbox-gl-native渲染一个地图样式,并在指定中心点和级别生成一张1024*1024的图片,保存到当前文件夹。用node运行以上代码就可得到结果:
$ node ./test.js
1、mapbox-gl-native运行需要有图形桌面环境,非图形桌面环境(例如ubuntu serve)中运行会报错:
terminate called after throwing an instance of 'std::runtime_error'
what(): Failed to open X display.
Aborted (core dumped)
解决方法是安装xvfb,然后使用xvfb运行以上命令:
$ sudo apt-get install xvfb
$ xvfb-run -a -s '-screen 0 800x600x24' node ./test.js
2、在编译源码的过程中还遇到一个问题,导致编译失败:
fatal error: X11/Xlib.h: No such file or directory
解决方法:安装libx11-dev
$ sudo apt-get install libx11-dev