Python和NodeJS繪圖對比

在繪圖方面,Python 比 NodeJS 好用,首先 Python 繪圖庫多,而且 API 強大而完善。 NodeJS 還是少點,一些庫還沒測就放棄了,需要 window 支持,而我需要在后端執行。

最近一直在搞地面雷達的可視化工作。在研究如何將基數據可視化過程中,著實汲取了相當多的知識和技能。

傳統的雷達數據可視化采用圖片方式,同一時刻,雷達基數據會產生多種單站產品和組合產品,針對不同數據產品生成不同的圖像。這樣會產生大量的圖像數據和基數據,對數據容量是個考驗不說,圖像本身也非矢量,渲染效果總不是那么好。

所以最開始想用 GIS 的方式將數據直接渲染,理想中使用 Mapbox 是美麗的,省去了圖像數據,使用 Geojson Layer 在縮放過程中,都能清晰得看影像。但最終效果不然,明顯的一點是會存在空隙,即使將 Circle 放大尺寸,也達不到理想的效果。

最終除了風速風向數據(數據量小,而且不需要填充),其余的還是采用了傳統的圖片渲染方式。在接下去的過程中,我開始同時使用 NodeJS 和 Python 來實現。說真的,我越來越喜歡 NodeJS,他無所不能,從前端到后端,無孔不入。我已經開始慢慢從 Python 遷移到 NodeJS。在這個工作上,他的異步方式讓讀取文件,簡單快速,比 Python 好用多了。讓我在用 Python 實現的同時,也想用 NodeJS 寫一遍,如果可行的話,直接在后期將項目遷移到 NodeJS。

扯遠了,回到主題。大部分數據產品的生成方式是一樣的,總共會出現兩種情況。

第一種是分辨率為 620*490 格點數據,每個格點的值對應一種顏色。這種情況比較簡單,只需要創建一個寬高為 620x490 的圖像,然后修改對應格點坐標的顏色即可。

  • Python PIL 處理時間 1s,其中讀文件數據 80 ms
  • NodeJS pngjs 處理時間從讀取到繪圖 35ms

可謂差距明顯。

第二種是掃描一圈的數據,半徑等分 920 個圈,每圈再等分 372 個點數據,需要填充成圓弧的值對應一種顏色,這個是最效率最低的,因為每個圈等分后需要填充,涉及到圓弧的計算。

比較完美的做法就是使用 drawArc 方法,這樣能畫出一個完整漂亮的圓,計算 372×920 個圓弧,但是 Python PIL 庫的 arc 方法不支持浮點型的弧度值,從而不得不使用其他方法。對 Python 來說,繪圖的庫無非就是 Matplotlib 和 PIL 這倆,Matplotlib 使用了一下算是翻車了,等得我直接 ctrl c 了。

NodeJS 的畫圖庫很少,pngjs 無法繪圖。用了一個基于 graphicsmagick 的庫——gm,graphicsmagick 是一個強大的圖像處理程序,使用 C 寫的,有各種流行語言的 SDK。結果,翻車了,得花 10 幾分鐘才能處理完。順便我用了 Python 的 SDK,也挺慢,大概 10 秒,而且繪圖的時候,是完全并發的。本來以為相對慢是 Python 語言的性能導致的,然后用 C++ 的 SDK 寫了一下,運行也得花 7 秒,看了下 Python 的源碼,貌似 graphicsmagick 只映射了方法,最終還是調用了 C 的 graphicsmagick。

放棄了 drawArc 方法,那只能采用 drawPolygon 方法了,計算出圓環扇形四個點的坐標畫一個梯形,顯然最終的圓不是完整的圓,是一個 372 邊形,不過由于等分得很細,肉眼沒有那么清晰的分辨,幾乎等同于圓了。主要是省去了很多計算的時間。

graphicsmagick Python 畫 Polygon 性能還是得不到明顯的提升,而 node 的 gm 繼續翻車。用回了 PIL,他的 drawPolygon 方法支持浮點數據,處理完花了 1.3 秒,可謂很快了,而且是單核的,多進程下可以同時處理。NodeJS 使用了 svg.js 庫,但是處理過程中因為 svg 數據一直在添加 polygon 導致內存飆升了 2-3G,從 svg 轉換 png 也花了相同的時間,最終花了 5.8 秒。我想這算是用 NodeJS 處理最快的一次了。

在繪圖工作的過程中,嘗試了各種手段,從簡單理解圖像的原理到理解了繪圖的原理,獲益匪淺。目前來看,對于我的需求,NodeJS 還未能滿足,但是 NodeJS 并不是做不到,而是沒有好的工具。

原文地址:Python和NodeJS繪圖對比
我的博客:時空路由器

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容