在作图方面,Python比NodeJS好用。首先,Python的绘图库较多,API功能强大且完备。NodeJS还是少了点,有些库没有测试就放弃了,需要window支持,我需要在后台执行。最近一直在研究地面雷达的可视化。在研究如何将基础数据可视化的过程中,我确实学到了很多知识和技能。传统的雷达数据可视化使用图片。同时,雷达基地数据会产生多种单站产品和组合产品,不同的数据产品会产生不同的图像。这样会产生大量的图像数据和基础数据,更不用说对数据容量的考验了,图像本身也不是矢量,渲染效果也不总是那么好。所以一开始想直接用GIS渲染数据。理想情况下,使用Mapbox很漂亮,省去图像数据,缩放过程中使用GeojsonLayer,可以清楚地看到图像。但是最后的效果是不一样的。显而易见的一点是会有差距。即使将Circle的尺寸放大,也达不到预期的效果。最后除了风速和风向数据(数据量小,不需要填充),其余的还是采用传统的图像渲染方式。在下一步中,我开始使用NodeJS和Python来实现它。老实说,我越来越喜欢NodeJS了。他无所不能,从前端到后端,无孔不入。我已经开始慢慢从Python迁移到NodeJS。在这项工作中,他的异步方法使读取文件变得简单和快速,这比Python更容易使用。让我用NodeJS写,用Python实现。如果可行,后期我会把项目迁移到NodeJS。扯远了,回到主题。大多数数据产品的生成方式都是一样的,一共有两种情况。第一个是分辨率为620*490格点的数据,每个格点的值对应一种颜色。这种情况比较简单,只需要创建一张宽高为620x490的图片,然后修改对应网格点坐标的颜色即可。PythonPIL处理时间为1s,文件数据读取时间为80ms,NodeJSpngjs从读取到绘制处理时间为35ms。二是扫描一个圆的数据,半径分为920个圆,每个圆分为372个点数据。需要填充到圆弧中的值对应一种颜色。这是效率最高的,也是最低的,因为每个圆都等分后需要进行填充,涉及到圆弧的计算。比较完美的方法是使用drawArc方法,可以画出一个完整漂亮的圆,计算出372×920的弧,但是PythonPIL库的arc方法不支持浮点弧度值,所以还得用其他方法用过的。对于Python来说,绘图库无非就是Matplotlib和PIL。用了一段时间Matplotlib,算是翻车了。我一直等到我直接ctrlc。NodeJS的绘图库很少,pngjs无法绘图。使用了一个基于graphicsmagick的库——gm。graphicsmagick是一个用C编写的功能强大的图像处理程序,并具有各种流行语言的SDK。结果车翻了,处理了10分钟。对了,我用的是PythonSDK,也很慢,10秒左右,而且画图的时候,完全是并发的。本来以为是Python语言性能比较慢导致的,后来用C++SDK写的,跑了7秒。看了python的源码,好像graphicsmagick只有maps方法,最后调用的是C的graphicsmagick。放弃drawArc方法,那就只能用drawPolygon方法,计算圆扇形四个点的坐标和画一个梯形,显然最后的圆不是一个完整的圆,而是一个有372条边的形状,但是因为等分很细,肉眼没有那么清晰的分辨率,几乎等同于一个圆。主要是为了节省大量的计算时间。graphicsmagickPython绘制Polygon性能依旧没有明显提升,node的gm不断翻车。回用PIL,他的drawPolygon方法支持浮点数据,处理1.3秒,速度很快,而且是单核的,多进程下可以同时处理。NodeJS使用了svg.js库,但是在处理过程中,由于svg数据一直在添加多边形,内存飙升了2-3G,svg转png也同样耗时,最终耗时5.8秒.我认为这是NodeJS最快的处理方式。在绘画工作的过程中,我尝试了各种方法,从简单了解图像原理到理解绘画原理,受益匪浅。目前NodeJS已经不能满足我的需求,但不是NodeJS做不到,而是没有好的工具。原文地址:Python与NodeJS绘图对比我的博客:时空路由器
