library(tidyverse)
library(sf)
library(tmap)空間データとは何か
「空間データ」とは何かについて説明します。 そして、空間データをRに読み込む方法について解説します。
空間データの種類
空間データとは、緯度経度情報をつかって、地物の位置や形状(またはその属性)をデータ化したものです。 空間データは大きくベクターデータとラスターデータに大別されます。
最も身近なWeb地図のひとつであるGoogleマップを観察して、どのような空間データが使われているか考えてみましょう。
ベクターデータ
Web地図に掲載されている情報にはどのようなものがあるでしょうか。
最近では、道路や建物などの地図の骨格となる情報と合わせて、小売店や飲食店、医療機関や金融機関などの施設の位置を表すポイントデータが目立つようになってきました。 地図に押しピン📍を刺すイメージなのでしょう、特徴的なアイコンが描かれています。 適当に選んだピンのアイコンをクリックしてみると、このポイントデータに様々な情報が紐づいていることがわかります。
次に、ピンのアイコンを右クリックしてください。 すると、四角いウィンドウが現れて、その一番上の行に、緯度と経度の数字が表示されているのがわかると思います。 このように、ポイントデータは、緯度と軽度の情報を持っていて、地図上に(文字通り)ピンポイントでその位置を表示できます。
右下のマイナスボタンを押して地図の縮尺を小さくすると、道路や鉄道などが目立つようになります。 道路が幅を持って描画されていますが、実際の道路の幅よりも太くデフォルメされていることがわかります。 これらは、道路中心線などのラインデータをもとに描かれています。ラインデータは、折れ線の形で表現されることが多いです。 つまり、ラインデータは、複数のポイントデータの接続関係として表すことが可能です。
今度は反対に、右下のプラスボタンを押して地図の縮尺を大きくしましょう。すると道路によって区切られた区画の形や建物の形がはっきりとわかるようになります。 このような(凹凸のある)多角形によって表現されたデータをポリゴンデータと呼びます。 行政界や地名もポリゴンデータを持っていることが多いです。 試しに、画面左上の検索ボックスに適当な地名を入力してみてください。その行政界の領域が赤い点線で囲まれた領域として表示されたと思います。 ポリゴンデータは、複数のラインデータによって構成された、閉じた領域だと考えることができます。

