Open In Colab

地理データの可視化#

本節では緯度・経度の情報をもつ、地理データを可視化する手法を学びます。

国土交通省のGISホームページから、滋賀県の地価公示データを取得します。

https://nlftp.mlit.go.jp/ksj/old/datalist/old_KsjTmplt-L01.html

!wget https://nlftp.mlit.go.jp/ksj/old/data/L01/L01-2022P/L01-2022P-25-01.0a.zip
!unzip -o L01-2022P-25-01.0a.zip
--2022-11-19 05:51:51--  https://nlftp.mlit.go.jp/ksj/old/data/L01/L01-2022P/L01-2022P-25-01.0a.zip
Resolving nlftp.mlit.go.jp (nlftp.mlit.go.jp)... 192.29.39.162, 192.29.39.48, 192.29.41.65
Connecting to nlftp.mlit.go.jp (nlftp.mlit.go.jp)|192.29.39.162|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 55443 (54K) [application/zip]
Saving to: ‘L01-2022P-25-01.0a.zip’

L01-2022P-25-01.0a. 100%[===================>]  54.14K  --.-KB/s    in 0.005s  

2022-11-19 05:51:51 (11.7 MB/s) - ‘L01-2022P-25-01.0a.zip’ saved [55443/55443]

Archive:  L01-2022P-25-01.0a.zip
   creating: L01-2022P-25-01.0a/
  inflating: L01-2022P-25-01.0a/KS-META-L01-2022P-2K_25.xml  
  inflating: L01-2022P-25-01.0a/L01-2022P-25-01.0a.html  
  inflating: L01-2022P-25-01.0a/L01-2022P-2K_25.csv  
from io import StringIO
import json

import pandas as pd
import plotly.express as px
shiga_land_price = pd.read_csv("./L01-2022P-25-01.0a/L01-2022P-2K_25.csv", encoding="cp932")
shiga_land_price.loc[:, ["経度", "緯度"]] = shiga_land_price.loc[:, ["経度", "緯度"]] / 3600
shiga_land_price.head()
経度 緯度 所在地コード 用途 連番 年次 前年所在地コード 前年用途 前年連番 市区町村名 ... 属性移動H25 属性移動H26 属性移動H27 属性移動H28 属性移動H29 属性移動H30 属性移動H31 属性移動R2 属性移動R3 属性移動R4
0 135.911983 35.108868 25201 0 1 2022 25201 0 1 大津 ... 40000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000
1 135.915560 35.122949 25201 0 2 2022 25201 0 2 大津 ... 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000
2 135.900566 35.097219 25201 0 3 2022 25201 0 3 大津 ... 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000
3 135.876694 35.074805 25201 0 4 2022 25201 0 4 大津 ... 10000000000000 10100000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000
4 135.972987 35.251884 25201 0 5 2022 25201 0 5 大津 ... 20000000000000 20000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000 10000000000000

5 rows × 126 columns

散布図#

Plotly Expressの scatter_mapbox 関数を利用して、地図上に散布図を描画します。

  • data_frame(第1引数): 描画対象のDataFrame

  • lat: 緯度が格納されている列名

  • lon: 経度が格納されている列名

  • size: 要素の大きさをとなる列名

  • color: 要素の色となる列名

  • hover_name: ホバーツールのタイトルとなる列名

  • hover_data: ホバーツールに表示するデータとなる列名

  • height: 描画領域の高さ

  • center: 中心となる位置を辞書で指定(lat: 緯度, lon: 経度)

  • zoom: 縮尺

scatter_mapbox 関数はmapboxというサービスのAPIを利用しています。デフォルトを含め、いくつかのスタイルはmapboxのアクセストークンを渡す必要がありますが、トークンを必要としないスタイル( layout.mapbox.style )もあります。

layout.mapbox.style

https://plotly.com/python/mapbox-layers/

mapboxアカウントは無料で作成でき、アカウント画面からアクセストークンが生成できます。

https://account.mapbox.com

px.scatter_mapbox(
    shiga_land_price,
    lat="緯度",
    lon="経度",
    size="R4価格",
    color="用途区分",
    hover_name="市区町村名",
    hover_data=["所在並びに地番"],
    center={"lat": 35.09, "lon": 136.18},
    opacity=0.5,
    width=800,
    height=800,
    mapbox_style="carto-positron",
).show()