jpmeshパッケージ(バージョン2.0.0)をCRAN登録しました

geospatial release

地域メッシュを扱うRパッケージのjpmeshがバージョンアップしました。最新バージョン(2.0.0)はCRANからインストール可能です。 主な変更点はメッシュコードを表現するためのmeshcodeクラスの実装、100mメッシュコードへの対応、処理の高速化です。

Shinya Uryu https://twitter.com/u_ribo
2020-11-26

日本国内で利用される「地域メッシュ(メッシュコード)」をRから容易に利用可能にするパッケージ、jpmeshパッケージの更新を行いました。バージョン1.2.1から2.0.0へのメジャーアップデートとなります。

大きな変更点は次の3点です。

この記事では、アップデートに伴うこれらの内容について解説します。なおmeshcodeクラスが実装されたことで出力結果が変わりますが、ユーザが実行するコードには大きな変更はなく、これまでと同じコードでパッケージの機能を利用可能です。

パッケージのインストールは次のコマンドで実行します。

install.packages("jpmesh")

開発版の利用に興味がある方は以下のリンクを辿ってください。開発を支援してくださるスポンサーも募集しています。

まずはメッシュコードを表現するための新しいクラス、meshcodeについて見ていきましょう。

meshcodeクラス

meshcodeクラスは、今回リリースされたjpmeshバージョン2.0.0で追加されたS3ベースのクラスです。メッシュコードを表現することを目的としており、jpmeshが返却するメッシュコードの値はmeshcodeクラスによって実装されています。

meshcodeクラスのオブジェクトはmeshcode()によって生成します。引数に有効なメッシュコードを与えることでmeshcodeオブジェクトを得られます。この時、メッシュコードの値は文字列であっても数値であっても構いません。以下に80km、1kmメッシュのmeshcodeオブジェクトを生成するコードを示します。

meshcode(4830) # 80km
<meshcode[1]>
[1] 4830
m <- meshcode(48302626) # 1km
m
<meshcode[1]>
[1] 48302626
class(m)
[1] "meshcode"   "vctrs_rcrd" "vctrs_vctr"

パッケージ独自のクラスを用意することで、数値や文字列ではなく、メッシュコードであることがわかりやすくなりました。

meshcodeオブジェクトはmesh_codeとmesh_sizeの2つの属性を持ちます。mesh_sizeがmeshcodeそのものに記録されていることで、メッシュの大きさを確認することが容易になります。

vctrs::fields(m)
[1] "mesh_code" "mesh_size"
1 [km]
# mesh_size()の代わりにvctrs::field()でメッシュサイズを参照できます
vctrs::field(m, "mesh_size")

meshcode()ではメッシュの大きさが異なるメッシュコードを一つのオブジェクトとして格納できます。

m <- 
  meshcode(c(6240, 624011, 62401123))
mesh_size(m)
Units: [km]
[1] 80 10  1

既存の関数が返すメッシュコードもmeshcodeオブジェクトとして扱われます。

coords_to_mesh(141.3468, 43.06462, mesh_size = 1)
<meshcode[1]>
[1] 64414277
<meshcode[64]>
 [1] 624000 624001 624002 624003 624004 624005 624006 624007 624010
[10] 624011 624012 624013 624014 624015 624016 624017 624020 624021
[19] 624022 624023 624024 624025 624026 624027 624030 624031 624032
[28] 624033 624034 624035 624036 624037 624040 624041 624042 624043
[37] 624044 624045 624046 624047 624050 624051 624052 624053 624054
[46] 624055 624056 624057 624060 624061 624062 624063 624064 624065
[55] 624066 624067 624070 624071 624072 624073 624074 624075 624076
[64] 624077
coarse_gather(493214294)
<meshcode[1]>
[1] 49321429
set.seed(123)
rmesh(1)
<meshcode[1]>
[1] 40407457

100mメッシュコード

メッシュコードの一つに、1kmメッシュコードを分割した100mメッシュコードがあります。100mメッシュコードは10桁の数値で表現されますが、これは既存の250mと同じ桁数です。250mメッシュコードは先述のmeshcodeクラスによって表現されます。そのため、100mメッシュコードを実装する際にこれらのメッシュを識別するための仕組みが必要でした。そこでmeshcodeクラスとは別のsubdiv_meshcodeクラスを用意しました。このクラスは100mメッシュコードを表現するために使われます。

100mメッシュを得るにはmeshcode()に10桁のメッシュコードを与え、引数.type = "subdivision"を指定して実行します。(10桁のメッシュコードを与えた際の既定ではmeshcodeクラス、すなわち250mメッシュとして扱われます)

