【R】数値標高データの結合
2020年7月12日
こちらでは、国土地理院の基盤地図情報ダウンロードサービスでダウンロードできる「数値標高モデル」を表示してみました。ただ、データが1km四方の1つのデータに限られていました。
そこで今回は、もっと広い範囲を表示すべくデータの結合を行います。
今回も、こちらのサイトを参考にさせていただきました。
データは、同じく陣馬山周辺のデータで下記の通りです。
> files
[1] "./FG-GML-5339-31-60-DEM5A-20161001.xml" "./FG-GML-5339-31-61-DEM5A-20161001.xml"
[3] "./FG-GML-5339-31-62-DEM5A-20161001.xml" "./FG-GML-5339-31-63-DEM5A-20161001.xml"
[5] "./FG-GML-5339-31-64-DEM5A-20161001.xml" "./FG-GML-5339-31-65-DEM5A-20161001.xml"
[7] "./FG-GML-5339-31-66-DEM5A-20161001.xml" "./FG-GML-5339-31-67-DEM5A-20161001.xml"
[9] "./FG-GML-5339-31-68-DEM5A-20161001.xml" "./FG-GML-5339-31-70-DEM5A-20161001.xml"
[11] "./FG-GML-5339-31-71-DEM5A-20161001.xml" "./FG-GML-5339-31-72-DEM5A-20161001.xml"
[13] "./FG-GML-5339-31-73-DEM5A-20161001.xml" "./FG-GML-5339-31-74-DEM5A-20161001.xml"
[15] "./FG-GML-5339-31-75-DEM5A-20161001.xml" "./FG-GML-5339-31-76-DEM5A-20161001.xml"
[17] "./FG-GML-5339-31-77-DEM5A-20161001.xml" "./FG-GML-5339-31-78-DEM5A-20161001.xml"
[19] "./FG-GML-5339-31-80-DEM5A-20161001.xml" "./FG-GML-5339-31-81-DEM5A-20161001.xml"
[21] "./FG-GML-5339-31-82-DEM5A-20161001.xml" "./FG-GML-5339-31-83-DEM5A-20161001.xml"
[23] "./FG-GML-5339-31-84-DEM5A-20161001.xml" "./FG-GML-5339-31-85-DEM5A-20161001.xml"
[25] "./FG-GML-5339-31-86-DEM5A-20161001.xml" "./FG-GML-5339-31-87-DEM5A-20161001.xml"
[27] "./FG-GML-5339-31-88-DEM5A-20161001.xml"
読み込むデータのリストを作ります。
library(tidyverse) library(xml2) library(ggplot2) library(jpmesh) library(sf) library(raster) library(cptcity) # 結合したいxmlファイルをベクトルにします files <- list.files(pattern = ".+5339-31-[6-8][0-8].+.xml$", full.names = TRUE)
データからラスターデータを作り出す処理を関数にします。
dem_xml2df <- function(file) { xml2::read_xml(file) %>% xml2::xml_find_all("/*/*/*/gml:rangeSet/gml:DataBlock/gml:tupleList") %>% xml2::xml_contents() %>% as.character() %>% readr::read_delim(delim = ",", col_names = c("type", "value")) } set_coords <- function(raster, meshcode){ m <- jpmesh::export_mesh(meshcode) bb <- m %>% sf::st_bbox() %>% as.numeric() raster::extent(raster) <- raster::extent(bb[1], bb[3], bb[2], bb[4]) raster::crs(raster) <- sp::proj4string(as_Spatial(m)) raster }
結合データをつくります。
raster_dem_list <- purrr::map2( files, stringr::str_remove_all(basename(files), "FG-GML-") %>% stringr::str_remove_all("-DEM5A-20161001.xml") %>% stringr::str_remove_all("-"), ~ dem_xml2df(.x) %>% dplyr::pull(value) %>% matrix(nrow = 225, ncol = 150) %>% t() %>% raster() %>% set_coords(.y) ) raster_dem_merged <- raster_dem_list %>% purrr::reduce(merge)
プロットしてみます。
plot(raster_dem_merged) plot(rasterToContour(raster_dem_merged), add = TRUE) title(main = "数値標高モデル (5mメッシュ): 533931", sub = "データ:国土地理院 基盤地図情報数値標高モデル")
ちゃんとデータが結合されて、陣馬山だけではなく、その周辺の山塊も表示できています。OpenStreetMapでも見てみます。
mapview::mapview(raster_dem_merged, alpha.regions = 0.2)
もう少し、美しく表示してみます。
df_alt <- as.data.frame(raster_dem_merged, xy = TRUE) %>% tibble::as_tibble() %>% dplyr::rename("Elevation" = layer) ggplot() + geom_raster(data = df_alt , aes(x, y, fill = Elevation), hjust = 0, vjust = 0) + scale_fill_gradientn(colours = cptcity::cpt(pal = cptcity::cpt_names[[4]], n = 50)) + geom_contour(data = df_alt, aes(x, y, z = Elevation), col = "white", size = 0.2) + coord_quickmap() + theme_void(base_family = "IPAexGothic") + theme(legend.key.height = unit(2, "lines")) + labs(title = "陣馬山周辺", caption = "データ:国土地理院 基盤地図情報数値標高モデル")