4: 空間データの種類と入手

公開

2024年5月1日

更新日

2024年7月31日

今回は、Rでの分析に利用可能な空間データの種類と、その入手方法について解説します。

空間データの種類

ベクターデータ

地理情報を使ったWebサービスとして、Googleマップに代表される「Web地図」を紹介しました。そこで、まずはWeb地図を観察して、どのような空間データが使われているか考えてみましょう。

Web地図に掲載されている情報にはどのようなものがあるでしょうか。 最近では、道路や建物などの地図の骨格となる情報と合わせて、小売店や飲食店、医療機関や金融機関などの施設の位置を表すポイントデータが目立つようになってきました。 地図にピン📍を刺すイメージなのでしょうか、特徴的なアイコンが描かれています。 適当に選んだピンのアイコンをクリックしてみると、このポイントデータに様々な情報が紐づいていることがわかります。 次に、ピンのアイコンを右クリックしてください。 すると、四角いウィンドウが現れて、その一番上の行に、緯度と経度の数字が表示されているのがわかると思います。 このように、ポイントデータは、緯度と軽度の情報を持っていて、地図上に(文字通り)ピンポイントでその位置を表示できます。

右下のマイナスボタンを押して地図の縮尺を小さくすると、道路や鉄道などが目立つようになります。 道路が幅を持って描画されていますが、実際の道路の幅よりも太くデフォルメされていることがわかります。 これらは、道路中心線などのラインデータをもとに描かれています。ラインデータは、折れ線の形で表現されることが多いです。 つまり、ラインデータは複数のポイントデータの接続関係として表すことが可能です。

今度は反対に、右下のプラスボタンを押して地図の縮尺を大きくしましょう。すると道路によって区切られた区画の形や建物の形がはっきりとわかるようになります。 このような(凹凸のある)多角形によって表現されたデータをポリゴンデータと呼びます。 行政界や地名もポリゴンデータを持っていることが多いです。 試しに、画面左上の検索ボックスに適当な地名を入力してみてください。その行政界の領域が赤い点線で囲まれた領域として表示されたと思います。 ポリゴンデータは、複数のラインデータによって構成された、閉じた領域だと考えることができます。

source: ©GIS Open Educational Resources WG, CC BY-NC-SA 4.0

図 1: ベクターデータ

このように、現実世界の要素を、座標値からなる点・線・多角形などで表したデータを、ベクターデータと呼びます。 ベクターデータは、その座標値で位置が決まるため、地図を拡大しても劣化しないという特徴を持ちます。

ベクターデータの使い分け

同じ対象でも、地図に表示する縮尺や分析の目的によって、どのデータ種類が適切かが変わります。 例えば、建物データを用いた分析をする場合、その建築形状が問題になるならポリゴンデータを使う必要がありますが、建物の(中心の)位置さえ分かればよいなら、ポイントデータを使った方がよいでしょう。

ラスターデータ

座標値を用いて表現されるベクターデータに対して、グリッド(格子)状に並んだピクセル(画素)によって表現されるデータを、ラスターデータと呼びます。 Googleマップでは、背景地図として衛星写真を選ぶことができますが、衛星写真もラスターデータの1つだと考えることができます。 その他には、航空レーザー測量から地表面の数m間隔のグリッドの標高値を求めたDEM(Digital Elevation Model:数値標高モデル)も、ラスターデータとして扱われます。

source: ©GIS Open Educational Resources WG, CC BY-NC-SA 4.0

図 2: ラスターデータ

ラスターデータは、ベクターデータとは異なり、地図を拡大するとギザギザの画像として表示され、「粗い」地図画像になってしまいます。 高解像度のラスターデータを使えば、拡大しても粗が目立たなくなりますが、その分データのサイズが大きくなってしまいます。

地域メッシュ統計

地域メッシュ統計とは、緯度・経度によって地域を隙間なく網の目(メッシュ)の区域に分けて、それぞれの区域に関する統計データを編成したもので、国勢調査や経済センサスの統計の一部が、地域メッシュ統計として公開されています。 地域メッシュ統計は、その定義から、ラスターデータの1つであると見なすこともできますが、地域メッシュ統計の網の目は数百m〜数kmと比較的粗いことから、メッシュ区画のポリゴンデータを用意して分析することもあります。

地域メッシュ統計(総務省統計局)

空間データのファイル形式

現在流通しているGISデータのファイル形式のうち,代表的な3つを紹介します。

シェープファイル

