Pythonでの地球動画作成

投稿者: | 2022年10月8日

Pythonでの地球動画作成

Pythonでの地球動画作成

Pythonを利用して地球回転動画を作成してみました。matplotlibで各フレームの画像を作成し、ffmpegで1分弱のMP4フォーマットに変換しています。ffmpegについては、pipではなく個別のインストールが必要となります。

サンプルソース

#------------------------------------------------------------------------------
# FuncAnimationで地球動画のアニメーション作成
#------------------------------------------------------------------------------
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import datetime
import os
import shutil
import numpy as np
from mpl_toolkits.basemap import Basemap

#------------------------------------------------------------------------------
#単画像作成
#------------------------------------------------------------------------------
def animeCalc(frame_no):

    if frame_no != 0:
        plt.cla()

    """
    llcrnrlon    所望の地図領域の左下隅の経度(度)。
    llcrnrlat    所望の地図領域の左下隅の緯度(度)。
    urcrnrlon    所望のマップ領域(度)の右上隅の経度。
    urcrnrlat    所望のマップ領域の右上角の緯度(度)

    緯度:北極:90,南極:-90
    経度:グリニッジ:0,西マイナス、東プラス プラスマイナス180
    """

    crnrlon=frame_no%360
    if crnrlon == 0:
        print(str(frame_no) + ":" + str(crnrlon))

    #==================================================
    # 描画設定
    #==================================================
    #画像選択
    map = Basemap(projection='ortho'
                ,lon_0=-crnrlon
                ,lat_0=40
                ,resolution='l')

    #グリッド設定
    map.drawmeridians(np.arange(-360, 360, 10))
    map.drawparallels(np.arange(-90, 90, 10))

    #カラー設定
    map.drawcountries(color='lightblue',linewidth=0.2)
    #map.fillcontinents(color='darkgreen',lake_color='darkgreen')
    map.fillcontinents(color='navy',lake_color='navy')
    map.drawmapboundary(fill_color='royalblue')

#------------------------------------------------------------------------------
#動画作成
#------------------------------------------------------------------------------
def animeView():
    #--------------------------------
    #開始メッセージ
    #--------------------------------
    print("動画作成開始")
    dt_now = datetime.datetime.now()
    print(dt_now)

    #グラフを表示する領域を,figオブジェクトとして作成.
    fig = plt.figure(figsize=(16, 9), dpi=256, facecolor='lightblue')
    fig.patch.set_facecolor('white')

    #プロット設定
    """
    plt.subplots_adjust(left=0.0,
                            bottom=0.0,
                            right=1.0,
                            top=1.0,
                            wspace=0.5,
                            hspace=0.5)
    """

  #アニメーション作成
    ani = FuncAnimation(fig, animeCalc, interval=20,frames=2500)

    #--------------------------------
    #ファイル名作成
    #--------------------------------
    fileMainNm = "anime"
    fileMainNm += "_"
    fileMainNm += str(dt_now.strftime('%Y%m%d%H%M%S'));
    #ファイルパス作成
    filePath =  outDir + "/" + fileMainNm+".mp4"

    #mp4ファイル作成
    ani.save(filePath , writer="ffmpeg" , dpi=256 )

    #--------------------------------
    #終了メッセージ
    #--------------------------------
    print("動画作成終了")
    dt_now = datetime.datetime.now()
    print(dt_now)

#------------------------------------------------------------------------------
#メイン関数
#------------------------------------------------------------------------------
def main():

    #--------------------------------
    #開始メッセージ
    #--------------------------------
    print("描画開始")
    dt_now = datetime.datetime.now()
    print(dt_now)

    #--------------------------------
    #ファイル名作成
    #--------------------------------
    fileMainNm = "anime"
    fileMainNm += "_"
    fileMainNm += str(dt_now.strftime('%Y%m%d%H%M%S'));

    #--------------------------------
    #ディレクトリ作成
    #--------------------------------
    new_path = "./out/" +fileMainNm
    if not os.path.exists(new_path):
        os.mkdir(new_path)

    global outDir
    outDir=new_path
    print(outDir)

    #--------------------------------
    #実行Phytonファイルのコピー
    #--------------------------------
    print(os.path.basename(__file__))
    shutil.copyfile(os.path.basename(__file__), outDir + "/" + os.path.basename(__file__))

    #--------------------------------
    #描画
    #--------------------------------
    animeView()

    #--------------------------------
    #終了メッセージ
    #--------------------------------
    print("描画終了")
    dt_now = datetime.datetime.now()
    print(dt_now)

if __name__ == "__main__":
    main()

ソースの解析

地図画像を扱うために、Basemapライブラリをインポートします。

from mpl_toolkits.basemap import Basemap

動画対象の地図設定を行います。

  #画像選択
    map = Basemap(projection='ortho'
                ,lon_0=-crnrlon
                ,lat_0=40
                ,resolution='l')

グリッド設定を行います。

    #グリッド設定
    map.drawmeridians(np.arange(-360, 360, 10))
    map.drawparallels(np.arange(-90, 90, 10))

地図のカラー設定を行います。

    #カラー設定
    map.drawcountries(color='lightblue',linewidth=0.2)
    #map.fillcontinents(color='darkgreen',lake_color='darkgreen')
    map.fillcontinents(color='navy',lake_color='navy')
    map.drawmapboundary(fill_color='royalblue')

作成画像

関連記事



最近の投稿

過去の投稿

管理者が運営している関連サイト