node-canvas实现百度地图个性化底图绘制

2020-03-18 21:18:01

参考地址 node-canvas实现百度地图个性化底图绘制

随着nodejs的推出,node的并发和异步的强大能力,越来越多的得到应用,而且取得了非常不错的效果。

作为一个前端工程师对node.js自然有着一份更深的感情,跃跃欲试的心情,总希望能将它应用到产品中来。

经过努力,node技术在百度LBS开发平台,得到了很好的落地,实现了百度地图个性化的底图绘制,并最终推出了百度地图的个性化地图平台

百度地图个性化平台

百度地图大家可能不会陌生了。我们发现个性化定制地图样式的需求非常强烈,开发者有强烈的欲望,希望控制地图的样式,打造出与众不同的地图风格。

百度地图个化平台:2014年5月中旬上线,目前已经很好地实现了个性化的配置功能。

在线地址:http://developer.baidu.com/map/custom/ 

其中的地图底图在IE678等浏览器下,就是使用node-canvas在后端绘制出来的。给一张效果图吧。不同主题的效果demo页,可以看我们的官方网页

 

主题列表页地址

百度地图底图技术介绍 

简单介绍一个地图的底图的相关知识吧,我们眼中看到的丰富的地图信息,其中组成地图的主要元素,莫过于地图的一张张底图瓦片了。如下图所示,

一般我们打开了一个地图,其实际上可能会像上图一样,由一堆瓦片组成。1,2,3,4表示不同的瓦片。 而某一张瓦片如下图所示

线上链接 :http://online2.map.bdimg.com/tile/?qt=tile&x=790&y=294&z=12&styles=pl&udt=20140613 

百度地图底图绘制技术现状

要想绘制上面所示的底图,目前现在主要有两类技术

栅格: 也就是传意义的图片技术,在server端把图片画好。浏览器使用<img>标签拼出来

矢量:在浏览器使用canvas技术,将矢量的数据,在浏览器完成渲染。它最大的问题在于:只支持高端浏览器

 

百度地图,目前两种技术都已经实现,如果大家使用的是mapapi,在高端浏览器下打开,你会发现,他是使用canvas绘制的。

http://developer.baidu.com/map/jsdemo.htm#a1_2

有兴趣可以使用不同的浏览器打开看看就可以看出来。

如图所示

为什么要用node-canvas来绘制底图呢?

有如下几个原因

1. 百度地图已经很好的实现使用canvas技术在浏览器完成渲染。

  并有不错的展现效果和性能,在移动端体验更好。因为矢量的数据比请求图片的体积要小的多

2. 在canvas的方案下,已经实现个性化底图的绘制效果

  底图绘制由样式+矢量数据组成。只要修改替换样式文件,就可以实现个性化地图的渲染。

3. 低端浏览器如IE6-8等浏览器,是不支持canvas功能的。

  展现地图底图,必须使用栅格图实现。需要有后端技术来生成底图

4. 由于不样的样式要求得到不同的底图。就需要图片是实时绘制的,而且要求性能必须好。

 

node-canvas绘制底图效果怎么样呢?

先show一张由node-canvas绘制的底图瓦片吧。

在线地址:http://api.map.baidu.com/customimage/tile?x=788&y=293&z=12&customid=midnight

可以看看请求的速度 ,应该是非常快的。

大图(9个瓦片生成的效果图)

在线地址:http://api.map.baidu.com/customimage/snap?customid=light

使用node-canvas的核心思路

上面这个图,就是我想表达的核心意思。一份代码即可以在浏览器里绘制地图,也可以在server端绘制地图。

让javascript一统天下吧~~~

node-canvas介绍

node-canvas 

官网的介绍:Node canvas is a Cairo backed Canvas implementation for NodeJS.

用一句话说: 他允许我们使用canvas的语法和接口写成的js代码,放在server跑。

如例子中的介绍

复制代码