シェープファイルは現在デファクトスタンダードとなっているGISデータのファイル形式です。 Esri社(ArcGISなどのGIS製品で有名)によって開発・規格化されました。 シェープファイルは同じ名前を持つ複数のファイル(それぞれ拡張子が異なる)から構成されいます。 必須のファイルは3つあり、それら全てが同じフォルダに入っていないと、GISソフトで読み込むことができません。

表 1: シェープファイルの主な構成ファイル
拡張子 概要
.shp 図形の情報を格納する主なファイル(必須)
.shx 図形のインデックス情報を格納するファイル(必須)
.dbf 図形の属性情報を格納するテーブル(必須)
.prj 図形の持つ座標系の定義情報を格納するファイル(推奨)

souce:Esri社ウェブサイト

シェープファイルは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ファイルが公開されています。

データのダウンロードと確認

まず最初に、パッケージを読み込むためのlibrary関数を実行してください。

library(tidyverse)
library(sf)
library(mapview)

行政区域(ポリゴン):国土数値情報

国土数値情報から、佐賀県の市町境界データをダウンロードし、地図に表示してみましょう。

まず、ウェブブラウザで、国土数値情報ダウンロードにアクセスしてください。

[カテゴリー]をクリックします。

[行政地域]をクリックします。

[行政区域(ポリゴン)]をクリックします。

画面を下にスクロールし、日本地図が出てきたところで、[佐賀県]をクリックします。

佐賀県の行の右端にあるダウンロードボタン[⬇️]をクリックします。

アンケート画面が表示されますが、構わず右下の[スキップ]をクリックします。

確認のダイアログが表示されるので、[OK]をクリックします。

エクスプローラーでダウンロードフォルダへ移動し、今ダウンロードしたzipファイルを見つけます。 zipファイルを右クリックし、メニューが表示されたら、[すべて展開]をクリックします。

[展開]をクリックします。これでzipファイルが解凍・展開されます。

展開されたフォルダを、プロジェクトフォルダの中のdataフォルダに移動します。

これで、データの準備ができました。 いよいよRStudioで地図にします。

その前に、エクスプローラーで、先ほどの展開したフォルダの中身を確認してみましょう。

フォルダの中には、同じファイル名で異なる拡張子を持つ多くのファイルが入っています。 これらのうち、geojsonファイルを除いたファイル群が、「シェープファイル」と呼ばれるものです。 さて、このシェープファイルをRで読み込んでみましょう。

Rでシェープファイルを読み込むには、sfパッケージのst_read関数を使います。 sagaという変数に読み込んだデータを代入しましょう。 st_read関数でシェープファイルを読む場合、引数には、拡張子が「.shp」のファイルを指定します。

saga <- st_read("data/N03-20240101_41_GML/N03-20240101_41.shp")
Reading layer `N03-20240101_41' from data source 
  `/Users/kzktmr/Documents/LectureNotes/data/N03-20240101_41_GML/N03-20240101_41.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 316 features and 6 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 129.7368 ymin: 32.95048 xmax: 130.5421 ymax: 33.61899
Geodetic CRS:  JGD2011

メッセージが表示されます。ファイル形式が「ESRI Shapefile」であること、XY座標系であること、 測地系はJGD2011であることなどが読み取れます。

データの中身を確認してみましょう。

class(saga)
[1] "sf"         "data.frame"

sagaはデータフレームであると同時に、sfというクラスを持っていることがわかります。 sfは、Simple Featuresの略です。

Simple Features

Simple Features(正式にはSimple Feature Access)は, GISで使用される点・線・多角形などの幾何学図形からなるGISデータの,コンピュータ内部での保存およびアクセス方法に関する標準規格です。 Open Geospatial Consortium (OGC)とInternational Organization for Standardization (ISO)によって規格化されています。

このSimple FeaturesをRで実現するためのパッケージがsfです。

