data analysis & visualization

주소를 위경도로 변환

공간정보 오픈 플랫폼에서 제공하는 위도, 경도를 주소로 변환하는 방법과 주소를 위도, 경도로 바꾸는 방법을 알아보고자 한다. 

 

공간정보오픈플랫폼

 


회원가입을 한 뒤 위와 같이 접속

 

좌표계 설정

 

요청 변수 설정

api key

key=''

#address
add=c('대구대','경주시 성건동') 

post=paste0('http://api.vworld.kr/req/address?service=address&request=getCoord&key=',key,
'&address=',add,'&type=road')

 

CRS 등 &CRS=EPSG:4326 처럼 추가로 입력하면 된다.

 

iconv는 인코딩을 변경하는 코드이며, URLencode는 URL에 맞게 변환하는 코드이다.

 

url=sapply((iconv(post, from = "cp949", to = "UTF-8")),URLencode) 
library(XML) 
library(rjson) 
url_query=sapply(url,function(x){readLines(x,encoding='UTF-8')}) 

data.frame(dplyr::rbind_list(lapply(
sapply(url_query,function(x){paste0(x,collapse = '')}),
function(x)data.frame(fromJSON(x)))))[,20:21] 

URL이 여러개 입력될 것을 고려하여 sapply를 사용하였다. 

readLines는 URL을 불러오는 코드이며, fromJSON을 통해 api를 리스트형식으로 받아올 수 있다.

 

위경도를 주소로 변환

lonlat을 '128.3,38.3'처럼 만들어 post에 입력

입력된 URL을 앞에서와 같이 json형식으로 받아옴.

lonlat=data.frame(dplyr::rbind_list(lapply(sapply(url_query,
function(x){paste0(x,collapse = '')}),
function(x)data.frame(fromJSON(x)))))[,20:21] 

lonlat=paste0(lonlat[,1],',',lonlat[,2]) 
post=paste0('http://api.vworld.kr/req/address?service=address&request=getAddress&key=',key,
'&point=',lonlat,'&type=road') 

url=sapply(iconv(post, from = "cp949", to = "UTF-8"),URLencode) 
library(XML) 
library(rjson) 
url_query=sapply(url,function(x){readLines(x,encoding='UTF-8')}) 
# url_query <- readLines(url,encoding='UTF-8') 

data.frame(dplyr::rbind_list(lapply(sapply(url_query,function(x){paste0(x,collapse = '')}),
function(x)data.frame(fromJSON(x))))) 



불러오는 중입니다...

 

 

공간정보 오픈플랫폼 오픈API

Geocoder API 2.0 레퍼런스 Geocoder API 2.0 레퍼런스입니다. API 버전 : Geocoder API 2.0 레퍼런스 Geocoder API 1.0 레퍼런스 소개 좌표를 주소로 변환하는 서비스를 제공합니다. 요청URL을 전송하면 지오코딩 서비스를 사용하실 수 있으며 일일 지오코딩 요청건수는 최대 30,000건 입니다. 단, API 요청은 실시간으로 사용하셔야 하며 별도의 저장장치나 데이터베이스에 저장할 수 없습니다. 좌표를 주소정보

www.vworld.kr

 

 

'R' 카테고리의 다른 글

[ggplot2] 시각화 정리  (0) 2019.12.08
[R][SQL] RMariaDB 외부 접속 설정하기  (0) 2019.11.29
[ggmap] pie chart 그리기 예제  (0) 2019.11.26
ddply와 setDT 비교  (0) 2019.11.11
[공공데이터 포털] 버스 정류소 API 가져오기  (0) 2019.11.02

library(ggplot2)
library(scatterpie)
library(maps)
set.seed(123)
long <- rnorm(50, sd=100)
lat <- rnorm(50, sd=50)
d <- data.frame(long=long, lat=lat)
d <- with(d, d[abs(long) < 150 & abs(lat) < 70,])
n <- nrow(d)
d$region <- factor(1:n)
d$A <- abs(rnorm(n, sd=1))
d$B <- abs(rnorm(n, sd=2))
d$C <- abs(rnorm(n, sd=3))
d$D <- abs(rnorm(n, sd=4))
d$radius <- 6 * abs(rnorm(n))
head(d)
world <- map_data('world')

p <- ggplot(world, aes(long, lat)) +
  geom_map(map=world, aes(map_id=region), fill=NA, color="black") +
  coord_quickmap()

p + geom_scatterpie(aes(x=long, y=lat, group=region, r=radius),
                    data=d, cols=LETTERS[1:4], color=NA, alpha=.8) +
geom_scatterpie_legend(d$radius, x=-160, y=-55)

ddply와 setDT 비교

R2019. 11. 11. 01:59

속도로 보았을 때 ddply 보다 setDT의 속도가 월등히 빠르다. 이에 따라 예제 코드를 아래와 같이 제시한다. 

 

library(plyr)
data(iris)
temp=ddply(iris,.(Species),summarise,mean=mean(Sepal.Length))
temp=data.table::setDT(iris)[,.(mean=mean(Sepal.Length)),'Species']library(plyr)
data(iris)
temp=ddply(iris,.(Species),summarise,mean=mean(
Sepal.Length))
temp=data.table::setDT(iris)[,.(mean=mean(Sepal.Length)),'Species']

