見出し画像

pythonでする地理空間データ入門~GeoPandas~

コグラフ株式会社データアナリティクス事業部の平松です。
今回は、地理空間データ(GISデータ)の簡単な処理や、説明をします。
なんせ検索してもGeopandasの記事が少ないです。だから私が書きます!これからはGeopandasの公式ドキュメントだけでなく、コグラフの記事も参考にしましょう!!!

もう内容入ります。


GeoPandasとは

GeoPandaspandasの拡張で、「GeoDataFrame」を処理、操作できるライブラリです。地理空間データフレームを用いて、ジオメトリおよび地理空間データを操作するものです。
とにかくやって、感覚で覚えた方がいいです。
とりあえず点(ポイント)、線(ライン)、面(ポリゴン)からなる地理データを扱えるとだけ思っておいて下さい!

また、地理空間データジオデータといい、こっちの呼び方のほうが現場では良く使われます。
あと、ジオパンダスとは言わず、みんなジオパンといっていますね。
あくまで私の現場での話ですが、、。なんか可愛いですよね笑

色々な言い方をする人はいますが、地理空間データ≒ジオデータ≒GISデータ
どれもいい方は違いますがおそらく皆さん同じものを指して言っています。

コードでの解説

import geopandas as gpd
import shapely
import folium
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors

import glob
import platform

ライブラリやモジュールをインポートします。
皆さんご存じのpandas、numpy、matplotlibを入れます。

  • geopandas:Pandasによるテーブルデータの処理と、Shapelyによる幾何学的なデータ処理を併せ持ったもの

  • shapely:ジオメトリの操作および分析のために使います。二点間の距離を計測したり、エリアの面積を計測することができます。

  • folium:foliumはleaflet.jsというJavascriptで使用することのできるマップをPythonライブラリ化したものです。Pythonで簡易的にマップを用いてデータの可視化を行えます。

  • glob:ワイルドカード*などの特殊文字を使って条件を満たすファイル・ディレクトリ(フォルダ)などのパスの一覧をリストやイテレータで取得できます。

  • platform:Pythonが実行されている環境のOSやそのバージョン(リリース)情報などを取得できる。


Pythonのバージョン

platform.python_version()

最新ではないですが、ご容赦下さい、、。

フォルダ内のシェイプファイルのパスを全て取得

shpfiles = [shpfile for shpfile in glob.glob('------/地理空間データ/A31-21_13_GML/02_想定最大規模/SHP/*.shp')]

