转发http://www.cnblogs.com/fanyongbin/p/5000791.html
############################################
# 输入国内两个地点
# 根据经纬度计算两个经纬度之间的距离
############################################
# 计算距离函数
add_dist <- function(address1,address2){
add_id <- c(address1,address2)
#载入需要的包
library(rjson)
library(RCurl)
library(geosphere)
#输入自己申请的百度地图的AK密钥
AK <- "hplC6hoMjuulBA0cU2IlAtTW"
#设定空向量
baidu_lat <- c()
baidu_lng <- c()
baidu_geo <- c()
address <-c()
for (location in add_id) {
#建立地址转换网址
url <- paste("http://api.map.baidu.com/geocoder/v2/?ak=",AK,"&output=json&address=",location, sep = "")
url_string <- URLencode(url)
# 捕获连接对象
connect <- url(url_string)
# 处理json对象
temp_geo <- fromJSON(paste(readLines(connect,warn = F), collapse = ""))
temp_lat<-temp_geo$result$location$lat
temp_lng<-temp_geo$result$location$lng
# 关闭连接
close(connect)
baidu_geo <-c(baidu_geo,temp_geo)
baidu_lat <- c(baidu_lat,temp_lat)
baidu_lng <- c(baidu_lng,temp_lng)
address <- c(address,location)
}
content <- data.frame(address,baidu_lat,baidu_lng)
# 提取经纬度
lonlat <- cbind(content$baidu_lng,content$baidu_lat)
# 精确计算,椭圆
# 应用航海上运用广泛的半正矢公式
# 详细见https://zh.wikipedia.org/wiki/%E5%A4%A7%E5%9C%86%E8%B7%9D%E7%A6%BB
dist = round(distm(lonlat[1,],lonlat[2,], fun=distVincentyEllipsoid),0)
result <- data.frame(address1,address2,dist)
return(result)
}
# 测试
add_dist("深圳大学","北京师范大学")