m <- 
  meshcode(6240112300, .type = "subdivision")
m
<subdiv_meshcode[1]>
[1] 6240112300
class(m)
[1] "subdiv_meshcode" "vctrs_rcrd"      "vctrs_vctr"     
0.1 [km]

fine_separate()により1kmメッシュから100mメッシュにスケールダウンする際も、.type = "subdivision"を指定します。

class(fine_separate(45313747, .type = "subdivision"))
[1] "subdiv_meshcode" "vctrs_rcrd"      "vctrs_vctr"     

memoise

最後は性能に関する内容です。jpmeshパッケージのいくつかの関数は実行結果を得るのに数十秒以上かかるものがありました。具体的には、対象の市町村が属するメッシュコードを返却するadministration_mesh()や任意のサイズのメッシュコードをリストアップするmeshcode_set()です。これらの関数の実行時間に対する障壁は、対象となるメッシュコードの数の多さにありました(メッシュサイズを小さくするほど候補が増える)。

この問題を解決するため、実行結果をキャッシュ化、キャッシュの利用により再実行時に高速に結果を得ることが期待できるmemoiseパッケージを導入しました。

セッションを起動し直すとキャッシュが消えてしまいますが、セッション中はキャッシュの利用により素早く結果を得られます。次のコードでのadministration_mesh()の実行時間に注目ください。

tictoc::tic()
invisible(administration_mesh(code = "35201", to_mesh_size = 1))
tictoc::toc()
15.536 sec elapsed
tictoc::tic()
invisible(administration_mesh(code = "35201", to_mesh_size = 1))
tictoc::toc()
2.43 sec elapsed

手元の環境で10秒ほどかかっていたものが1秒程度に短縮されました。memoiseのキャッシュ化はadministration_mesh()meshcode_set()といった一部の関数での提供になりますが、パッケージを使う上で高速化の効果を実感できると思います。是非お試しください。

Session Information

