宙畑 Sorabatake

Tellusの使い方

Tellus OSのエディタβ版で市町村別の人口密度を可視化! 自分だけの日本地図の作り方紹介

Tellus OSのエディタβ版を用いて市町村の人口密度を5段階に分けて色付けしてみました。

はじめに

本記事は大きく分けて以下2つのTellusの活用事例の紹介になります。

(1)Tellus OSのエディアβ版を利用した国内の市町村別人口密度マップのサンプルコード紹介と標高データとの2画面比較
(2)Tellusの開発環境を用いたTellus OSのエディア多β版表示用、人口密度マップの作成方法紹介

特に(1)のTellus OSのエディタβ版を用いた事例紹介はTellusの登録をしている方は誰でも、すぐに実践できるので、ぜひご自身のTellus OS上で試してみてください。

☆Tellusの登録がまだの方はこちらから

(1)Tellus OSのエディアβ版で国内の市町村別人口密度マップを表示してみよう

まずは、本記事の目玉であるTellus OSのエディタβ版を利用した市町村別の人口密度5段階色付けを皆さんのお手元で表示してみましょう。
※実行するためにはTellusの登録が必須になりますので、まだの方はこちらから登録をお願いします。

1.Tellus OSを開いてエディタβ版を開く

Tellus OSを開いたら、画面右上にあるエディアβ版をクリックしましょう。

Credit : さくらインターネット

2.エディタβ版の「user」をクリック

次に、「Example」の隣にある「user」をクリックします。

Credit : さくらインターネット

3.サンプルコードをコピー&ペースとして実行をクリック

コードを記入する画面が出るので、以下のサンプルコードをコピー&ペースとして、実行ボタンを押しましょう。

function drawGeo(url) {
  $.ajax({
    url: url,
    type: "GET",
    success: function (data) {
      L.geoJSON(data, {
        style: function (feature) {
          return {
            fillColor: getColor(feature.properties.JINKO_LEVEL),
            fillOpacity: 0.2,
            opacity: 0,
          };
        },
      }).addTo(map);
    },
  });
}

function getColor(level) {
  switch (level) {
    case 0:
      return "#ffffcc";

    case 1:
      return "#fed976";

    case 2:
      return "#fd8c3c";

    case 3:
      return "#e2191c";

    case 4:
      return "#800026";

    default:
      return "#ffffcc";
  }
}

for (var i = 1; i < 47; ++i) {
  drawGeo(
    "https://rawcdn.githack.com/sorabatake/article_population/master/population_density/" +
      i +
      ".geojson"
  );
}
Credit : さくらインターネット

少し待てば日本全国の市町村別の人口密度5段階色付けが可視化されます。都市部に人が集まっていることがよくわかりますね。

4.「2画面分割」をクリック

ここで市町村別の人口密度5段階色付けのデータと他のデータを比較してみましょう。比較する場合は2画面機能が便利です。Tellus OSの画面上にある「2画面分割」をクリックしましょう。

Credit : さくらインターネット

以下のように2画面になることが確認できると思います。

Credit : さくらインターネット

5.ライブラリから任意のデータを選択・表示して人口密度マップと比較して眺めてみる

Tellus OSでは様々なデータを確認することができます。本記事では「標高データ」「衛星データ(植生)」と比較してみます。

まずは植生データから確認してみましょう。

Credit : 国土地理院,さくらインターネット

やはり人が住んでいるところは基本的には植物を切り開いたところにあるため、緑がないところに人が住んでいるだろうということが分かりますね。

では、次に標高データを確認してみましょう。標高が高いところに住んでいる人も少ないような印象がありますが実際はどうなのでしょうか。

Credit : ASTER GDEM is courtesy of METI and NASA,さくらインターネット

植生ほどではありませんが、なんとなく標高が低いところに人が住んでいるようにも思いますが、信州地方は標高が高いところも人が住んでいるようですね。

本記事ではTellus OS上で2画面比較昨日で人口密度データとその他データの比較を紹介するするにとどめて、後日、人口密度と標高の相関を確認するという記事を公開予定です。

果たして標高データと人口密度に相関はあるのか、ぜひ読者の皆様に予想いただければと思います。

(2)Tellusの開発環境を用いたTellus OSのエディア多β版表示用「人口密度マップ」の作成方法紹介

では、Tellus OSのエディタβ版で5段階色付けをするためのデータ作成方法を紹介します。

1.市区町村毎のデータをダウンロードする。

市区町村毎のデータをe-Statからダウンロードしてきます。
都道府県ごとにダウンロードできるので、URLを叩いてダウンロードします。

まず、ダウンロードするためのURL一覧を作ります。

def convert_to_two_characters(x):
    string = str(x)
    if len(string) == 1:
        return "0" + string
    else:
        return string

urls = []

