第 5 章 Annotation and Maps

5.1 地圖基本元素

多由point, line, polygon(多邊體)組成。

  • point: 如景點位置;geom_point

  • line: 如河流; geom_path

  • polygon: 如臺北市範圍界線;geom_polygon

5.1.1 Point, line, polygon

為方便說明,先創造格線底圖myGrids:

  • theme_linedraw(): 圖面每個breaks均有格線
  • expand=…: 用來設定在資料limits上限及下限要再延伸多少.
    expand_scale(add=c(a1,a2)) 下限減a1,上限加a2;或 expand_scale(mult=c(m1,m2)) 下限減limits長度m1倍,上限加其m2倍。

5.1.2 Matrix expression

後面介紹到地圖常用的simple features時,因其格式多以矩陣方式輸入,故在此也用矩陣說明。

rbind()產生\(4\times 2\)矩陣,代表在xy平面的三個點:

矩陣as.data.frame後,會形成V1, V2名稱欄位。

V1 V2 1 1 5 2 2 1 3 5 1 4 5 5

地圖資料中的point, line, polygon便是一系列由:

  • 矩陣

  • geom

來代表的資訊。

5.1.3 北台灣範例

讀入北台北灣資料:

選出COUNTYNAME為“新北市”以geom_polygon繪出如下形狀: 這張圖新北市地圖有什麼問題?

5.1.5 Multipolygons

  • 使用aes fill用顏色區分polygons

  • color決定邊界線顏色

5.2 Annotation

annotate(geom, x = NULL, y = NULL, xmin = NULL, xmax = NULL,
  ymin = NULL, ymax = NULL, xend = NULL, yend = NULL, ...,
  na.rm = FALSE)

5.2.2 圖片

使用annotation_raster():
* 說明: https://ggplot2.tidyverse.org/reference/annotation_raster.html

annotation_raster(raster, xmin, xmax, ymin, ymax, interpolate = FALSE)

查看圖片資訊

[1] 0.8571

圖片width,height

圖片填色(讓背景為透明) point=“++”; 小心y軸0在上方

轉成raster矩陣資料

調低解析度

5.3 Simple features

一種地圖資訊的儲存格式,將地理區域的特徵以點、線、多邊體等簡單幾何特徴記錄。

引入simple feature處理套件

透過這套件我們會以下面3步驟架構sf資料:

想像構架台灣22個直轄市/縣/市

  1. Simple feature geometry(sfg class): 每個縣市由那些簡單幾何構成

  2. Simple feature column(sfc class): 將所有縣市的sfg堆疊成的column

  3. Simple feature object(sf class): 再放上所有縣市其他非地理特徵形成的完整資料物件

5.4 Coordinate Reference Systems (CRS)

包含兩部份:

  • geographic coordinate reference systems: 經度、緯度,衡量規則通常為WGS84。

  • projected coordinate reference systems:怎麼把球體上的地理位置投射成2維經緯平面,受投射中心點及投射方法選擇影響。

不同CRS在2維平面投出的地理形狀、兩點距離、兩點角度會有不同結果;在繪圖時需要特別聲明。

