nodejs从源码编译mapbox-gl-native

mapbox-gl-native是mapbox后端渲染引擎,与mapbox-gl-js使用同样的样式规范,可以运用于Android、IOS、MacOS、Linux等各种平台,本文主要讨论Linux下源码编译nodejs版本。

系统要求:

  1. 64位Linux或者MacOS
  2. C++14
  3. nodejs v4.x (官方文档说node v5+会存在问题)

编译过程

  1. 安装依赖包
    $ npm install
  2. 编译,完成编译后会在lib文件夹生成node文件“mbgl-node.abi-46.node”,如果要在nodejs环境使用mapbox-gl-native,inport该文件即可
     
    $ 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

 

你可能感兴趣的:(mapbox)