glimpse(saga)
Rows: 316
Columns: 7
$ N03_001  <chr> "佐賀県", "佐賀県", "佐賀県", "佐賀県", "佐賀県", "佐賀県", "…
$ N03_002  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ N03_003  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ N03_004  <chr> "佐賀市", "唐津市", "唐津市", "唐津市", "唐津市", "唐津市", "…
$ N03_005  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ N03_007  <chr> "41201", "41202", "41202", "41202", "41202", "41202", "41202"…
$ geometry <POLYGON [°]> POLYGON ((130.2228 33.23187..., POLYGON ((129.8722 33…

データフレームの構造としては、N03_001からN03_007までの文字列型のデータに、geometryという地理情報が格納された列が加わっています。 それぞれのデータ項目が何を意味しているかは、国土数値情報のウェブサイトで確認できます。

それでは、このデータを地図にしてみましょう。 mapviewパッケージのmapview関数を使うと、とても簡単に地図を描画することができます。 RStudioの右下のViewerペインに、背景地図まで含めた地図が表示されたと思います。 青色に塗られたポリゴンが、国土数値情報からダウンロードしたデータを地図に載せたものです。 地図の拡大縮小も可能ですし、自治体をクリックすると、その属性情報が表の形で表示されます。

mapview(saga)

河川(ライン):国土数値情報

同様に、国土数値情報から、佐賀県内の河川データ(ラインデータ)をダウンロードして、mapviewで見てみましょう(ダウンロード方法や展開の方法は上の行政境界データと同じなので、説明を省略します)。

river <- st_read("data/W05-07_41_GML/W05-07_41-g_Stream.shp")
Reading layer `W05-07_41-g_Stream' from data source 
  `/Users/kzktmr/Documents/LectureNotes/data/W05-07_41_GML/W05-07_41-g_Stream.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 2713 features and 10 fields
Geometry type: LINESTRING
Dimension:     XY
Bounding box:  xmin: 129.7572 ymin: 32.95711 xmax: 130.5419 ymax: 33.60881
CRS:           NA
glimpse(river)
Rows: 2,713
Columns: 11
$ W05_001  <chr> "410015", "410015", "410015", "410026", "410027", "410025", "…
$ W05_002  <chr> "4100150001", "4100150007", "4100150007", "4100260001", "4100…
$ W05_003  <chr> "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "…
$ W05_004  <chr> "有浦川", "名場越川", "名場越川", "浦川", "佐志川", "橋本川",…
$ W05_005  <chr> "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "3", "…
$ W05_006  <chr> "true", "true", "true", "true", "true", "true", "true", "true…
$ W05_007  <chr> "#gb03_4102853", "#gb03_4102907", "#gb03_4102907", "#gb03_410…
$ W05_008  <chr> "#gb03_4102201", "#gb03_4102561", "#gb03_4102561", "#gb03_410…
$ W05_009  <chr> "#gb03_4102561", "#gb03_4102001", "#gb03_4102563", "#gb03_410…
$ W05_010  <chr> "#gb03_4102000", "#gb03_4102561", "#gb03_4102001", "#gb03_410…
$ geometry <LINESTRING> LINESTRING (129.9058 33.456..., LINESTRING (129.9067 3…
mapview(river)

地図が表示されたと思いますが、今回は背景地図が表示されていません。なぜでしょうか。

st_readの出力をよく見ると、CRSがNAになっていることに気づいたでしょうか? どういうわけか、このデータには適切な測地系の情報が入っていないようです。

地図を正しく描画するためには、このデータがどの測地系に基づいて作られたのかを知る必要がありますが、国土数値情報ウェブサイトの河川データの説明を見ると、測地系はJGD2000のようです。

sfデータに測地系の情報を設定するには、sfパッケージのst_crs関数が使えます。 EPSGコードを使えば、簡単にその情報を設定することができます。 JGD2000のEPSGコードは4612でした(第1回の講義資料を参照してください)。 これを使います。

st_crs(river) <- 4612

測地系を設定したデータを地図にしてみましょう。

mapview(river)

今度は背景地図もちゃんと表示されたと思います。 地理情報データを正しく扱うには、測地系に関する知識が不可欠だということが、分かっていただけたのではないかと思います。

地価公示(ポイント):国土数値情報

同様に、国土数値情報から、佐賀県内の地価公示データ(ポイントデータ)をダウンロードして、mapviewで見てみましょう(ダウンロード方法や展開の方法は上の行政境界データや河川データと同じなので、説明を省略します)。

land_price <- read_sf("data/L01-24_41_GML/L01-24_41.geojson")

ここでは、geojsonファイルを読み込んでいますが、シェープファイルを読み込んでも構いません。

mapview(land_price)

地価が公示されている地点を地図にプロットすることができました。

これだけだと何だか味気ないので、地価でポイントを色分けしてみましょう。 国土数値情報ウェブサイトの属性情報を見ると、公示地価の列名はL01_008なので、これを使います。 この列名を、mapview関数のzcol引数に文字列として与えます。

mapview(land_price, zcol = "L01_008")

佐賀・鳥栖・唐津などの都市部でプロットされた点の色が明るく、地価が高いことが一目で分かりますね。

今回の演習は以上です。 皆さんも、自分の興味のある地域の地図を、工夫して作ってみてください。