Python+Kepler.gl輕鬆製作酷炫路徑動畫

来源:https://www.cnblogs.com/python0921/archive/2020/05/31/13020671.html
-Advertisement-
Play Games

前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:費弗里 1. 簡介 Kepler.gl相信很多人都聽說過,作為Uber幾年前開源的互動式地理信息可視化工具,kepler.gl依托WebGL強大的圖形渲染能力,可以在瀏 ...


前言

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。

作者:費弗里

 

 

1. 簡介

Kepler.gl相信很多人都聽說過,作為Uber幾年前開源的互動式地理信息可視化工具,kepler.gl依托WebGL強大的圖形渲染能力,可以在瀏覽器端以多種形式輕鬆展示大規模數據集。

Python+Kepler.gl輕鬆製作酷炫路徑動畫

 

更令人興奮的是Kepler.gl在去年推出了基於Python的介面庫keplergl,結合jupyter notebook/jupyter lab的相關拓展插件,使得我們可以通過編寫Python程式配合Kepler.gl更靈活地製作各種可視化作品。

Python+Kepler.gl輕鬆製作酷炫路徑動畫

 

而隨著近期keplergl的更新,更多的新特性得以同步到其Python生態中,本文就將針對其中的路徑動畫的製作方法進行介紹。

2.基於keplergl的路徑動畫

我們要製作的路徑動畫圖主要用於表現特定路徑上流的運動,譬如圖3的例子來自Kepler.gl官方示例:

Python+Kepler.gl輕鬆製作酷炫路徑動畫

 

而在官方的說明中描述了要繪製路徑動畫需要輸入的數據格式:

Python+Kepler.gl輕鬆製作酷炫路徑動畫

 

這是一個典型的GeoJSON格式LineString要素,特別的是其"coordinates"鍵對應的值不同於常規的[經度, 緯度]格式,而是代表著[經度, 緯度, 高度, 時間戳],其中高度非必要,可以設置為0,而時間戳則聲明瞭軌跡動畫在該時間點會到達的該點位置,即線要素上連續的點位置+時間戳定義了軌跡動畫的運動模式,下麵我們分步驟來實現。

3.構造數據與初始化html

這裡我們以重慶市渝中區的OSM路網為演示示例數據,首先我們需要利用json模塊來讀取本地重慶市渝中區_osm路網_道路.geojson數據:

from keplergl import KeplerGl
import json
import time

with open('geometry/重慶市渝中區_osm路網_道路.geojson') as g:
    raw_roads = json.load(g)

 

隨便列印出其中包含的某個線要素:

Python+Kepler.gl輕鬆製作酷炫路徑動畫

 

可以看到,這時線要素內部包含的點還是[經度, 緯度]的格式,接下來我們為其虛構上時間戳信息,為了保證整個路網可視化的協調一致,將所有線要素的時間跨度固定在一個小時之內,保證每段路上從頭到尾的軌跡動畫都保持一致:

start_time = time.mktime(time.strptime('2020-05-29 20:00:00', "%Y-%m-%d %H:%M:%S"))

for i in range(raw_roads['features'].__len__()):
    for j in range(raw_roads['features'][i]['geometry']['coordinates'].__len__()):
        
        shift_time = int((j / raw_roads['features'][i]['geometry']['coordinates'].__len__())*3600) # 更新當前對應的時間戳
        
        raw_roads['features'][i]['geometry']['coordinates'][j] \
            .extend([0, # 高度設置為0
                     int(start_time) + shift_time])

 

接著再列印其中一個線要素:

Python+Kepler.gl輕鬆製作酷炫路徑動畫

 

可以發現每個點元素都追加上高度0以及對應的時間戳(註意這裡的時間戳必須為整數否則之後輸入keplergl會報錯),接下來的過程就非常簡單。

首先確保你已經安裝了keplergl以及對應插件,譬如我所使用的jupyter lab,在確保nodejs被安裝的前提下,使用jupyter labextension install @
jupyter-widgets/jupyterlab-manager keplergl-jupyter安裝拓展插件(jupyter notebook可參考
https://github.com/keplergl/kepler.gl/tree/master/bindings/kepler.gl-jupyter#installation),以及使用pip install keplergl來安裝keplergl庫,一切準備就緒直接運行如下代碼:

from keplergl import KeplerGl
# 生成KeplerGl對象s
map1 = KeplerGl(height=400, 
                data={'flow': raw_roads}) # data以圖層名為鍵,對應的矢量數據為值
map1
map1.save_to_html(file_name='渝中區.html') # 導出到本地可編輯html文件

 

Python+Kepler.gl輕鬆製作酷炫路徑動畫

 

這一步的目的是初始化已嵌入目標數據的html文件,接下來你就可以關閉jupyter lab,在工作目錄下找到已經導出的html文件直接打開,接下來的工作將在瀏覽器里進行。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 剛開始使用idea, 這個工具雖然很強大, 但也因為如此,讓使用也變得稍微負責。 還沒有習慣idea這個生態環境,因此也遇到不少坑。class.getResourceAsStream獲取結果為NULL這個問題今天困擾了我很久,一直在文件路徑上面糾結,浪費了很多時間。終於在鬥爭了將近2小時之後才翻到一 ...
  • 一、監督學習基礎知識 利用一組帶有標簽的數據,學習從輸入到輸出的映射,然後將這種映射關係應用到未知數據上,達到分類或回歸的目的 分類:當輸出是離散的,學習任務為分類任務 回歸:當輸出是連續的,學習任務為回歸任務 二、分類學習 1、輸入與輸出 輸入:一組有標簽的訓練數據(也稱觀察和評估),標簽表明瞭這 ...
  • 遍歷Map的方式 第一種通過 map1.keySet() 獲取key 通過key 找到value; 第二種通過Map.Entry(String,Integer) 獲取,然後使用entry.getKey()獲取到鍵,通過entry.getValue()獲取到值;第三種只遍歷鍵或者值,通過加強for迴圈 ...
  • 前言 隨著現在直播的興起,主播這個職業逐漸走入人們的視野。現在各大平臺都有當家花旦、一哥、一姐等稱號。其實人氣是一方面,但是顏值才是硬實力。 接下來帶大家進行主播的顏值檢測評分,看看誰是最靚的崽(*^▽^*) 本篇大致內容: 1、爬取主播的直播人臉圖 2、調用百度人臉檢測開放介面,進行顏值打分 環境 ...
  • switch後面使用的表達式可以是哪些數據類型?如何從控制台獲取String和int型的變數,並輸出?經典運算題:十進位轉為十六進位。 ...
  • Redis(Remote Dictionary Server),即遠程字典服務,是一個開源的使用ANSI C語言編寫、高性能的key-value資料庫,是當前使用最廣泛的NoSQL之一。 1、簡介 Redis是一個開源(BSD許可)的,記憶體中的數據結構存儲系統,它可以用作資料庫、緩存和消息中間件。 ...
  • //include包含,包含stdio.h頭文件,方便調用printf函數#include <stdio.h> //主函數,代表了整個程式的生命周期//1、它是整個程式的入口//2、有且只能有一個int main(){ printf("***********************\n"); pri ...
  • 基於laravel製作API介面 關於APIAPI(Application Programming Interface,應用程式編程介面)是一些預先定義的函數,目的是提供應用程式與開發人員基於某軟體或硬體得以訪問一組常式的能力,而又無需訪問源碼,或理解內部工作機制的細節。需要註意的是:API有它的具 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...