CRS設定,2選一:

  • epsg碼:

  • proj4string: `+proj=<投射法> A planar CRS defined by a projection, datum, and a set of parameters. In R use the PROJ.4 notation, as that can be readily interpreted without relying on software.

Definition 5.1 There are various attributes of the CRS, such as the projection, datum, and ellipsoid. Some of the options for each variable can be obtained in R with projInfo:
1. Projection: projInfo(type = “proj”) 什麼投射法
2. Datum: projInfo(type = “datum”) 什麼圖資來定義經緯線
3. Ellipsoid: projInfo(type = “ellps”) 什麼橢球體

5.5 架構sf data frame

  1. simple features geometry (for each county)
  2. simple features column (for all counties)
  3. set simple features column as a column in a data frame

5.5.1 Geometry (sfg)

主要由以下幾種geometries構成:

POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON and GEOMETRYCOLLECTION

定義函數均為st_<geometry type>(<geometry record>):

一個多邊體:st_polygon

sf::st_polygon(sf)與ggplot2::geom_polygon(ggplot2)對多邊體格式定義差異:

  • sf下多邊體的最後一個座標必需是第一個座標;ggplot2則不用,自動假設連回第一個 。

  • sf以第一個ring(即多邊體邊界一圈)為outer ring,其餘為holes。ggplot2則需定義group及subgroup兩個變數後,才能自動判斷哪個ring為ourter,哪個ring為holes。

5.5.3 與data frame合併 (sf)

形成sf object: a data frame with a geometry column

Given a data frame, say df, we can attach a geometry column (sfc), say geo_column, through:

st_set_geometry(df,geo_column)

[1] “name” “population” “geometry”

5.5.4 儲存成shp檔

當然如果只是個人要用,或確信對方也使用R,你也可以存成Rda檔。

之後再:

資料來源:政府資料開放平台(https://data.gov.tw/dataset/73233
執行取得sf_mrt_tpe

其中代號’O’為「中和新蘆線」、’BL’為「板南線」,只取出此兩線,並形成一個sf data frame含有以下欄位:

  • 路線名稱

  • geometry: 代表各路線的「點、線」圖。

5.6 讀入shp檔

shp檔其實是由數個檔形成的向量地理圖資,包含:.shp, .shx, .dbf (前三個必需要有)及 .prj等一系列「相同名稱」、「不同副檔名」組成的地理資訊。

sf::read_sf(".shp檔位置")

https://data.gov.tw/dataset/7442 引入台灣直轄市、縣市界線圖資存在名為sf_taiwan的物件。

5.7 常見圖資運算

5.7.2 找中心點: st_centroid()

  • 找polygon中心點

  • 形成新的sf object,有相同data frame但geometry column只是中心點的point geometry.

  • 如果一筆feature資料有多個中心點,可以設定:
    st_centroid(..., of_largest_polygon = T)

Simple feature collection with 3 features and 4 fields geometry type: POINT dimension: XY bbox: xmin: 121.6 ymin: 24.99 xmax: 121.7 ymax: 25.12 epsg (SRID): 3824 proj4string: +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs # A tibble: 3 x 5 COUNTYID COUNTYCODE COUNTYNAME COUNTYENG *
1 C 10017 基隆市 Keelung … 2 A 63000 臺北市 Taipei C… 3 F 65000 新北市 New Taip… # … with 1 more variable: geometry <POINT [°]>

5.7.6 st_cast

5.8 ggplot地圖繪製

5.8.1 繪製goemetry: geom_sf()

5.8.3 設座標系統: coord_sf()

  • 只對圖面上geom_sf類圖層有作用。

Coordinate Reference System: EPSG: 3824 proj4string: “+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs”

Coordinate Reference System: EPSG: 3826 proj4string: “+proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs”

不同CRS畫在一起時,ggplot會以第一層的CRS為主,主動改其他不同的CRS:

使用coord_sf(xlim=...,ylim=...)限縮範圍:

以sf_mrt_tpe_BL CRS為主時,圖會不見:

geom_sf圖面的座標是我們label後的結果,即如同scale_x_continuous(limits=..., breaks=..., labels=...)中的label,而xlim和ylim是在控制真實資料limits的範圍。

xmin ymin xmax ymax 292263 2761319 312333 2772024

xmin ymin xmax ymax 121.28 24.67 122.01 25.30

5.8.3.1 方法二:在coord_sf()內調整

方法二有一個缺點,若layer有非sf圖層,在此法下,其他layers的圖層可能會消失。

5.9 練習:捷運車站

資料來源:政府資料開放平台(https://data.gov.tw/dataset/73233
執行取得sf_mrtStops_tpe

5.9.1 CRS

  • 取出地圖CRS。

Coordinate Reference System: EPSG: 3826 proj4string: “+proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs”

5.9.2 取出單線站點

  • 取出藍線(BL)畫出它的站點。

  • 使用sf::st_coordinates()取出這些點的座標值。這些座標值是我們習慣的經、緯度嗎?

5.9.4 標站名

  • 標上站名

ggrepel套件特別為geom_text及geom_label設計了不重疊、自動閃避的geom_text_repel及geom_label_repel元素。

  • 放上大台北地圖(可不放站名)

  • 使用ggplot2::coord_sf() layer或sf::st_crop()將圖面限縮在東經121.35到121.8度,及北緯24.9到25.1度間。

5.10 其他相關圖資套件

5.10.1 osmdata

5.10.1.1 網頁下載.osm

Reading layer lines' from data source/Users/martin/Desktop/GitHub/Courses/course-data-visualization/108-1/map.osm’ using driver `OSM’ Simple feature collection with 218 features and 9 fields geometry type: LINESTRING dimension: XY bbox: xmin: 121.3 ymin: 24.93 xmax: 121.4 ymax: 24.97 epsg (SRID): 4326 proj4string: +proj=longlat +datum=WGS84 +no_defs

Reading layer points' from data source/Users/martin/Desktop/GitHub/Courses/course-data-visualization/108-1/map.osm’ using driver `OSM’ Simple feature collection with 369 features and 10 fields geometry type: POINT dimension: XY bbox: xmin: 121.3 ymin: 24.93 xmax: 121.4 ymax: 24.96 epsg (SRID): 4326 proj4string: +proj=longlat +datum=WGS84 +no_defs

Reading layer multipolygons' from data source/Users/martin/Desktop/GitHub/Courses/course-data-visualization/108-1/map.osm’ using driver `OSM’ Simple feature collection with 258 features and 25 fields geometry type: MULTIPOLYGON dimension: XY bbox: xmin: 121.4 ymin: 24.94 xmax: 121.4 ymax: 24.95 epsg (SRID): 4326 proj4string: +proj=longlat +datum=WGS84 +no_defs

5.10.1.2 Overpass query

add feature
行政區

admin_level: 5

osm資料對於每一個feature的geometry元素皆有命名,且此名稱是所有geometry feature代碼的串接,因此名稱會太長,超過R內定可容忍長度,而產生如下Error:

Error in do.call(rbind, x) : variable names are limited to 10000 bytes

下面程式碼會將命稱改以簡單數字命名:

5.10.2 ggmap

An R package that makes it easy to retrieve raster map tiles from popular online mapping services like Google Maps and Stamen Maps and plot them using the ggplot2 framework.