プログラミングプロジェクト Flat Earth 1. プロジェクトの概要

俺が今年個人的に取り組んだプロジェクト、Flat Earthを今回から何回かに分けて紹介する。

 

このプロジェクトは、世界地図(特に、正距円筒図法)の画像から地球のモデルを作り、それをステレオ投影を用いて2次元平面に投影しようという試みだ。難しそうに聞こえるかもしれないが、一つ一つ説明していこう。

 

まずは、正距円筒図法というのは私たちがいつも見るような世界地図で、緯線と経線が直角に交わる地図だ。この図法を採用した理由は、一般に広く使われていることに加え、計算が簡単になるからだ。そして、その地図上の位置から、地球上の緯度と経度を計算する。地球のモデルを作るといっても、地球上の座標を計算するだけである。

 

今回使った地図はこれ。ネット上で適当にとってきたから著作権とか大丈夫かな…。まあべつに悪用してるわけじゃないし大したことないだろう。

 

f:id:pepsisoda:20190916234218j:plain

 

そしてステレオ投影というのは、球上の点を平面上の点に投影する方法の一つだ。原点を中心に地球を置いて、地球上の点を北極から光を当てて赤道を通る平面に投影すると、南極が原点に、赤道上の点はある半径の円の中に、南半球の点は円の内側、北半球の点は外側、そして北極は無限遠に投影される。

 

f:id:pepsisoda:20190916232730p:plain

 

このような手法を使って、正距円筒図法の地図から、地球の新しい視点からの画像を作るというのが今回のプロジェクトの目標だ。もともとこのプロジェクトは、リーマン球面という数学の概念に着想を得ている。リーマン球面とは、無限に広がる複素数平面を、有限の面積を持った球面であらわすという概念であり、無限を有限に帰着させるという発想に驚いた。そして、これを逆に使って、有限の表面積を持つ地球を無限に広げたらどうなるか、と疑問に思い、このプロジェクトを始めた。

 

名前は、適当に「地球平面説」を意味するFlat Earthとした。丸い地球が、平らな面に投影されて広げられる様子から連想した。ところで、世の中には本気で地球が平らだと思っている連中がいるようだ。

 

このプロジェクトは、Jupyter Notebook上で、主にMatplotlibとNumPyを使ってPythonでコードした。もともと機械学習のプロジェクトでこれらのツールを使っていたのだが、NumPyの行列処理の練習も兼ねてこのプロジェクトもこれらを使ってやることにした。

 

なお、この記事では開発環境の設定などの説明はしないので、自分でやってみたい人は、各自で設定しておいてほしい。俺は、Windows 10でVirtualenvにJupyter Notebook、Matplotlib、Numpy、PILをインストールして開発した。正直Virtualenvはいらないが、各自の好みでやってほしい。

 

以下に、いくつか最終作品を掲載しておく。美しいでしょう?これらはすべて、上に掲載した世界地図の画像を変形して作られたのだ。

f:id:pepsisoda:20190916233825p:plain

 

f:id:pepsisoda:20190916233341p:plain

 

Jupyter NotebookはGitHubに公開してある。

 

github.com