temp2=reshape2::melt(temp,id='Species')
library(ggplot2)
ggplot(temp2, aes(Species, value, fill=factor(Species)))+
  geom_bar(stat='identity', position = 'dodge')+coord_flip()

버스 정류소 API를 받으시려면 공공데이터 포털에서 버스 정류소를 검색!

 

먼저 버스 정류소 API를 받습니다.

 

API를 받은 뒤 아래와 같이 코딩합니다. 

 

url='http://openapi.tago.go.kr/openapi/service/BusSttnInfoInqireService/getSttnNoList?serviceKey='
library(xml2);library(rvest);library(RCurl);library(XML)

# 도시 코드를 조회합니다.
url='http://openapi.tago.go.kr/openapi/service/BusSttnInfoInqireService/getCtyCodeList?serviceKey='
(raw.data <- xmlTreeParse(paste0(url,api), useInternalNodes = TRUE, encoding = "utf-8"))

 

#조회한 도시코드를 활용
url='http://openapi.tago.go.kr/openapi/service/BusSttnInfoInqireService/getSttnNoList?serviceKey='
raw.data <- xmlTreeParse(paste0(url,api,'&cityCode=도시코드&numOfRows=1'), useInternalNodes = TRUE, encoding = "utf-8")
rootNode <- xmlRoot(raw.data)
n=as.character(xmlSApply(rootNode[[2]][['totalCount']],xmlValue))
(raw.data <- xmlTreeParse(paste0(url,api,'&cityCode=37060&numOfRows=',n), useInternalNodes = TRUE, encoding = "utf-8"))

rootNode <- xmlRoot(raw.data)
items <- rootNode[[2]][['items']]
data=NULL
for(i in 1:xmlSize(rootNode[[2]][['items']])){
items_temp=xmlSApply(items[[i]],xmlValue)
lat=as.numeric(items_temp[[1]])
lon=as.numeric(items_temp[[2]])
id=items_temp[[3]]
nm=items_temp[[4]]
no=as.numeric(items_temp[[5]])

data=rbind(data,data.frame(lat,lon,id,nm,no))
}

data

 

#버스 노선정보 또한 같은방법으로 
url='http://openapi.tago.go.kr/openapi/service/BusRouteInfoInqireService/getRouteNoList?serviceKey='
(raw.data <- xmlTreeParse(paste0(url,api,'&cityCode=37060&numOfRows=1'), useInternalNodes = TRUE, encoding = "utf-8"))
rootNode <- xmlRoot(raw.data)
(raw.data <- xmlTreeParse(paste0(url,api,'&cityCode=37060&numOfRows=',xmlSApply(rootNode[[2]][['totalCount']],xmlValue)), useInternalNodes = TRUE, encoding = "utf-8"))
rootNode <- xmlRoot(raw.data)
items <- rootNode[[2]][['items']]
xmlSize(rootNode[[2]][['items']])
data2=NULL
for(i in 1:xmlSize(rootNode[[2]][['items']])){
  items_temp=xmlSApply(items[[i]],xmlValue)
  df=data.frame(t(items_temp),stringsAsFactors = F)
  df$endvehicletime=as.numeric(df$endvehicletime)
  df$startvehicletime=as.numeric(df$startvehicletime)
  data2=rbind(data2,df)
}

data2

#버스 경유지
url='http://openapi.tago.go.kr/openapi/service/BusRouteInfoInqireService/getRouteAcctoThrghSttnList?serviceKey='

data_list=list()
for(id in unique(data2$routeid)){
(raw.data <- xmlTreeParse(paste0(url,api,'&numOfRows=1&cityCode=37060&routeId=',id), useInternalNodes = TRUE, encoding = "utf-8"))
rootNode <- xmlRoot(raw.data)
n=xmlSApply(rootNode[[2]][['totalCount']],xmlValue)
(raw.data <- xmlTreeParse(paste0(url,api,'&numOfRows=',n,'&cityCode=37060&routeId=',id), useInternalNodes = TRUE, encoding = "utf-8"))
rootNode <- xmlRoot(raw.data)
items <- rootNode[[2]][['items']]
data3=NULL
for(i in 1:xmlSize(rootNode[[2]][['items']])){
  items_temp=xmlSApply(items[[i]],xmlValue)
  df=data.frame(t(items_temp),stringsAsFactors = F)
  df$gpslati=as.numeric(df$gpslati)
  df$gpslong=as.numeric(df$gpslong)
  data3=rbind(data3,df)
}
data_list[[id]]=data3

}
library(data.table)
data3=rbindlist(data_list)
data3

'R' 카테고리의 다른 글

[ggmap] pie chart 그리기 예제  (0) 2019.11.26
ddply와 setDT 비교  (0) 2019.11.11
숫자가 너무커서 제대로 안불러와질 때  (0) 2019.09.16
apply 와 sapply의 차이  (0) 2019.07.15
문자열 다루기와 텍스트 마이닝  (0) 2019.07.07

read.csv('cjcjcjcj.csv',sep='|',header=T,colClasses = c('integer','character','numeric','numeric'))

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인