열지도(heatmap)

챗GPT 도움을 받아 열지도(Heatmap)을 제작한다.

저자
소속

1 챗GPT

generate dataset for leaflet heatmap in r

Creating a dataset for a leaflet heatmap in R involves a few steps. You’ll need a set of geographic points, each with a latitude and longitude, and an associated value that you want to use to generate the heat map. The value might represent anything from population density to temperature to the number of occurrences of a specific event.

Here’s an example of how to create a basic dataset in R:

코드
# Create a data frame
heatmap_data <- data.frame(
  "Lat" = c(40.7128, 34.0522, 41.8781, 29.7604, 39.7392),    # latitudes of some US cities
  "Lon" = c(-74.0060, -118.2437, -87.6298, -95.3698, -104.9903),   # longitudes of some US cities
  "Value" = c(100, 200, 150, 80, 120)    # some made-up values
)

# Print the data frame
print(heatmap_data)

This script generates a simple data frame with latitude, longitude, and a value column. The latitude and longitude represent locations (in this case, some major US cities), and the ‘Value’ represents some made-up values.

Please replace the coordinates and values with your own data.

Once the dataset is ready, you can use the leaflet package in R to create a heatmap. Here is a simple example:

코드
# install the necessary packages if you haven't already
install.packages(c("leaflet", "viridis"))
library(leaflet)
library(viridis)

# create the heatmap
leaflet(heatmap_data) %>%
  addTiles() %>%
  addHeatmap(
    lng = ~Lon,
    lat = ~Lat,
    intensity = ~Value,
    radius = 20,
    blur = 15,
    max = 0.05,
    gradient = colorRampPalette(viridis(6))(6)
  )

This script generates a leaflet heatmap using the leaflet and viridis libraries. The addHeatmap function adds a heatmap layer to the map. The lng, lat, and intensity arguments specify the longitude, latitude, and values to use for the heatmap. The radius, blur, and max parameters control the appearance of the heatmap, and the gradient argument sets the color scheme.

코드
# Create a data frame
heatmap_data <- data.frame(
  "Lat" = c(40.7128, 34.0522, 41.8781, 29.7604, 39.7392),    # latitudes of some US cities
  "Lon" = c(-74.0060, -118.2437, -87.6298, -95.3698, -104.9903),   # longitudes of some US cities
  "Value" = c(100, 200, 150, 80, 120)    # some made-up values
)

# install.packages(c("leaflet", "leaflet.extras", "viridis"))
library(leaflet)
library(leaflet.extras)
library(viridis)

# create the heatmap
leaflet(heatmap_data) %>%
  addTiles() %>%
  addHeatmap(
    lng = ~Lon,
    lat = ~Lat,
    intensity = ~Value,
    radius = 20,
    blur = 15,
    max = 0.05,
    gradient = colorRampPalette(viridis(6))(6)
  )

2 지진 (최근3일)

2.1 데이터

기상청_지진정보 조회서비스에서 활용신청을 한 후에 API를 통해 기상청에서 제공하는 지진정보 데이터를 가져온다. 현재날짜기준 3일간 데이터만 최근 발생한 지진 데이터만 제공한다.

코드
library(tidyverse)
library(httr)

eq_req <- glue::glue("http://apis.data.go.kr/1360000/EqkInfoService/getEqkMsg",
                     "?serviceKey={Sys.getenv('EARTHQUAKE_API_KEY')}",
                     "&pageNo=1", 
                     "&numOfRows=1000", 
                     "&dataType=JSON", 
                     "&fromTmFc={str_remove_all(Sys.Date()-3, '-')}",
                     "&toTmFc={str_remove_all(Sys.Date(), '-')}")


eq_resp <- GET(eq_req)

eq_json <- content(eq_resp, type = "text")

eq_list <- jsonlite::fromJSON(eq_json) 

listviewer::jsonedit(eq_list)

2.2 데이터프레임

코드
library(gt)
library(gtExtras)

eq_tbl <- pluck(eq_list, "response") %>% 
  pluck("body") %>% 
  pluck("items") %>% 
  pluck("item") %>% 
  as_tibble() %>% 
  mutate(lat = as.numeric(lat),
        lon = as.numeric(lon))

eq_tbl %>% 
  select(지도=img, 발생위치=loc, 진앙시=tmEqk, 규모=mt, 진도=inT, 깊이=dep, 참고사항=rem) %>% 
  mutate(진앙시 = lubridate::ymd_hms(진앙시)) %>% 
  gt() %>% 
    cols_align(align="center")  %>% 
    gt_img_rows(columns = 지도, height = 200) %>% 
    gt_theme_538()
지도 발생위치 진앙시 규모 진도 깊이 참고사항
통가 누쿠알로파 남쪽 325km 해역 2023-06-25 16:16:59 6.0 7 국내영향없음. 위 자료는 미지질조사소(USGS) 분석결과임.
북한 함경북도 길주 북북서쪽 42km 지역 2023-06-25 11:55:14 2.4 최대진도 Ⅰ 17 자연지진으로 분석됨
코드

# eq_tbl %>%
#   write_rds("data/eq_tbl_20230627.rds")

2.3 시각화

코드
library(leaflet.extras)
library(leaflet)
library(viridis)

eq_tbl <- 
  read_rds("data/eq_tbl_20230627.rds")

