주출입구의 좌표정보가 결합된 위치정보요약DB를 행정안전부 주소정책과에서 제공하고 있다.
위치정보요약 매뉴얼에 제공되는 주출입구 위치는 GRS80 UTM-K 좌표 기준으로 제공되고 있다. 따라서, 공간정보 시각화를 위해서 좌표를 조정해야 정확한 위치를 파악할 수 있게 된다.
library(tidyverse)
library(slickR)
library(pdftools)
manual_pdf <- pdf_convert("data/location_db/location_DB_manual.pdf",format = 'png',verbose = FALSE)
fs::file_move("location_DB_manual_1.png", "fig/")
fs::file_move("location_DB_manual_2.png", "fig/")
fs::file_move("location_DB_manual_3.png", "fig/")
manual_pdf_df <- tibble(page = glue::glue("fig/{manual_pdf}") )
slickR(manual_pdf_df$page, height = 600)
먼저, 매뉴얼 PDF에서 스키마를 참조하여 필드명을 추출한다.
## 칼럼명
library(tabulizer)
# locate_areas("data/location_db/location_DB_manual.pdf", pages = 2)
loc_fieldname <- extract_tables("data/location_db/location_DB_manual.pdf",
pages = 2,
guess = FALSE,
area = list(c(206.42936, 27.64179, 647.18799, 524.37831)),
encoding = "UTF-8")
loc_fieldname_vec <- loc_fieldname[[1]] %>%
as.data.frame() %>%
select(V2) %>%
slice(4:25) %>%
filter(!is.na(V2), V2!="") %>%
mutate(변수명 = str_extract(V2, "[가-힣a-zA-Z]+")) %>%
pull(변수명)
loc_fieldname_vec
[1] "시군구코드" "출입구일련번호" "법정동코드" "시도명"
[5] "시군구명" "읍면동명" "도로명코드" "도로명"
[9] "지하여부" "건물본번" "건물부번" "건물명"
[13] "우편번호" "건물용도분류" "건물군여부" "관할행정동"
[17] "X좌표" "Y좌표"
앞서 추출한 칼럼명을 위치정보요약DB 본파일에 입혀 후속 작업을 진행할 수 있도록 데이터프레임을 제작한다.
loc_dat <- read_delim("data/location_db/entrc_mod.txt", col_names = FALSE, delim = "|")
## 인코딩 변환: CP949 --> UTF-8
loc_df <- loc_dat %>%
mutate_all(iconv, from = "CP949", to = "UTF-8") %>%
set_names(c(loc_fieldname_vec, "이동사유코드")) %>%
na.omit() %>%
mutate(X좌표 = as.numeric(X좌표),
Y좌표 = as.numeric(Y좌표))
loc_df %>%
sample_n(10) %>%
DT::datatable()
st_as_sf()
함수 내부에 X좌표와 Y좌표를 적어주고 변환하고자 하는 좌표계를 지정하면 해당 좌표계로 변환할 수 있다.
library(sf)
## KATEC --> UTM-K
loc_katec_sf <- loc_df %>%
st_as_sf(coords = c("X좌표", "Y좌표"), crs = 5179 )
st_crs(loc_katec_sf)
Coordinate Reference System:
User input: EPSG:5179
wkt:
PROJCRS["Korea 2000 / Unified CS",
BASEGEOGCRS["Korea 2000",
DATUM["Geocentric datum of Korea",
ELLIPSOID["GRS 1980",6378137,298.257222101,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4737]],
CONVERSION["Korea Unified Belt",
METHOD["Transverse Mercator",
ID["EPSG",9807]],
PARAMETER["Latitude of natural origin",38,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8801]],
PARAMETER["Longitude of natural origin",127.5,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8802]],
PARAMETER["Scale factor at natural origin",0.9996,
SCALEUNIT["unity",1],
ID["EPSG",8805]],
PARAMETER["False easting",1000000,
LENGTHUNIT["metre",1],
ID["EPSG",8806]],
PARAMETER["False northing",2000000,
LENGTHUNIT["metre",1],
ID["EPSG",8807]]],
CS[Cartesian,2],
AXIS["northing (X)",north,
ORDER[1],
LENGTHUNIT["metre",1]],
AXIS["easting (Y)",east,
ORDER[2],
LENGTHUNIT["metre",1]],
USAGE[
SCOPE["unknown"],
AREA["Korea, Republic of (South Korea)"],
BBOX[28.6,122.71,40.27,134.28]],
ID["EPSG",5179]]
Simple feature collection with 3233 features and 4 fields
geometry type: POINT
dimension: XY
bbox: xmin: 751429.2 ymin: 1473720 xmax: 1298827 ymax: 2039781
projected CRS: Korea 2000 / Unified CS
# A tibble: 3,233 x 5
법정동코드 시도명 시군구명 읍면동명 geometry
<chr> <chr> <chr> <chr> <POINT [m]>
1 1121510300 서울특별시 광진구 구의동 (963751.3 1949323)
2 1121510300 서울특별시 광진구 구의동 (963453.8 1949733)
3 1123010900 서울특별시 동대문구 휘경동 (960651.1 1954445)
4 1130510300 서울특별시 강북구 수유동 (957250.6 1959784)
5 1135010500 서울특별시 노원구 상계동 (960882 1964242)
6 1141011900 서울특별시 서대문구 북가좌동 (948710 1953846)
7 1141011800 서울특별시 서대문구 홍은동 (949465.2 1953500)
8 1147010200 서울특별시 양천구 목동 (944287.1 1949767)
9 1150010500 서울특별시 강서구 마곡동 (941536.5 1951791)
10 1150010800 서울특별시 강서구 공항동 (939428.6 1950859)
# ... with 3,223 more rows
## WGS84 --> GPS
loc_gps_sf <- loc_df %>%
st_as_sf(coords = c("X좌표", "Y좌표"), crs = 4326 )
st_crs(loc_gps_sf)
Coordinate Reference System:
User input: EPSG:4326
wkt:
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
USAGE[
SCOPE["unknown"],
AREA["World"],
BBOX[-90,-180,90,180]],
ID["EPSG",4326]]
Simple feature collection with 3233 features and 4 fields
geometry type: POINT
dimension: XY
bbox: xmin: 751429.2 ymin: 1473720 xmax: 1298827 ymax: 2039781
geographic CRS: WGS 84
# A tibble: 3,233 x 5
법정동코드 시도명 시군구명 읍면동명 geometry
<chr> <chr> <chr> <chr> <POINT [arc_degree]>
1 1121510300 서울특별시 광진구 구의동 (963751.3 1949323)
2 1121510300 서울특별시 광진구 구의동 (963453.8 1949733)
3 1123010900 서울특별시 동대문구 휘경동 (960651.1 1954445)
4 1130510300 서울특별시 강북구 수유동 (957250.6 1959784)
5 1135010500 서울특별시 노원구 상계동 (960882 1964242)
6 1141011900 서울특별시 서대문구 북가좌동 (948710 1953846)
7 1141011800 서울특별시 서대문구 홍은동 (949465.2 1953500)
8 1147010200 서울특별시 양천구 목동 (944287.1 1949767)
9 1150010500 서울특별시 강서구 마곡동 (941536.5 1951791)
10 1150010800 서울특별시 강서구 공항동 (939428.6 1950859)
# ... with 3,223 more rows
건물용도분류에 따라 기타 포함 6개 범주로 시각화해보자.
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com