2021/5/31地理空間情報を扱うなら知っておきたいPythonライブラリ、GeoPandas入門~基礎編~さまざまなデータを地理空間情報として重畳する上で有用なPythonのライブラリであるGeoPandas。前編ではGeoPandasを用いたデータの描画方法など基礎的な扱い方を紹介し、後編では衛星データと組み合わせて解析結果を可視化する方法を紹介します。Pythonで地理空間情報を行う場合、GeoPandasの使い方を覚えておくととても便利です。都道府県別の気象データを持っていたとします。そのテーブルデータ(csv)には地理情報と言えば、都道府県の名称くらいしかありません。このような場合、これを日本地図の上に重畳して可視化することはできません。このデータに地図上に描画できる情報を与えることさえできれば、好きなデータを地図の上に重ねることができます。このようなことをしたい場合に、GeoPandasの使い方を知っておけば助けになります。今回は、簡単な例を通じて、GeoPandasの魅力の一端を知ってみましょう。Colaboratoryを利用しています。ローカルでも動作します。仮にローカルで実行する場合には、いくつかの処理は必要ありませんので都度スキップしてください。・Plotlyを用いた可視化例について紹介します。地理空間情報とはいわゆるGISというものです。基礎中の基礎、画像の形式としてラスター、ベクターというものを思い出すに留め、この記事の後編では、実際にコードを動かしながら地理空間情報解析に必要な知識である、参照系の概念を説明します。(NEON)ラスターデータとは上のように格子状の中にデータが入ったものです。格子の大きさにより、画像の滑らかさが変わります。格子が細かいラスターデータは、より解像度の高い画像と考えらられ、格子が大きくなれば、荒い画像になります。この一つ一つの格子をピクセルと呼びます。ラスターはGeoPandasで扱うより、rasterioなどで扱うことが多いのですが、このピクセル座標を地理座標に置き換え、ピクセル一つ一つをテーブルデータとして扱うことができます。初めから地理座標を備えているGeoTIFFデータでは、この変換作業はとても楽です。(NEON)上の図を見れば明らかです。不鮮明な画像では、ピクセルの形がはっきりとわかりますが、高い解像度のものでは、ピクセルの形は捉えることができません。ラスターデータは単に写真のようなデータというわけではなく、ピクセルの中に入っている値を用いて発展的な解析を行います。代表的なものとして植生の活性度を示すNDVIやEVIがあります。他に、下図のように地表面温度の推定も求めることができます。sorabatakeピクセル座標が地理空間情報を含むと、実際に地図上にデータを重ねることができます。画像自身は自分がどこに当てはまるのかを知っていません。ここに参照となるデータを与えてあげる(georeference)と、画像データがどこに位置するべきなのかを判断できます。ベクターデータ続いてベクターです。ベクターはラスターと違い、格子の中にデータを持たない、ピクセルで構築されていないデータです。点のデータ、線のデータ、そしてポリゴンと呼ばれる多角形のデータがこれに当たります。Map上でお気に入りの場所に落としたピンがベクターデータになります。(NEON)上図を見るとわかるように、ポイントは、一つの座標で構成されています。ラインは少なくとも2点の情報が必要であり、その線は閉じていません。ポリゴンでは、複数の点、線が閉じることが条件となります。ベクターファイルの有名な形式としてはshp(shapefile)があります。GeoJSONも代表的なファイル形式と言えるでしょう。ベクターは数学的に記述されたデータであり、解像度という概念をもっていません。そのため拡大しても縮小しても、変化はありません。GeoPandasを触ってみようGeoPandasとはそもそも何なのか。GeoPandasとはPandasによるテーブルデータの処理と、Shapelyによる幾何学的なデータ処理を併せ持ったものになります。そこにmatplotlibによる描画支援も行われているため、地理空間情報を簡単なテーブルデータで処理できるだけでなく、ちょっとしたコマンドで直接描画まで行えるという優れものです。developers.言葉で説明するよりも、図で見るとわかりやすいです。地理空間情報は様々な形式がありますが、それを上図のようなテーブルにしてしまい、shapelyにより処理される幾何情報はgeometryという列に保存されています。このようなテーブルデータをGeoDataFrameと呼びます。geomtryでは・PointsまたはMulti-Points・LinesまたはMulti-Lines・PolygonsまたはMulti-Polygonsが基本的なオブジェクトとして扱われます。ColabでGeoPandas+αを使う準備をします。下記のセルを実行してください。GeoPandasには以下の依存関係があります。・numpy・pandas・shapely・fiona・pyproj詳しくは公式リファレンスをご覧ください。drivedrive.mount('/content/drive')ライブラリのインポートを行います。上記で全てがインストールされていれば、エラーなく実行できます。import*データを使って実際に解析をしてみましょう。今回は、e-statから初婚の平均年齢のデータをダウロードした上で可視化します。レイアウトをいじってからダウンロードしてありますが、それ以外には特に加工はしていません。pd.read_csv('/content/drive/MyDrive/Sorabatake/marriage.csv')データの中身を確認します。KBこちらはe-statからダウンロードしたものとなります。ダウンロード前にレイアウトをいじってからダウンロードしてありますが、それ以外には特に加工はしていません。ここでは、簡単なデータクリーニングも含めて進めていきましょう。marriageDf.head()marriageDf.describe(include='all')列名を変更します。marriageDf.loc[:,['夫・妻','都道府県(特別区−指定都市再掲)','時間軸(年次)','value']].\rename(columns={'夫・妻':'sex','都道府県(特別区−指定都市再掲)':'prefecture','時間軸(年次)':'year','value':'avgAge'}).copy()続いて、値も編集します。・都道府県レベルのみ抽出します。variables初婚年齢が最も低い値を探してみましょう。marriageDf.avgAge.min(),:]佐賀県の28.5歳と表示されます。初婚年齢が最も高い値を探してみましょう。marriageDf.avgAge.max(),:]東京都の32.5歳と表示されます。都道府県レベルで見ると、佐賀県が最も早く、東京都が最も遅く結婚していることがわかります。ベクターファイルの読み込みGADMからファイルをダウンロードします。シェープファイルをダウンロードし、解凍すると以下のファイルが含まれています。・.cpg・.dbf・.prj・.shp・.shxです。geopandasではシェープファイルを読み込む際に、.shpしか指定しません。GeoPandasでデータを読み込むためには、.shp、.dbf、そして.shxは同じフォルダに存在している必要があります。仮にこれらのファイルが欠けてしまっている場合、pythonはエラーを返します。解凍したファイルからshpだけを残して他のファイルを削除しないようにしましょう。gpd.read_file('/content/drive/MyDrive/Sorabatake/japanSHP/gadm36_JPN_1.shp')jpnShp.head()今回は行政レベル1を利用しているため、都道府県レベルでのデータを利用することができます。データフレーム内でgeometryの列が地図上に対象を描画するために必要な情報になります。geopandasではフィルタリングもお手の物です。Pandasに慣れている場合には、問題なくデータのクリーニングが行えます。データの操作を行う前に、簡単な可視化を行ってみましょう。以下の3行のコマンドで描画することが可能です。sorabatake今回は都道府県レベルのデータを利用していますので、境界も描画します。併せて、名前も重畳します。sorabatakeGeoDataFramedではShapelyとmatplotlibにより、簡単にベクターデータを可視化することができます。それでは、この図と先ほど取得したe-statのデータを結合し、さらに描画を行います。shpとcsvの結合シェープファイルのようなデータは、地図上にデータを投影するために必要なデータを既に持っています。単なるテーブルデータは、このようなデータを持っていません。今回のシェープファイルは都道府県の形を描画する以上のデータを含んでいません。果物の都道府県別収穫量のデーブルデータを持っているとして、一方でこのデータには地図上にデータを描くための情報は含まれていません。このような場合に上で示したシェープファイルを利用すれば、果物の収穫量を持った都道府県のデータ(GeoDataFrame)が作成できます。今回は、平均初婚年齢ですが、やることは同じです。check再度、描画を行います。今度は、2019年の平均初婚年齢を日本地図に重畳します。make_axes_locatable縮尺や方位を入れないとGIS屋さんに怒られるので、入れ忘れないようにしましょう。Pythonで縮尺を入れるためには、ScaleBarを利用するのが良いです(Cartopyを使えばもっと正確です)。※個人的にはPythonでの縮尺追加は面倒です。シンプルに論文で使える、プレゼンで使える地理空間情報の可視化であればRの方が楽に実行できます。ScaleBarでは1ピクセルあたりの長さと、その単にを指定する必要があります。今回は50とkmを指定していますので、1ピクセルあたり50kmという計算になります。750のみしか扱えませんので、縮尺と実際の長さにはややずれが生じることが考えられます。細かい精度まで気にしなければならない場合には、自分で緯度経度を基にして距離を算出して縮尺を作るのが良いと思います。sorabatake図を見ると、東京が平均初婚年齢が高いことが分かります。平均初婚年齢がやや若いのがわかるかと思います。このように、単に値としてみるより、地図で可視化するというのは、非常にわかりやすく、大まかな地理的な変異を捉えることに役立ちます。加えて女性も見てみましょう。sorabatake女性も傾向は同じですね!これらの図がコロプレスマップと呼ばれるものです。5年分をまとめて描画します。このようにすることで時間ごとの変化が分かりやすくなります。sorabatake2015〜2019の5年間で、傾向に大きな変化がないことがわかります。続けて、時系列動画(タイムラプス動画)を作成しましょう。地図の可視化では動画を見せる方が理解が早かったりします。今回は5年間のデータですが、これが30年間のような長いスケールになると、時間変化していく様子は動画の方が理解しやすくなります。動画作成手順としては、png画像を作成し、ffmpegを利用します。plt.close()画像の準備ができました。上の保存フォルダについては、ご自身の好きなフォルダで問題ありません。この画像を用いて、ffmpegで動画の作成を開始します。今回はターミナルのコマンドを持ちますので、!を先頭につけたコマンドを追加しています。"$imgDir/avgAgevideo.mp4"作成した動画はvlcなどの動画ソフトで閲覧が可能です。Plotlyを使う描画として、さらにPlotlyを利用してみましょう。こちらでは動的な可視化が行えるようになります。sorabatakeと思ったら、悲しい。日本の行政区域は含まれていないのですね。mapを描くことができます。こちらの記事をご参照ください。treemapであれば、地図に描画するのと同じように分かりやすく全体の違いを捉えることができます。そちらを試してみましょう。sorabatake同じように全体は掴みやすいのですが、地理的な変異を捉えることが難しいため、基本的は地図上で描画できるのが望ましいと思います。最後に、まとめて描画します。表示されるラベルは平均初婚年齢にしてあります。sorabatake数字が出るので分かりやすいです。結局、微妙な差異はあるものの、30歳というのが一つの目安になっているようです。平均ですので、世の中これより遅く結婚する人も早く結婚する人もいるわけです。いつ結婚するにしても、家庭円満でありたいものです。以上でGeoPandas入門(前編)を終わります。公式のドキュメントには様々な情報が記載されており、かなり勉強になる感じです。GISデータはRでも解析を行うことができます。Rでの地理空間情報解析の方が便利なパッケージが揃っており、かゆいところに手が届くという印象です。一方でPythonは高次元な配列情報を効率よく解析できるライブラリがある、また専門性の高い特殊なライブラリあり、そこがRに比べると強みかと思います。汎用性ではR、機械学習+深層学習+GISとか気象データ解析ならPythonといった具合でしょうか。以下はよく利用する地理空間解析のサイトです。2022/8/5植物の分布から田畑の利用状況を推測する衛星データの利活用方法Tellusでは、利便性(データのCOG化)と検索精度(APIのフォーマット統一)の向上を目指して、データ配信用APIの更新を行いました。それに伴い、今回は新しい配信用APIを利用してAVNIR-2のデータを取得する方法について、田畑の利用状況を推定する例を通してご紹介します。2021/6/1地理空間情報を扱う上で知っておきたいPythonライブラリ、GeoPandas入門~応用編・衛星データと組み合わせ~地理空間情報を解析する上で有用なPythonライブラリGeoPandas。後編では、衛星データとシェープファイルを組み合わせて解析することで、テーブルデータを作成することにチャレンジします。筆ポリゴンを任意の大きさのベクターデータで切り取り、切り取ったデータを用いて、衛星データをその範囲で取得し、NDVIの推移を求めます。2022/12/13衛星データを使って市区町村の緑地率を算出して平均寿命・自殺率との相関を調査してみた緑地の多さが認知症や脳卒中と関係があるとの論文を見つけました。Enginとオープンデータを使って、市区町村の緑地率と平均寿命・自殺率との相関関係を調査してみました。