Rを使ったオープン地理空間情報データの活用 / FOSS4G Hokkaido 2017

Rを使ったオープン地理空間情報データの活用 / FOSS4G Hokkaido 2017

2017年7月1日に開催されたFOSS4G北海道2017での発表資料です。

# 要旨
これまで、地理空間データ処理を行うためのプログラミング言語として、Pythonが広く利用されています。その一方で、R言語もまた、地理空間データを扱うための機能を備えている点についてはあまり知られていません。R言語は主に統計解析の用途で利用されるオープンソースのプログラミング言語ですが、パッケージと呼ばれる機能拡張を利用することで、Pythonに劣らない操作が可能になります。本公演では、R言語を利用してできる地理空間データの操作や表現方法の可能性とその利点について、オープンデータを例に紹介します。

D12a80cab206033a820ccff8319f957b?s=128

Uryu Shinya

July 01, 2017
Tweet

Transcript

  1. ɹΛ࢖ͬͨ Φʔϓϯ஍ཧۭؒ৘ใσʔλͷ׆༻ '044(๺ւಓίΞσΠ ӝੜਅ໵!V@SJCP גࣜձࣾφΠτϨΠ 20170701

  2. 2ʮ஍ཧۭؒσʔλʯͷॲཧͰ ɹΛར༻͠·͔͢

  3. ҙ֎ͱଟ͍  ώοτ͠΍͢͞΋͋Δ

  4. 1ZUIPO͸(*4ΞϓϦέʔγϣϯͱ ૬ੑ͕ྑ͍ w 2(*4ͷϓϥάΠϯ͸1ZUIPOͰॻ͔ΕΔ w δΦϓϩηγϯάͱͯ͠ͷ"SD1Z 揺るぎない⽴場? ʜͦΕɺͰ΋Ͱ͖ΔΑ '044()0,,"*%0ͷςʔϚ ʮ3FQSPKFDUJPOʮ͜Ε·Ͱʯ͔Βɺʮ৽͍͠ࢹ఺ʯ΁ɻʯ

    ԿͰ΋͔ΜͰ΋3Ͱ΍Γͨ͘ͳͬͯ͠·͏ͷ͕3͓͡͞ΜͷੑͳͷͰ͢
  5. ࣗݾ঺հ wӝੜਅ໵ 6SZV4IJOZB !V@SJCP  wגࣜձࣾφΠτϨΠ wIUUQOJHIUMFZKQ ΤϯδχΞ  wੜଶֶҐஔ৘ใσʔλͷղੳ

    w޷͖ͳωλ݀ࢠɺḉ w3͓͡͞Μ
  6. φΠτϨΠʹ͓͚ΔΦʔϓϯσʔλͷ׆༻ ๚೔֎ࠃਓಈ޲෼ੳαʔϏε*OCPVOE*OTJHIU IUUQJOCPVOEOJHIUMFZKQ

  7. φΠτϨΠʹ͓͚ΔΦʔϓϯσʔλͷ׆༻ 4/4౤ߘͷʮࢪઃνΣοΫΠϯʯͰ0QFO4USFFU.BQͷ10*σʔλΛҰ෦ࢀর ਓؾࢪઃϥϯΩϯά ࢪઃपลͷ౤ߘදࣔ

  8. վΊͯɺͱ͸Կ͔ The best thing about R is that it was

    written by statisticians. The worst thing about R is that it was written by statisticians. - http://blog.revolutionanalytics.com/2015/06/why-has-r-been-so-successful.html ౷ܭղੳ͕ಘҙͳΦʔϓϯιʔεͷπʔϧ ݴޠ ࡞ਤɺػցֶशɺ΢ΣϒΞϓϦέʔγϣϯ։ൃ·Ͱ෯޿͘ѻ͏ wIUNMXJEHFUT IUUQXXXIUNMXJEHFUTPSH +BWB4DSJQUϥΠϒϥϦͷҠ২ w4IJOZ IUUQTIJOZSTUVEJPDPN ΢ΣϒΞϓϦέʔγϣϯϑϨʔϜϫʔΫ ػೳ֦ு ύοέʔδ ϥΠϒϥϦ ͷಋೖʹΑΓɺ࣮ߦՄೳͳྖҬ͕޿͕Δ
  9. ஍ཧۭؒ৘ใͷॲཧͰΛ࢖͏͜ͱͷར఺ͱܽ఺ wσʔλͷಡΈࠐΈ͔Βલॲཧɺ⚗ղੳɺϨϙʔτ΍ਤͷग़ྗ·Ͱ w δΦϓϩηγϯά ࣮ߦ଎౓͕஗͍ɺϝϞϦͷ໰୊Λى͜͠΍͍͢ ύϑΥʔϚϯε  3 ͳʹͦΕ͓͍͍͠ͷ ஌໊౓ɺάάΓ΍͢͞

     ࣮຿Ͱ͸ܟԕ͞Ε΍͍͢ σʔλ෼ੳͷҰ࿈ͷաఔΛ3಺Ͱ׬݁ ҙ֎ͱ ؆୯ ޙΖ޲͖ͳΠϝʔδΛ΋ͨΕ͕ͪ ☠ ☠
  10. Αͬ͠Όૣ଎Ͱ஍ཧۭؒ৘ใσʔλͷ෼ੳ΍

  11. ᠘ σʔλ͕ͳ͍ σʔλ͕ར༻ͮ͠Β͍ ɹ ଟ༷ͳ஍ཧۭؒ৘ใσʔλͷϑΥʔϚοτɺωਃ͑ͤ͘Δɺ1%'  Ͳ͏͢Ε͹ྑ͍͔Θ͔Βͳ͍

  12. ͓͡͞Μͷయܕతͳࢥߟ ʮʜͰͳΜͱ͔͠Α͏ʯ

  13. ஍ཧۭؒ৘ใσʔλΛѻ͏ɹɹύοέʔδ $3"/5BTL7JFX"OBMZTJTPG4QBUJBM%BUB IUUQTDSBOSQSPKFDUPSHWJFX4QBUJBM ར༻໨తʹԠͨ͡ओཁύοέʔδͷҰཡ ͷύοέʔδ wશൠʜTG TQBUTUBU NBQUPPMT  wՄࢹԽUNBQ

    NBQWJFX HHNBQ wۭؒ౷ܭֶHTUBU TQEFQ TQ#BZFT wੜଶֶWFHBO BEF BEFIBCJUBU ʜ ͸ओཁύοέʔδ UNBQύοέʔδͰ࡞ͬͨ২ੜਤ΋Ͳ͖ IUUQVSJCPIBUFOBCMPHDPNFOUSZ
  14. ஍ཧۭؒ৘ใσʔλΛѻ͏ɹɹύοέʔδ ࣌୅͸TGύοέʔδ TIBQFpMF 8,5 HFPKTPO 1PTUHSF42-ʜ ଟ༷ͳଟ༷ͳ஍ཧۭؒ৘ใσʔλʹରԠ ैདྷͷTQΫϥετͷޓ׵ɺEQMZSύοέʔδͱಉ࢓༷ͷσʔλૢ࡞ ৄࡉ͸ࡢ೔ͷϋϯζΦϯࢿྉΛ͝ཡ͍ͩ͘͞ IUUQTHJUIVCDPNVSJCPGPTTH@ILE@IBOETPO

    ⚠εϥΠυɺίʔυ͸ޙ΄Ͳ ׬શ൛ʹߋ৽͠·͢ એ఻
  15. ਎ۙͰར༻Մೳͳ஍ཧۭؒ৘ใσʔλ wࣗ෼Ͱ༻ҙ͢Δ ɹ(14 εϚʔτϑΥϯΞϓϦέʔγϣϯ͔Βͷ ɹσʔλग़ྗ w"1*ɺΦʔϓϯσʔλΛར༻͢Δ IUUQVSJCPIBUFOBCMPHDPNFOUSZ NPWFTͷϩάΛ"1*Ͱऔಘͯ͠ՄࢹԽ

  16. Φʔϓϯσʔλ

  17. FTUBUBQJύοέʔδF4UBU"1*Λ3͔Βར༻ 平成27年国勢調査 人口等基本集計 総務省統計局 library(estatapi) このサービスは、政府統計総合窓口(e-Stat)のAPI機能を使用していますが、 サービスの内容は国によって保証されたものではありません。 df.pops <- estat_getStatsData(

    appId = <API_TOKEN>, statsDataId = "0003148500", cdCat01 = c("00710")) UBC@DPEF දষ߲໨ DBU@DPEF BSFB@DPEF ஍Ҭʢʣ ࣌ؒ࣠ ೥࣍ VOJU WBMVF  ਓޱ   શࠃ ೥ ਓ   ਓޱ   શࠃࢢ෦ ೥ ਓ   ਓޱ   શࠃ܊෦ ೥ ਓ 
  18. LPLVEPTVVDIJ ࠃ౔਺஋৘ใμ΢ϯϩʔυαʔϏε8FC"1*ϥούʔ library(kokudosuuchi) getKSJSummary() JEFOUJpFS UJUMF pFME pFME BSFB5ZQF "

    ࡾେ౎ࢢݍܭը۠Ҭ ੓ࡦ۠Ҭ େ౎ࢢݍ  " ౎ࢢ஍Ҭ ࠃ౔ʢਫɾ౔஍ʣ ౔஍ར༻  " ࣗવެԂ஍Ҭ ஍Ҭ อޢอશ 
  19. # devtools.install_github("uribo/jpndistrict") 本パッケージが提供する行政区域データおよび市区町村役場データは 国土交通省国土政策局「国土数値情報(行政区域データ 平成27年4月1日時点のデータ)http://nlftp.mlit.go.jp/ksj/gml/ datalist/KsjTmplt-N03.html 」、「国土数値情報(市区町村役場データ 平成26年8月31日時点のデータ) http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-P34.html」をもとに瓜生真也が編集・加工を行ったものです。 そのため、このデータを利用した二次著作物を作成する際は、国土数値情報の利用約款に準拠するものとします。

    library(jpndistrict) (sp.df01 <- spdf_jpn_pref(admin_name = "北海道")) QSFG@OBNF DJUZ@OBNF@ DJUZ@OBNF DJUZ@OBNF@GVMM DJUZ@DPEF ๺ւಓ ࡳຈࢢ தԝ۠ ࡳຈࢢ தԝ۠ 1101 ๺ւಓ ࡳຈࢢ ๺۠ ࡳຈࢢ ๺۠ 1102 ๺ւಓ ࡳຈࢢ ౦۠ ࡳຈࢢ ౦۠ 1103 ๺ւಓ ࡳຈࢢ നੴ۠ ࡳຈࢢ നੴ۠ 1104 ๺ւಓ ࡳຈࢢ ๛ฏ۠ ࡳຈࢢ ๛ฏ۠ 1105 ฏ੒೥݄೔࣌఺ͷσʔλ IUUQOMGUQNMJUHPKQLTKHNMEBUBMJTU,TK5NQMU/IUNM KQOEJTUSJDUࠃ౔਺஋৘ใ ߦ੓۠Ҭσʔλ
  20. FTUBUBQJͱKQOEJTUSJDUΛ૊Έ߹Θͤͯ library(tidyverse) library(sf) sf.pops <- sp.df01 %>% st_as_sf() %>% mutate(city_code

    = as.character(city_code)) %>% left_join(df.pops %>% filter(表章項目 == "人口"), by = c("city_code" = "area_code")) ggplot() + geom_sf(data = sf.pops, aes(fill = value)) + scale_fill_gradientn(colors = sf.colors(10))
  21. ΢ΣϒεΫϨΠϐϯά

  22. IUUQXXXQSFGIPLLBJEPMHKQTTKTLPQFOEBUBPQFOEBUBIUN ๺ւಓΦʔϓϯσʔλΧλϩάͷ ϖʔδΛεΫϨΠϐϯά library(rvest) x <- read_html("http://www.pref.hokkaido.lg.jp/ss/jsk/opendata/opendata.htm") df.opd <- x

    %>% html_table(fill = TRUE) %>% .[[3]] x %>% html_nodes(css = '#open_data > tbody > tr:nth-child(222) > td:nth-child(3) > a') %>% html_text() # [1] "森林計画関係資料(GIS用データ)" (link.url <- x %>% html_nodes(css = '#open_data > tbody > tr:nth-child(222) > td:nth-child(3) > a') %>% html_attr(name = "href")) # [1] "http://www.pref.hokkaido.lg.jp/sr/srk/OPD.htm"
  23. ৿ྛܭըؔ܎ࢿྉͷར༻ # 森林に関するデータ df.forest <- readr::read_csv( "09留萌/留萌森林簿データ(コード置換版).csv", locale = readr::locale(encoding

    = "cp932")) df.rumoi <- read_sf("09留萌/09留萌_小班.shp") %>% select(KEYCODE, 市町村コー, 林班, 計画区コー, GISAREA, NO, LUX, ID, geometry) %>% filter(between(ID, 9010000001, 9010001000)) %>% st_simplify() %>% inner_join(df.forest, by = c("KEYCODE", "林班")) quartzFonts( HiraMaru = quartzFont(rep("HiraMaruProN-W4", 4))) theme_set( ggthemes::theme_map(base_size = 12, base_family = "HiraMaruProN-W4")) ggplot() + geom_sf(data = df.rumoi, aes(fill = 林種))
  24. ɹͰ஍ཧۭؒॲཧ φΠτϨΠͰͷऔΓ૊Έ

  25. Ͱ஍ཧۭؒॲཧඪ४஍Ҭϝογϡ 4/4౤ߘσʔλͷ ϙΠϯτΛϝογϡͰूܭͯ͠ѻ͍͍ͨ Ң౓ܦ౓Λϝογϡʹม׵͢ΔͨΊͷ ύοέʔδ͕ͳ͍ ʜͳ͚Ε͹࡞Δ

  26. Ͱ஍ཧۭؒॲཧඪ४஍Ҭϝογϡ library(jpmesh) meshcode_to_latlon(5133) lat_center long_center lat_error long_error 1 34.3333333333 133.5

    0.3333333333 0.5 latlong_to_meshcode(34.583333, 133.875, order = 2) [1] 513367 ࠃཱ؀ڥݚڀॴ஛த͞Μͷίʔυ IUUQUBLFOBLBBLJPPSHFUDNFTIDPEFJOEFYIUNMΛݩʹ ݸਓͰ ։ൃɻ KQNFTI Ң౓ܦ౓͔Βϝογϡͷ૬ޓม׵ LN͔ΒNϝογϡ·ͰରԠ Nͦͷ͏ͪରԠ
  27. Ͱ஍ཧۭؒॲཧඪ४஍Ҭϝογϡ 4/4౤ߘσʔλͷϝογϡ୯ҐͰͷूܭ प༡ϓϥϯ φϏλΠϜδϟύϯͱͷσʔλ࿈ܞ

  28. Ͱ஍ཧۭؒॲཧࢪઃ෼ྨ ʮ౦ژσΟζχʔϥϯυʯ͕શࠃʹ  ઍ༿ݝҎ֎ʹ΋νΣοΫΠϯؚ͕·ΕΔ ʢ྆࣠ͷ஋͸ਖ਼نԽॲཧΛߦ͍ͬͯΔ w%#4$"/ %FOTJUZCBTFETQBUJBMDMVTUFSJOHPGBQQMJDBUJPOTXJUIOPJTF ɹ ɹʹΑΔΫϥελϦϯά ڑ཭తʹ཭ΕΔಉҰࢪઃͷ෼཭

    ˠ
  29. Ͱ஍ཧۭؒॲཧࢪઃ෼ྨ library(dbscan) d <- df.tgt %>% select(longitude, latitude) %>% mutate_all(scale)

    %>% as.matrix() db <- dbscan(d, eps = 1, minPts = 3) db ## DBSCAN clustering for 1813 objects. ## Parameters: eps = 1, minPts = 3 ## The clustering contains 4 cluster(s) and 1 noise points. ## ## 0 1 2 3 4 ## 1 1756 43 3 10 ## ## Available fields: cluster, eps, minPts df.tgt %<>% mutate(cluster = db$cluster) library(factoextra) fviz_cluster(db, d, stand = FALSE, geom = "point", ggtheme = theme_minimal())
  30. Ͱ஍ཧۭؒॲཧࢪઃ෼ྨ # 指定した箇所周辺の「施設名」を返す関数 (res <- find_neighbor_places(df.inbs, 135.7355, 35.0302, distance =

    100)) ## [1] "京都" "北野天満宮" ## [3] "北野天満宮 (Kitano Tenman-gu)" "北野天ડ܅" QMBDF@OBNF DPSSFDU@OBNF EJTUBODF ๺໺ఱຬٶ ๺໺ఱຬٶ  ๺໺ఱຬٶ ,JUBOP5FONBOHV ๺໺ఱຬٶ  ๺໺ఱડ܅ ๺໺ఱຬٶ  ژ౎ ๺໺ఱຬٶ  จࣈྻͷฤूڑ཭Λར༻ͯ͠ਫ਼౓޲্Λ໨ࢦ͢ ϙΠϯτ͔ΒϙϦΰϯΛ࡞੒ ϙϦΰϯʹؚ·ΕΔ౤ߘΛ ࢪઃ಺Ͱͷ౤ߘͱ൑ఆ
  31. ͓͡͞Μɺɹ͓Ͷ͍͞ΜʹͳΓ·͠ΐ͏ &OKPZ