パッケージ:tidyverse
,sf
,terra
,rnaruralearth
,rmapshaper
夜間光データのダウンロード
Average Visible, Stable Lights, & Cloud Free Coverages
:雲のない夜の夜間光の平均値を記録.F101992
:DMSP-F10によって観測された1992年の夜間光データ.F101992.v4b_web.stable_lights.avg_vis.tif.gz
を「すべて展開」し作業フォルダに格納.F101992.v4b_web.stable_lights.avg_vis.tif
(夜間光の平均強度を示すデータ)..tif
:画像ファイル形式の一つ.terra
パッケージに含まれるrast()
でデータを読込.オブジェクト名をnight1992
とする.install.packages("rnaturalearth")
,install.packages("rnaturalearthdata")
.World_map
)から日本地図(Japan_map
)を切り抜き.x
)110~155度,北緯(y
)20度~50度までの範囲.
st_bbox()
:境界ボックスの作成.crs
は世界測地系(4326
). 110, 155fareast_box
をst_as_sfc()
でポリゴンにする.st_intersects()
:World_map
からfareast_box_sfc
に収まる国(ポリゴン)を検索.st_intersects()
を利用するには,オブジェクトが(マルチ)ポイント,(マルチ)ライン,(マルチ)ポリゴンである必要.lengths()>0
: 重なるポリゴンを抽出しTRUEに.fareast
とする.#sfcオブジェクト(四角形のポリゴン)の作成
fareast_box_sfc <- fareast_box %>%
st_as_sfc()
#重なるポリゴン抽出
fareast <-
lengths(st_intersects(World_map, fareast_box_sfc))>0
World_map
からfareast==TRUE
を満たすメッシュを抽出(filter()).
.
ですべての変数を残す.fareast_map
とする.dplyr::filter()
と指示.日本周辺の可視化3
coord_sf()
で範囲を指定しないと,東西の広い範囲を示してしまう.ggplot()+
geom_sf(data=fareast_map, fill="white")+
coord_sf(xlim = c(110, 155), ylim = c(20, 50))+
labs(caption="出典:Natural Earth")+
ggtitle("日本周辺地図")
night1992
の観測数は膨大なため,これを可視するのも時間がかかる.
fareast_box
)内でnight1992
を切り抜き,データフレームに変換して可視する.crop()
:terra
パッケージに含まれるcrop()
で切り抜くデータを読込.こうすることで観測数を大きく減らせる.ext()
:切り抜く範囲(数値のリスト)の指示.ここでは,すでに作成したfareast_box
を利用.ggplot()
で可視するため,night1992
をデータフレーム(as.data.frame()
)に変更.
xy=TRUE
を指定することで,座標情報をデータフレームの列として取り込む.light
に変更.日本周辺の夜間光データの可視化
geom_raster()
:夜間光強度(night1992_df
のlight
列)の可視化.tran=sqrt
で夜間光強度の平方根を求める.平方根変換により暗いエリアの微妙な差違も可視.ggplot() +
geom_raster(data=night1992_df,
aes(x=x, y=y, fill=light))+
scale_fill_viridis_c(option="G", trans="sqrt")+
geom_sf(data=fareast_map, fill=NA, color="white")+
theme_void()+
coord_sf(xlim=c(110, 155), ylim=c(20, 50)) +
labs(fill="夜間光強度",
caption="出典:Natural Earth, Earth Observation Group")+
ggtitle("日本周辺夜間光(1992年)")
夜間光データのダウンロード
Monthly Cloud-free DNB Composite
:雲のない夜の夜間光の月平均値を記録.75N060E
:東京を含む日本の夜間光データ.東経(x
)60~180度,北緯(y
)0度~60度までの範囲のため日本全体を含んでいる.612M
:612メガバイト.SVDNB_npp_20200301-20200331_75N060E_vcmslcfg_v10_c202007042300.avg_rade9h.tif
(夜間光の平均強度を示すデータ).night203
とする.#行政区域の読込
Tokyo_map <- read_sf("N03-20220101_13_GML/N03-22_13_220101.shp")
Saitama_map <-
read_sf("N03-20220101_11_GML/N03-22_11_220101.shp")
Chiba_map <-
read_sf("N03-20220101_12_GML/N03-22_12_220101.shp")
Kanagagawa_map <-
read_sf("N03-20220101_14_GML/N03-22_14_220101.shp")
bind_rows()
:列名の並び順が異なっても,揃えて結合.データは下に加えられてゆく.#離島の市町村ダミーの作成
Tokyo_map <- Tokyo_map %>%
mutate(island=
ifelse(N03_007>=13361 & N03_007<=13421,
1, 0))
#離島の市町村を除いたシェープファイルの作成
Tokyo_map <- Tokyo_map %>%
subset(island!=1)
#1都3県合併
Greater_Tokyo <-
bind_rows(Saitama_map, Chiba_map,
Tokyo_map, Kanagagawa_map)
rmapshaper
パッケージのms_dissolve()
を使用.ms_dissolve()
:N03_001
列に県名が記載されているので,県単位で境界を統合.crs
は夜間光データ(nightGTY203
)に揃えて世界測地系(4326
).1都3県の可視化
GreaterTY_box
)でnightGTY203
を切り抜き,データフレームに変換して可視する.st_bbox()
:境界ボックスの作成.mask()
:ポリゴンに沿って不要な部分をNA
に変更.vect()
:Greater_Tokyo
(sfオブジェクト)をterra
の
SpatVector
に変換.#緯度経度(数値のリスト)
GreaterTY_box <- Greater_Tokyo %>%
st_bbox()
#夜間光データを東京都にあわせて切り抜き
nightGTY203 <- night203 %>%
crop(ext(GreaterTY_box))
#東京都の境界線に合わせて不要な部分を削除
nightGTY203 <- nightGTY203 %>%
mask(vect(Greater_Tokyo))
#ggpolt()で可視するためデータフレームに変更
nightGTY203_df <- nightGTY203 %>%
as.data.frame(xy=TRUE)%>%
rename(light=3)
1都3県の夜間光データの可視化
nW/㎠/sr
(ナノワット/平方センチメートル/ステラジアン).範囲は0以上の正の値であり,絶対的な値.ggplot()+
geom_tile(data=nightGTY203_df,
aes(x=x, y=y, fill=light))+
scale_fill_viridis_c(option="G", trans="sqrt")+
geom_sf(data=Greater_Tokyo, fill=NA, color="white")+
theme_void()+
labs(fill="夜間光強度(nW/㎠/sr)",
caption="出典:国土数値情報, Earth Observation Group")+
ggtitle("1都3県夜間光(2020年3月)")
nightGTY204_df
とする.
nightGTY203_df
と合併し(オブジェクト名:night_data
),変化率(change_rate
)を求める. nightGTY203_df <- nightGTY203_df %>%
rename(light_203=light)
nightGTY204_df <- nightGTY204_df %>%
rename(light_204=light)
night_data <-
left_join(nightGTY203_df, nightGTY204_df,
by=c("x", "y"))
night_data <- night_data %>%
mutate(change_rate=((light_204-light_203)/light_203)*100)
平均 | 標準偏差 | 最小値 | 最大値 | 観察数 | |
---|---|---|---|---|---|
変化率(%) | 0.90 | 19.09 | -91.85 | 1244.68 | 77646 |
night_data <- night_data %>%
mutate(change_rate=case_when(
change_rate>100 ~"(100, 1250)",
change_rate>50 & change_rate<=100 ~ "(50, 100]",
change_rate>10 & change_rate<=50 ~ "(10, 50]",
change_rate>0 & change_rate<=10 ~ "(0, 10]",
change_rate>-10 & change_rate<=0 ~ "(-10, 0]",
change_rate>-50 & change_rate<=-10 ~ "(-50, -10]",
change_rate>-100 & change_rate<=-50 ~ "(-100, -50]"))
factor()
を用いて凡例の順番を指定.night_data <- night_data %>%
mutate(change_rate=factor(change_rate,
levels=c("(100, 1250)",
"(50, 100]",
"(10, 50]",
"(0, 10]",
"(-10, 0]",
"(-50, -10]",
"(-100, -50]")))
geom_sf()
を用いて可視するため,データフレームのnight_data
をsf
オブジェクトに変換.夜間光強度変化率の可視化
scale_color_brewer()
:カテゴリーデータ(離散値)の色分け.ggplot() +
geom_sf(data=night_data, aes(color=change_rate)) +
scale_color_brewer(palette="RdBu")+
geom_sf(data=Greater_Tokyo, fill=NA)+
theme_void()+
labs(color="夜間光強度変化率(%)",
caption="出典:国土数値情報, Earth Observation Group") +
ggtitle("1都3県夜間光(2020年3月~4月)")
Rによる地理空間データの可視化
チュートリアルホーム
アイコン
Font Awesome 6.7.2
生成AIの使用について
作成過程において,ChatGPTを使用してコードの最適化に関する助言を得た.サービスを利用した後,内容を確認し,必要に応じて編集を行った.
Google Earth Engineを用いて,必要な範囲だけを取得可能な模様.Qitta←検索欄に検索ワード「Google Earth Engine 夜間光」を入力して検索.神奈川大学経済学部浦沢聡士研究室もこのサービスを利用して夜間光データを可視化.↩︎
Natural Earthの利用方法の詳細はNatural Earthの地理空間データの可視化参照.↩︎
地図の国境線については,学術誌(Elsevier,Wiley)では次のような注意書きが求められる場合がある.「Map lines delineate study areas and do not necessarily depict accepted national boundaries」.↩︎
カテゴリー化についてはコミュニティバス路線上の人口密度の可視化を参照.↩︎