package version attached date source
data.table 1.13.2 TRUE 2020-10-19 CRAN (R 4.0.2)
fgdr 1.1.0 TRUE 2020-09-30 CRAN (R 4.0.2)
jpmesh 2.0.0 TRUE 2020-11-26 CRAN (R 4.0.3)
terra 0.9-8 TRUE 2020-11-13 CRAN (R 4.0.2)
package version attached date source
abind 1.4-5 FALSE 2016-07-21 CRAN (R 4.0.2)
assertthat 0.2.1 FALSE 2019-03-21 CRAN (R 4.0.2)
bookdown 0.21 FALSE 2020-10-13 CRAN (R 4.0.3)
class 7.3-17 FALSE 2020-04-26 CRAN (R 4.0.3)
classInt 0.4-3 FALSE 2020-04-07 CRAN (R 4.0.2)
cli 2.2.0 FALSE 2020-11-20 CRAN (R 4.0.2)
codetools 0.2-18 FALSE 2020-11-04 CRAN (R 4.0.2)
crayon 1.3.4 FALSE 2017-09-16 CRAN (R 4.0.2)
crosstalk 1.1.0.1 FALSE 2020-03-13 CRAN (R 4.0.2)
data.table 1.13.2 TRUE 2020-10-19 CRAN (R 4.0.2)
DBI 1.1.0 FALSE 2019-12-15 CRAN (R 4.0.2)
digest 0.6.27 FALSE 2020-10-24 CRAN (R 4.0.2)
distill 1.0 FALSE 2020-10-22 CRAN (R 4.0.3)
downlit 0.2.1 FALSE 2020-11-04 CRAN (R 4.0.2)
dplyr 1.0.2 FALSE 2020-08-18 CRAN (R 4.0.2)
e1071 1.7-4 FALSE 2020-10-14 CRAN (R 4.0.2)
ellipsis 0.3.1 FALSE 2020-05-15 CRAN (R 4.0.2)
evaluate 0.14 FALSE 2019-05-28 CRAN (R 4.0.1)
fansi 0.4.1 FALSE 2020-01-08 CRAN (R 4.0.2)
fastmap 1.0.1 FALSE 2019-10-08 CRAN (R 4.0.2)
fgdr 1.1.0 TRUE 2020-09-30 CRAN (R 4.0.2)
fs 1.5.0 FALSE 2020-07-31 CRAN (R 4.0.2)
generics 0.1.0 FALSE 2020-10-31 CRAN (R 4.0.2)
glue 1.4.2 FALSE 2020-08-27 CRAN (R 4.0.2)
highr 0.8 FALSE 2019-03-20 CRAN (R 4.0.2)
hms 0.5.3 FALSE 2020-01-08 CRAN (R 4.0.2)
htmltools 0.5.0 FALSE 2020-06-16 CRAN (R 4.0.2)
htmlwidgets 1.5.2 FALSE 2020-10-03 CRAN (R 4.0.2)
httpuv 1.5.4 FALSE 2020-06-06 CRAN (R 4.0.2)
jpmesh 2.0.0 TRUE 2020-11-26 CRAN (R 4.0.3)
jsonlite 1.7.1 FALSE 2020-09-07 CRAN (R 4.0.2)
KernSmooth 2.23-18 FALSE 2020-10-29 CRAN (R 4.0.2)
knitr 1.30 FALSE 2020-09-22 CRAN (R 4.0.2)
later 1.1.0.1 FALSE 2020-06-05 CRAN (R 4.0.2)
lattice 0.20-41 FALSE 2020-04-02 CRAN (R 4.0.3)
leaflet 2.0.3 FALSE 2019-11-16 CRAN (R 4.0.2)
lifecycle 0.2.0 FALSE 2020-03-06 CRAN (R 4.0.2)
lubridate 1.7.9.2 FALSE 2020-11-13 CRAN (R 4.0.2)
lwgeom 0.2-5 FALSE 2020-06-12 CRAN (R 4.0.2)
magrittr 2.0.1 FALSE 2020-11-17 CRAN (R 4.0.2)
memoise 1.1.0 FALSE 2017-04-21 CRAN (R 4.0.2)
mime 0.9 FALSE 2020-02-04 CRAN (R 4.0.2)
miniUI 0.1.1.1 FALSE 2018-05-18 CRAN (R 4.0.2)
pillar 1.4.7 FALSE 2020-11-20 CRAN (R 4.0.2)
pkgconfig 2.0.3 FALSE 2019-09-22 CRAN (R 4.0.2)
promises 1.1.1 FALSE 2020-06-09 CRAN (R 4.0.2)
purrr 0.3.4 FALSE 2020-04-17 CRAN (R 4.0.2)
R6 2.5.0 FALSE 2020-10-28 CRAN (R 4.0.2)
raster 3.4-5 FALSE 2020-11-14 CRAN (R 4.0.2)
Rcpp 1.0.5 FALSE 2020-07-06 CRAN (R 4.0.2)
readr 1.4.0 FALSE 2020-10-05 CRAN (R 4.0.2)
renv 0.12.3 FALSE 2020-11-25 CRAN (R 4.0.3)
rlang 0.4.9 FALSE 2020-11-26 CRAN (R 4.0.3)
rmarkdown 2.5 FALSE 2020-10-21 CRAN (R 4.0.3)
rprojroot 2.0.2 FALSE 2020-11-15 CRAN (R 4.0.2)
rstudioapi 0.13 FALSE 2020-11-12 CRAN (R 4.0.2)
sessioninfo 1.1.1 FALSE 2018-11-05 CRAN (R 4.0.2)
sf 0.9-6 FALSE 2020-09-13 CRAN (R 4.0.2)
shiny 1.5.0 FALSE 2020-06-23 CRAN (R 4.0.2)
sp 1.4-4 FALSE 2020-10-07 CRAN (R 4.0.2)
stars 0.4-3 FALSE 2020-07-08 CRAN (R 4.0.2)
stringi 1.5.3 FALSE 2020-09-09 CRAN (R 4.0.2)
stringr 1.4.0 FALSE 2019-02-10 CRAN (R 4.0.2)
terra 0.9-8 TRUE 2020-11-13 CRAN (R 4.0.2)
tibble 3.0.4 FALSE 2020-10-12 CRAN (R 4.0.2)
tictoc 1.0 FALSE 2014-06-17 CRAN (R 4.0.2)
tidyselect 1.1.0 FALSE 2020-05-11 CRAN (R 4.0.2)
twitterwidget 0.1.1 FALSE 2019-07-10 CRAN (R 4.0.2)
units 0.6-7 FALSE 2020-06-13 CRAN (R 4.0.2)
vctrs 0.3.5 FALSE 2020-11-17 CRAN (R 4.0.2)
withr 2.3.0 FALSE 2020-09-22 CRAN (R 4.0.2)
xfun 0.19 FALSE 2020-10-30 CRAN (R 4.0.2)
xml2 1.3.2 FALSE 2020-04-23 CRAN (R 4.0.2)
xtable 1.8-4 FALSE 2019-04-21 CRAN (R 4.0.2)
yaml 2.2.1 FALSE 2020-02-01 CRAN (R 4.0.2)

Corrections

If you see mistakes or want to suggest changes, please create an issue on the source repository.

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY-SA 4.0. Source code is available at https://github.com/uribo/suryu.me, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".