同じ対象でも、地図に表示する縮尺や分析の目的によって、どのデータ種類が適切かが変わります。 例えば、建物データを用いた分析をする場合、その建築形状が問題になるならポリゴンデータを使う必要がありますが、建物の(中心の)位置さえ分かればよいなら、ポイントデータを使った方がよいでしょう。
ラスターデータ
座標値を用いて表現されるベクターデータに対して、グリッド(格子)状に並んだピクセル(画素)によって表現されるデータを、ラスターデータと呼びます (デジタル写真をどんどん拡大していくと、写真がグリッド状に並んだピクセルから構成されていることがわかりますよね)。 Googleマップでは、背景地図として衛星写真を選ぶことができますが、衛星写真もラスターデータの1つだと考えることができます。 人工衛星にはさまざまなセンサーが搭載されていて、写真だけでなく、地球表面に関する多様なラスターデータを作り出しています。 その他には、航空レーザー測量から地表面の数m間隔のグリッドの標高値を求めたDEM(Digital Elevation Model:数値標高モデル)も、ラスターデータとして扱われます。
ラスターデータは、ベクターデータとは異なり、地図を拡大するとギザギザの画像として表示され、「粗い」地図画像になってしまいます。 高解像度のラスターデータを使えば、拡大しても粗が目立たなくなりますが、その分データのサイズが大きくなってしまいます。
地域メッシュ統計とは、緯度・経度によって地域を隙間なく網の目(メッシュ)の区域に分けて、それぞれの区域に関する統計データを編成したもので、国勢調査や経済センサスの統計の一部が、地域メッシュ統計として公開されています。 地域メッシュ統計は、その定義から、ラスターデータの1つであると見なすこともできますが、地域メッシュ統計の網の目は数百m〜数kmと比較的粗いことから、メッシュ区画のポリゴンデータを用意して分析することもあります。
地域メッシュ統計(総務省統計局)
空間データのファイル形式
現在流通しているGISデータのファイル形式のうち,代表的な3つを紹介します。
シェープファイル
シェープファイルは現在デファクトスタンダードとなっているGISデータのファイル形式です。 Esri社(ArcGISなどのGIS製品で有名)によって開発・規格化されました。 シェープファイルは同じ名前を持つ複数のファイル(それぞれ拡張子が異なる)から構成されいます。 必須のファイルは3つ(.shp / .shx / .dbf)あり、それら全てが同じフォルダに入っていないと、GISソフトで読み込むことができません。
シェープファイルは1990年代に開発された歴史あるフォーマットです。 現代のGIS環境では不便な制限事項などもあり、次世代のGISファイルフォーマットが求められています。
GeoJSON
GeoJSONは,JSON(JavaScript Object Notation)を元に開発されたフォーマットで、次世代のGISファイルフォーマットと目されるものの1つです。 GeoJSONのファイルはテキストファイルなので,テキストエディタで閲覧・編集することも可能です。
KML
KML(Keyhole Markup Language)は ,地理情報をXML(eXtensible Markup Language)で記述します。 Google Earthのファイル入出力に採用されたことで広まりました。
空間データの入手
ここでは、日本において公的機関によって無償で提供されている空間データの内容と、その入手方法について紹介します。
国土数値情報(国土交通省)
国土数値情報は、国土計画の策定や実施の支援のために国土交通省が整備したものです。 行政区域、鉄道、道路、河川、地価公示、土地利用メッシュ、公共施設など、国土に関する基礎的な情報をGISデータとして整備し、無償で提供しています。
e-Stat(政府統計の総合窓口)
e-Statは、日本の統計が閲覧できる政府統計ポータルサイトで、総務省統計局が整備しています。 各種統計データを地図上に表示し視覚的に統計を把握できる地理情報システム「地図で見る統計(jSTAT MAP)」に登録されている小地域又は地域メッシュ統計などの統計データ及び境界データが提供されています。
自治体オープンデータ
いくつかの自治体では、独自のオープンデータサイトを構築し、地理情報に関するデータを公開しています。 例えば、佐賀県オープンデータカタログサイトでは、市町村ポリゴンのGeoJSONファイルが公開されています。
空間データの読み込み
それでは実際に、空間データをRに読み込んでみましょう。
まず、library関数を使って使用するパッケージを読み込んでおきましょう。 sfパッケージはRで空間データを扱うための標準的なパッケージです。 tmapパッケージは地図を直感的な記述で描画できるパッケージです。
それでは、実際に空間データをRに読み込んでみましょう。
ここでは例として、佐賀県オープンデータカタログサイトにある、ポリゴン(市町村別)のGeoJSONファイルを使ってみましょう。 リンクから佐賀県オープンデータカタログサイトにアクセスして、[⬇️ダウンロード]をクリックしてください。
GeoJSONファイルがダウンロードされたと思いますが、ダウンロードされたファイル名が非常に長くなっているかもしれません。 この場合は、ファイル名の最後の部分にある「410004saga」だけを残して、ファイル名を「410004saga.geojson」に修正しておいてください。
ダウンロードした「410004saga.geojson」を、ワーキングディレクトリのdataフォルダに移動してください。
GeoJSONファイルをRに読み込むには、read_sf関数を使います。 この関数によって、空間データをsfオブジェクト1に変換します。 ここでは、saga_mapという変数に、読み込んだオブジェクトを代入しています。
saga_map <- read_sf("data/410004saga.geojson")読み込んだデータを使って、地図を表示してみましょう。
Rで地図を表示する方法はいくつかありますが、ここではtmapパッケージを使った例を紹介します。
tm_shape関数で、地図として描画するデータを指定します。 今回の場合は、先ほど入力したsaga_mapというsfオブジェクトを指定しています。 次にtm_polygons関数で、指定したデータのポリゴン(面)を描画します。
tm_crs関数は地図投影法を指定する関数です。 ここで使用している「410004saga.geojson」は緯度経度データ(WGS84)なので、これを平面の地図にするために、平面直角座標系(II系)2に投影変換しています。 「6670」は、平面直角座標系(II系)のEPSGコード3です。
tm_compass関数とtm_scalebar関数はそれぞれ、方位記号と縮尺を表示するための関数です。
tm_shape(saga_map) + tm_polygons() +
tm_crs(6670) + tm_compass() + tm_scalebar()塗り分け地図(コロプレスマップ)の作成
コロプレスマップ(Choropleth Map)は、統計の数値によって色を塗り分けた地図のことです。 階級区分図と呼ばれることもあります。
佐賀県の市町村別塗り分け地図をつくってみましょう。 データは、佐賀県オープンデータカタログサイトにある、男女別人口総数及ひ世帯総数(市町村別)を使います。
このExcelファイルは、先ほどダウンロードしたGeoJSONファイルと組み合わせて使うことが想定されていますので、これを例として説明します。
ダウンロードした「410004saga.xlsx」を、ワーキングディレクトリのdataフォルダに移動してください。 readxl::read_excel関数を使って読み込みます。
library(readxl)
saga_dat <- read_excel("data/410004saga.xlsx")この読み込んだ統計データには、市町別の人口データがありますので、これを使って地図を塗り分けましょう。
そこでまず、地図データと統計データを「結合」する必要があります。 地図データの中身を見ると、このようなデータが格納されています。
View(saga_map)| KEN_NAME | GST_NAME | CSS_NAME | KEY_CODE |
|---|---|---|---|
| 佐賀県 | 鹿島市 | NA | 412074 |
| 佐賀県 | 唐津市 | NA | 412023 |
| 佐賀県 | 神埼市 | NA | 412104 |
| 佐賀県 | 杵島郡 | 江北町 | 414247 |
| 佐賀県 | 多久市 | NA | 412040 |
そして統計データの中身をみると、以下のようなデータが格納されています。
View(saga_dat)| KEY_CODE | 人口総数 | 市区町村 | 男 | 女 | 世帯総数 |
|---|---|---|---|---|---|
| 412015 | 236372 | 佐賀市 | 111453 | 124919 | 93306 |
| 412023 | 122785 | 唐津市 | 57547 | 65238 | 43872 |
| 412031 | 72902 | 鳥栖市 | 34799 | 38103 | 27630 |
| 412040 | 19749 | 多久市 | 9146 | 10603 | 6847 |
| 412058 | 55238 | 伊万里市 | 26395 | 28843 | 19698 |
両方のデータに共通するデータ列があることに気付いたと思います。 「KEY_CODE」という列に市町村コードが格納されていますが、このデータが2つのデータに共通して存在します。 そして、この市町村コードというのは全国の市町村にユニークな(一意の)番号が割り振られていますので、重複する(複数の市町村が同じコードを持つ)ことがありません。
なので、このKEY_CODEをキーにして、2つのデータを結合することにします。
2つのデータフレームを結合するには、left_join関数が便利です。 saga_mapに、KEY_CODEをキーにして、saga_datを結合するには、次のようなコードを実行します。
saga_map <- saga_map |>
left_join(saga_dat, by = join_by(KEY_CODE))結果を確認してみましょう。 saga_mapのデータに、saga_datのデータが正しく結合されていることがわかります。
View(saga_map)| KEN_NAME | GST_NAME | CSS_NAME | KEY_CODE | 人口総数 | 市区町村 | 男 | 女 | 世帯総数 |
|---|---|---|---|---|---|---|---|---|
| 佐賀県 | 鹿島市 | NA | 412074 | 29684 | 鹿島市 | 13920 | 15764 | 10124 |
| 佐賀県 | 唐津市 | NA | 412023 | 122785 | 唐津市 | 57547 | 65238 | 43872 |
| 佐賀県 | 神埼市 | NA | 412104 | 31842 | 神埼市 | 15172 | 16670 | 10913 |
| 佐賀県 | 杵島郡 | 江北町 | 414247 | 9583 | 江北町 | 4497 | 5086 | 3225 |
| 佐賀県 | 多久市 | NA | 412040 | 19749 | 多久市 | 9146 | 10603 | 6847 |
塗り分け地図を描くのは難しくありません。 tm_polygons関数のfill引数に、塗り分けに利用したいデータ列名を指定するだけです。
tm_shape(saga_map) + tm_polygons(fill = "人口総数") +
tm_crs(6670) + tm_compass() + tm_scalebar() +
tm_layout(text.fontfamily = "YuGo-Medium")脚注
sfは、Simple Featuresの略です。Simple Features(正式にはSimple Feature Access)は、GISで使用される点・線・多角形などの幾何学図形からなるGISデータの、コンピュータ内部での保存およびアクセス方法に関する標準規格です。Open Geospatial Consortium (OGC)とInternational Organization for Standardization (ISO)によって規格化されています。 このSimple FeaturesをRで実現するためのパッケージが
sfです。↩︎日本を19の地域に分け、それぞれの地域で誤差が小さくなるように、緯度経度を平面座標(m単位)に変換します。九州地方の地図では主にII系が使われます。詳しくは国土地理院の解説をご覧ください。↩︎
EPSGコードとは、座標参照系にユニークに割り振られた数字4桁または5桁のコードで、European Petroleum Survey Group(EPSG:欧州石油調査グループ)が作成し、 International Association of Oil and Gas Producers(IOGP:国際石油・天然ガス生産者協会)が管理しています。epsg.io などのウェブサイトで検索することが可能です。 データの読み込みや(投影)変換を行うときに、EPSGコードを知っていると便利です。 コードの数字を覚える必要はありませんが、このような仕組みがあることは、頭に入れておいてください。↩︎