var Canvas = require('canvas')
  , canvas = new Canvas(200,200)
  , ctx = canvas.getContext('2d');

ctx.font = '30px Impact';
ctx.rotate(.1);
ctx.fillText("Awesome!", 50, 100);var te = ctx.measureText('Awesome!');
ctx.strokeStyle = 'rgba(0,0,0,0.5)';
ctx.beginPath();
ctx.lineTo(50, 102);
ctx.lineTo(50 + te.width, 102);
ctx.stroke();

console.log('<img src="' + canvas.toDataURL() + '" />');

复制代码

 

 经过我的证实,确实是与canvas的接口使用完全一致。

 

后台绘制的主要逻辑

 

node-canvas的几个注意点

  1. 环境安装困难。

    • 由于依赖多个包,且对版本有各种要求。所以搭建消耗了大量的时间。最好终于搞定。

    • 部署形式,采用的是在线下把全部环境编译好,上线时,全部拷贝即可。

  2. 图片资源,换成相对路径。

  3. 中文字体安装,需要在linux机器上安装所需要的字体。

 

node的一些性能调优

关于node的一些调优,网上有很多的经验,方法都较为类似,这里简单列一下几个关键的。

  1. 一定要开启cluster. node为单进程,多核的机器 可以很好的利用cpu的使用率。

  2. 合理设置网络等配置。如果 node请求了第三方的http服务,如重试,超时,异常处理一定要全面。maxSocket等限制一定要打开。

  3. 合理开启缓存,一些预处理尽量放在node启动时完成,尽量不要放在request时再重复执行。

  4. 将node运行中,对cpu的依赖降到最低,尽量不要把复杂的计算放在js中计算,代码一定优化优化再优化。

node-开发辅助

  1. 使⽤用supervisor提⾼高 nodejs调试效率(监听js ⽂文件变化 ,⾃自动重启 node)  ,参考文章

  2. 使用node-inspector 在浏览器实现本地调试,参考文章

  3. 使用npm镜像,加速npm安装。 

总结

  1. node技术越来越成熟,在生产环境中没有任何问题。并发的优势非常明显,也可以实现代码的前后端复用的目标。

  2. node-canvas的出现,可以很好解决server绘制图片的需求,性能表现的很好。

  3. 开发node的app,对于前端工程师来说,学习成本不高。

如果对实现的细节感兴趣,可以单独联系我。我的微博是:http://weibo.com/yansunrong


  • 2019-09-03 23:19:12

    ./configure 的配置和用法

    Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。

  • 2019-09-04 16:24:17

    Ubuntu apt-get更换为阿里源

    ​进入阿里巴巴开源镜像页面,找到ubuntu,点击后面的帮助,可以看到类似下面的介绍,加入就好。切记下面的第三步。

  • 2019-09-04 16:32:56

    Ubuntu tar 解压缩命令详解

    tar 解压缩命令详解,这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

  • 2019-09-04 16:50:35

    CMake入门笔记

    Make是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

  • 2019-09-05 20:51:15

    在Android上使用FFmpeg压缩视频

    libavcodec-提供了更加全面的编解码实现的合集 libavformat-提供了更加全面的音视频容器格式的封装和解析以及所支持的协议 libavutil-提供了一些公共函数 libavfilter-提供音视频的过滤器,如视频加水印、音频变声等 libavdevice-提供支持众多设备数据的输入与输出,如读取摄像头数据、屏幕录制 libswresample,libavresample-提供音频的重采样工具 libswscale-提供对视频图像进行色彩转换、缩放以及像素格式转换,如图像的YUV转换 libpostproc-多媒体后处理器

  • 2019-09-05 20:54:21

    在Android 中使用FFmpeg命令

    到这里就可以运行FFmpeg命令了。一直我也是这样使用,但是我在做这个项目Cut的时候发现连续调用多次FFmpeg命令会报错(在项目需要,先改变分镜头的速度,再合成视频)。 为什么会这样的呢?