eq_tbl %>% 
  leaflet() %>%
    addTiles() %>%
    addHeatmap(
      lng = ~lon,
      lat = ~lat,
      intensity = ~mt,
      radius = 20,
      blur = 15,
      max = 0.05,
      gradient = colorRampPalette(viridis(6))(6)
    )

3 지진과 발전소 (1900~)

3.1 지진 데이터

기상청 국내지진조회에서 엑셀파일로 데이터를 다운로드 받는다. 조회조건을 1900년 1월 1일부터하면 1978년이 첫 번째 기록된 지진기록으로 나온다.

코드
library(readxl)

eq_xlsx <- read_excel("data/기상청_지진_19000101_20230627.xlsx", skip = 1)

eq_xlsx %>% 
  count(최대)
#> # A tibble: 7 × 2
#>   최대      n
#>   <chr> <int>
#> 1 Ⅰ       258
#> 2 Ⅱ        55
#> 3 Ⅲ        65
#> 4 Ⅳ        20
#> 5 Ⅴ         4
#> 6 진도      1
#> 7 <NA>   1753

eq_xlsx_tbl <- eq_xlsx %>% 
  slice(2:n()) %>% 
  janitor::clean_names(ascii = FALSE) %>% 
  mutate(lat = parse_number(위도),
         lon = parse_number(경도)) %>% 
  mutate(깊이_km = as.numeric(깊이_km))

eq_xlsx_tbl %>% 
  select(지도=img, 위치, 규모, 발생시각, 깊이_km) %>%  
  slice_sample(n = 20) %>% 
  gt() %>% 
    cols_align(align="center")  %>% 
    gt_img_rows(columns = 지도, height = 200) %>% 
    gt_theme_538()
지도 위치 규모 발생시각 깊이_km
충남 태안군 서격렬비도 남서쪽 134km 해역 2.3 2022-09-23 07:40:30 NA
경북 울진군 서쪽 7km 지역 2.5 2018-08-29 05:01:29 11
강원 원주시 동남동쪽 15km 지역 2.5 2002-04-01 07:46:02 NA
충남 태안군 서격렬비열도 서남서쪽 40km 해역 2.6 2003-06-08 02:07:57 NA
경북 문경시 북동쪽 26km 지역 2.2 2018-09-14 09:08:13 14
경북 포항시 북구 북쪽 6km 지역 2.4 2017-11-15 14:50:05 8
경북 영덕군 북북동쪽 22km 해역 2.6 2017-05-04 01:08:27 16
경북 포항시 남구 동남동쪽 33km 해역 2.6 2016-06-15 02:07:18 20
북한 황해남도 용연 남쪽 32km 해역 2.2 2009-12-26 10:55:50 NA
제주 서귀포시 동쪽 58km 해역 2.4 2019-05-13 23:50:38 17
북한 황해북도 사리원 서쪽 9km 지역 2.1 2013-11-16 22:32:45 NA
경북 포항시 남구 동남동쪽 41km 해역 2.1 2002-07-12 08:17:37 NA
경북 안동시 서북서쪽 12km 지역 2.9 1985-05-13 18:26:38 NA
서울 북방 약 150km 지역 3.1 1983-07-27 00:25:23 NA
북한 황해북도 송림시 동쪽 19km 지역 2.5 2016-02-28 16:52:38 6
경북 안동시 동쪽 15km 지역 3.1 2013-02-04 05:39:25 NA
충남 보령시 서남서쪽 43km 해역 2.3 2013-06-29 13:32:48 NA
경북 영덕군 동북동쪽 28km 해역 2.0 2019-10-13 19:52:44 20
북한 함경북도 길주 북북서쪽 54km 지역 2.7 2017-10-13 01:41:08 NA
경북 의성군 서북서쪽 19km 지역 2.1 2018-06-15 11:10:02 14

3.2 발전소 데이터

코드
library(sf)

## 1.2. 원전 데이터 
np_df <- tribble(~name, ~address, ~lat, ~lon,
                "고리", "부산광역시 기장군 장안읍 고리", 35.459936176050455, 129.31042595766428,
                "월성", "경상북도 경주시 양남면 나아리", 35.61415131635102, 129.47316094301584,
                "한빛", "전라남도 영광군 홍농읍 계마리", 35.51221255154207, 126.578604835085,
                "한울", "경상북도 울진군 북면 부구리", 37.18011679577809, 129.16451181750688)

projcrs <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"

np_sf <- st_as_sf(x = np_df,                         
           coords = c("lon", "lat"),
           crs = projcrs)

3.3 시각화

코드
eq_xlsx_tbl %>% 
  select(lat,lon, 규모) %>% 
  drop_na() %>% 
  leaflet() %>%
    addTiles() %>%
    addHeatmap(
      lng = ~lon,
      lat = ~lat,
      intensity = ~규모,
      # radius = 30,
      blur = 40,
      max = 0.05,
      gradient = colorRampPalette(viridis(5))(5)
      # gradient="RdYlGn"
    ) %>% 
    addMarkers(data = np_df, lng=~lon, lat=~lat, clusterOptions = markerClusterOptions(),
                popup = ~ as.character(paste0("<strong>", name, "</strong><br>",
                                             "--------------------------------<br>",
                                             "&middot; 주소: ", address)))