globを使うとフォルダ内のパスを全て取得できます。
このコードでは語尾が、/*shp') となっているので、シェイプファイルのみ全て取得しているという意味です。
シェイプファイルとは、 GISデータの一つで道路や建物などの位置や形状、属性情報を持つベクターデータを格納することができます。

GISデータ:地理情報システム (Geographic Information System) で使用されるデータのことです。

  • 都市、河川、山岳、道路、建物などを表すデータで、それらの要素を持つ地図画像を含むこともできます。地理的な関係性を可視化したり、空間データを分析したりするために使用されます。

  • GISデータには、種類があり、今記事の内容で扱う①ベクターデータ、②ラスターデータ、③メタデータなどが代表例です。

ファイルはこれです。

国土交通省の国土数値情報の想定最大規模というデータを使用しました。
下記はダウンロードサイトとZIPファイルです。


東京都令和3年のデータをダウンロード



想定最大規模のデータを使用
  1. ベクター データ:点と線を数学的な形式で表現する図形データです。ポイント、ライン、ポリゴンなどを指します。

  2. ラスターデータ:地図上の要素を格子状に並んだピクセルで表すデータです。地図画像や地形図はラスターデータとして表されます。

  3. メタデータ:GISデータの詳細を示すデータです。GISデータがどのような形式で保存されているか、どのような地理的基準が使用されているか、どのような地図投影法が使用されているかなどはメタデータとして表されます。

取得したデータを全て結合

df = pd.concat([gpd.read_file(shpfile, encoding='SJIS') for shpfile in shpfiles])
df
出力結果

read_file()関数でシェイプファイルのデータを読み込むことができます。
この書き方はリスト内包表記といい、覚えておくといいです。
綺麗で簡潔なコードがかけるようになります。

geometryカラムにはポリゴンデータが入っています。
ポリゴンデータとは、直訳すると「多角形」という意味を持ちます3点以上の頂点を結んでできた多角形データのことを指します。
つまり、1点は緯度、経度でできており、それが3点以上格納されているデータです。

ポリゴンデータの可視化

df.plot(alpha=0.4, cmap='jet', figsize=(10, 10))
plt.show()
出力結果

可視化します。
cmapはプロットで使われるカラーマップの色を指定するパラメータです。
上記のマップはgeometryの可視化です。

df['geometry'].head(30).plot(alpha=0.4, cmap='jet', edgecolor='black', figsize=(10, 10))
plt.show()
出力結果

拡大すると多角形の集合であることがよく分かると思います。
四角形の場合、緯度経度のセットアップが4つあるということです。

ラインデータの可視化

可視化したポリゴンデータをラインデータに変更し可視化してみます。
boundaryメソッドで簡単にポリゴンをラインに変えることができます。

df['line'] = df['geometry'].boundary
df['line']
出力結果

LINESTRINGはラインです笑
ポイントの配列がラインを形成しているイメージになります。
ポリゴンデータのライン版です笑
見た方が早いですね。

df['line'].head(30).plot()
出力結果

面ではなく、線で表現されたgeometryがLINESTRINGです。

面積を求める

df['area'] = df['geometry'].area
display(df['area'])

area_sum = df.groupby(['A31_205'])['area'].sum()
plt.bar(area_sum.index, area_sum)
出力結果 display(df['area'])

areaメソッドでポリゴンの面積を求めることができます。
下記は一応、浸水深ランクごとに面積の総和を可視化しました。
ランクが高い(よりリスクが高い)ほど地域(面積)は少なくなることが分かります。

出力結果 plt.bar(area_sum.index, area_sum)

地図上に可視化してみる

del df['line']

df['color'] = 'cornflowerblue'
map = folium.Map(location=[35.65, 139.5], zoom_start=11, titles='OpenStreetMap')

def style(feature):
    return{
        'fillcolor': feature['properties']['color'],
        'color': feature['properties']['color'],
        'weight': 1
    }
folium.GeoJson(data=df.to_json(), style_function=style).add_to(map)

tocyou = [35.6895014, 139.6917337]
folium.Marker(location=tocyou, popup='<i>都庁<i>', tooltip='クリック').add_to(map)
map
出力結果

foliumを使って地図上にポリゴンデータを可視化しています。
df['color']で色を決めています。

map=folium.Map(location=座標, tiles="タイル名", zoom_start=整数)

  • foliumモジュールのMap関数で地図を可視化できます。

  • 引数のlocationで可視化する場所を指定しており、入力するものは経度、緯度です。

  • location=[経度, 緯度] zoom_startでスタート時の拡大、縮小の調整ができます。 左上の+−のポップアップで拡大、縮小を調整できます。

defでは、
filoum、geojasonの引数であるstyle_functionで指定するものを定義しています。
毎度書くのは少々面倒なので、使いまわせます。

geometryはgeojson形式でないとマップ上に可視化できません。
しかし、geojson( )関数にはjson形式のデータしか入りませんので、データをjson形式にしてからgeojson形式にします。
そしたら、add_to(map)で適応し可視化準備完了です。

folium.Marker(location=座標, popup="ポップアップ表示名").add_to(マップオブジェクト)

  • foliumのMarker( )関数で地図上にピンを打つことができます。

  • ピンの色はデフォルトで青、ピンの座標:[緯度, 経度] で指定できます。

  • popup="クリック" は、 ピンをクリックかタップすると表示される名称を指定できます。

今回の例では「都庁」の緯度経度をベタ打ちで格納していますが、geopyライブラリを使えば、住所を記入するだけで緯度経度データが分かります。
※環境によっては可視化できない場合があります。
ご了承下さい。


データ分析に興味のある方募集中!

コグラフ株式会社データアナリティクス事業部ではPythonやSQLの研修を行った後、実務に着手します。
研修内容の充実はもちろん、経験者に相談できる環境が備わっています。
このようにコグラフの研修には、実務を想定し着実にスキルアップを目指す環境があります。
興味がある方は、下記リンクよりお問い合わせください。

X(Twitter)もやってます!

コグラフデータ事業部ではX(Twitter)でも情報を発信しています。
データ分析に興味がある、データアナリストになりたい人など、ぜひフォローお願いします!


この記事が参加している募集

仕事について話そう

仕事のコツ

with 日本経済新聞

この記事が気に入ったらサポートをしてみませんか?