🗾

Juliaでgeojsonから地図をプロットする

2023/04/17に公開

geojsonファイルから地図を描写します. ドキュメントが少なく, 結構難しかったので記事にしておきます.

パッケージ

描写にはPlots.jl, geojsonファイルの読み込みにはGeoJSON.jlを用います. これだけでも描写は可能ですがデータの扱いを簡単にするためにDataFrames.jlを用いました.

# using Pkg
# Pkg.add("Plots")
# Pkg.add("GeoJSON")
# Pkg.add("DataFrames")
using Plots
using GeoJSON
using DataFrames

Hello World!

geojsonファイルはこちらのサイトのGeojson ファイルからダウンロードして使用させて頂きます. なお, 研究などで使う場合は元ファイルを国土数値情報ダウンロードサイトから入手して使ってください. read()でそのファイルを読み込み, GeoJSON.read()でパースします. .geometryplot()に渡せば描写できます. savefig()で保存できます. SVGだとかなり重いのでPNGで保存することをお勧めします.

jsonbytes = read("./prefectures.geojson") # ここでダウンロードしたファイルを指定
japan = GeoJSON.read(jsonbytes)
plot(japan.geometry, fmt=:png)

例えば神奈川県は下記のように描写できます.

plot(japan[14].geometry, fmt=:png)

DataFrame

データフレームに収めると, より扱いやすくなります. 特に複数の県のみ描写するなどの場合に便利です. まずは先ほどの結果を再現していきます.

jsonbytes = read("./prefectures.geojson") # ここでダウンロードしたファイルを指定
japan = GeoJSON.read(jsonbytes)
df = DataFrame(japan)
plot(df[:, :geometry], fmt=:png)

例えば神奈川県は次のように抜き出せます.

df[14, :name]
"神奈川県"
plot(df[14, :geometry], fmt=:png)

複数の県を描写する場合は下記のように扱います.

df[[11,14], :name]
2-element Vector{String}:
 "埼玉県"
 "神奈川県"
plot(df[[11,14], :geometry], fmt=:png)

実用例

自分がこれまでに使った例を示します. まず, 良い感じの日本を描きます.

# 日本全体を描写
plot(
    df[:, :geometry],
    xlims=(127,149),
    ylims=(30,46),
    ticks=false,
    framestyle=:none,
    foreground_color=:transparent,
    background_color=:transparent,
    fmt=:png,
    size=(420,420),
    fill="#3FBCBC",
    lc="#FFFFFF",
    lw=0.5
)

例えば神奈川だけ塗りつぶす場合は下記のようにplot!()を使って上から神奈川県だけ色を変えて重ねて描写します.

# 日本全体を描写
plot(
    df[:, :geometry],
    xlims=(127,149),
    ylims=(30,46),
    ticks=false,
    framestyle=:none,
    foreground_color=:transparent,
    background_color=:transparent,
    fmt=:png,
    size=(420,420),
    fill="#3FBCBC",
    lc="#FFFFFF",
    lw=0.5
)

# 神奈川だけ色を変える
plot!(
    df[14,:geometry],
    fill="#BC1C5F",
    lc="#BC1C5F",
    lw=1
)

例えば神奈川だけ塗りつぶす場合は下記のようにplot!()を使って上から神奈川県だけ色を変えて重ねて描写します.

# 日本全体を描写します
plot(
    df[:, :geometry],
    xlims=(127,149),
    ylims=(30,46),
    ticks=false,
    framestyle=:none,
    foreground_color=:transparent,
    background_color=:transparent,
    fmt=:png,
    size=(420,420),
    fill="#3FBCBC",
    lc="#FFFFFF",
    lw=0.5
)

# 神奈川だけ色を変える
plot!(
    df[[11,14],:geometry],
    fill="#BC1C5F"
)

# 保存
# savefig("Japan.svg")
# plot!()

関東だけ拡大する場合はxlimsylimsを変更します.

# 関東だけ拡大して表示
plot(
    df[:, :geometry],
    xlims=(138.3,140.9),
    ylims=(34.8,37.2),
    ticks=false,
    framestyle=:none,
    foreground_color=:transparent,
    background_color=:transparent,
    fmt=:png,
    size=(420,420),
    fill="#9BDEDE",
    lc="#FFFFFF",
    lw=1
)

例えば神奈川県だけ表示したい場合は先ほどと同様に

# 関東だけ拡大して表示
plot(
    df[:, :geometry],
    xlims=(138.3,140.9),
    ylims=(34.8,37.2),
    ticks=false,
    framestyle=:none,
    foreground_color=:transparent,
    background_color=:transparent,
    fmt=:png,
    size=(420,420),
    fill="#9BDEDE",
    lc="#FFFFFF",
    lw=1
)

# 神奈川だけ赤く
plot!(
    df[14,:geometry],
    fill="#F099BD",
    lc="#FFFFFF",
    lw=1
)

特定の座標に何かを表示したい場合は, Google Mapで座標を取得しましょう.scatter!()などで表示できます.

# 関東だけ拡大して表示
plot(
    df[:, :geometry],
    xlims=(138.3,140.9),
    ylims=(34.8,37.2),
    ticks=false,
    framestyle=:none,
    foreground_color=:transparent,
    background_color=:transparent,
    fmt=:png,
    size=(420,420),
    fill="#9BDEDE",
    lc="#FFFFFF",
    lw=1
)

# 横浜市立大学を赤く
scatter!(
    [139.61798765489436],
    [35.33357678717215],
    label="",
    ms=8,
    msw=0,
    mc="#BC1C5F"
)

この記事は下記の地図を自己紹介で使うためにプロットしたことをきっかけに執筆されました.

# 関東だけ拡大して表示
plot(
    df[:, :geometry],
    xlims=(138.3,140.9),
    ylims=(34.8,37.2),
    ticks=false,
    framestyle=:none,
    foreground_color=:transparent,
    background_color=:transparent,
    fmt=:png,
    size=(420,420),
    fill="#9BDEDE",
    lc="#FFFFFF",
    lw=1
)

# 神奈川と埼玉だけ赤く
plot!(
    df[[11,14],:geometry],
    fill="#F099BD",
    lc="#FFFFFF",
    lw=1
)

# 赤く
data = [
    139.61798765489436 35.33357678717215
    139.6125210186868 35.78115678928948
]

# 矢印
GR.setarrowsize(2)
plot!(
    data[:,1],
    data[:,2],
    label="",
    arrow=:closed,
    lc="#BC1C5F",
    lw=3,
)

# # 保存
# savefig("YCU2RIKEN.svg")
# plot!()

ノートブック

https://gist.github.com/ohno/c485817d2b10d8a0b18578577212b72a

Discussion