for i in range(1, 47):
    number = convert_to_two_characters(i)
    urls.append(f"https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212015&code={number}&coordSys=1&format=shape&downloadType=5")

これを実行すると、URLの一覧がurlsという変数に代入されます。
実際に表示させて変数を見てみましょう。

print(urls)

実行すると以下のように表示されます。

['https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212015&code=01&coordSys=1&format=shape&downloadType=5', 'https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212015&code=02&coordSys=1&format=shape&downloadType=5', 'https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212015&code=03&coordSys=1&format=shape&downloadType=5', 'https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212015&code=04&coordSys=1&format=shape&downloadType=5', 
...<省略>...
'https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212015&code=46&coordSys=1&format=shape&downloadType=5']

このURLを用いてファイルをダウンロードします。

先に今回必要なライブラリをインポートし、変数を定義しておきます。

from urllib.request import urlretrieve
import zipfile
import os
import geopandas as gpd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry.polygon import Polygon
from shapely.geometry.multipolygon import MultiPolygon

input_path = "shapefile" # 展開先フォルダ名

実際にダウンロードして、解凍してみましょう。

for i, url in enumerate(urls):
    shapefile_url = url
    shapefile_name = f"./data-zip/${i}.zip"

    # ダウンロード
    urlretrieve(url=shapefile_url, filename=shapefile_name)

    with zipfile.ZipFile(shapefile_name) as existing_zip:
        existing_zip.extractall(input_path)

実行すると、以下のようにinput_pathで指定したフォルダの中に解凍されたデータが入っていることが確認できます。

2.人口密度を計算し、5段階に分類して保存する

まず、都道府県ごとのデータを一つにまとめます。

files = os.listdir(input_path)
shapefiles = [file for file in files if ".shp" in file]

dataframes = []

for shapefile in shapefiles:
    shapefile_path = os.path.join(input_path, shapefile)
    df = gpd.read_file(shapefile_path, encoding='cp932')
    # 陸地だけにする
    df = df.loc[df["HCODE"] == 8101, :]
        
    dataframes.append(df)

japan = pd.concat(dataframes)

次に、今回ダウンロードしてきたデータは市区町村丁番まで区切りがあります。区切りが細かすぎると可視化した際に分かりづらくなってしまう可能性があるため、今回は市区町村レベルでの区切りに変更します。

japan = japan.dissolve(by="CITY_NAME", aggfunc='sum')

CITY_NAMEをkeyにして区切りを設定しています。

次に、人口密度レベルの範囲表を作ります。

まずはe-Statからダウンロードしてきたデータの中にはいろいろなプロパティがありますが、その中に「AREA」と「JINKO」というプロパティがあります。この2つを使用して人口密度を計算します。

そのあと、5段階に分けるので、人口密度の少ない順番に1/5ずつ範囲を区切り、その範囲の最大と最小を配列に入れます。

japan["JINKO_DENSITY"] = japan["JINKO"] / (japan["AREA"])
japan = japan.sort_values('JINKO_DENSITY', ascending=True)

計算が出来たら、5段階に分類する関数を定義します。

a = japan['JINKO_DENSITY'].values
splited_data = np.array_split(a, 5)

validators = []
for i in splited_data:
    validators.append((max(i), min(i)))

def level(num, state = 0):
    try :
        if (validators[state][1] <= num <= validators[state][0]):
            return state
        else:
            return level(num, state + 1)
    except Exception as e:
        print(e)

実際に5段階に分類して、ファイルに保存します。
日本全国で処理して保存してしまうとファイルサイズが大きすぎてTellusOSにimportできないので、都道府県ごとに処理します。

!mkdir data_with_hyoko

for index, prefecture in enumerate(dataframes):
    prefecture["JINKO_DENSITY"] = prefecture["JINKO"] / (prefecture["AREA"])
    prefecture = prefecture.sort_values('JINKO_DENSITY', ascending=True)
    prefecture['JINKO_LEVEL'] = prefecture['JINKO_DENSITY'].map(level)
    prefecture["HYOKO"] = (prefecture["PREF_NAME"] + prefecture["CITY_NAME"].map(remove_none)).map(get_height_from_location)
    prefecture.to_file(f"./data_with_hyoko/{index+1}.geojson", driver="GeoJSON")

これでTellus OSのβ版で読み込むためのデータの作成とファイル保存まで完了しました。

(3)まとめ

以上、本記事では市町村別の人口密度5段階色付けをTellus上で確認できるエディタβ版のコードを紹介し、開発環境を持っている方向けにその作成方法を紹介しました。

このようにTellusではライブラリにあるデータ以外にも公開されている様々なオープンデータを用いて地理空間情報の可視化と比較が可能になります。

ぜひTellusに登録して様々なデータの可視化を楽しんでみてください。

どんなオープンデータがあるのかについてはこちらの記事も合わせてご覧いただけますと幸いです。