############################################ # 输入国内两个地点 # 根据经纬度计算两个经纬度之间的距离 ############################################ # 首先运行计算距离函数 # 输入要计算距离的两个地名 # 要求为国内地址,输入为汉字。 add_id <- c("北京师范大学","深圳大学") # 输出距离 add_dist(add_id) # 计算距离函数 add_dist <- function(add_id){ #载入需要的包 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) address1 <- add_id[1] address2 <- add_id[2] result <- data.frame(address1,address2,dist) return(result) }
感谢:
1.http://www.zhihu.com/question/28565852/answer/69047752
原文:http://www.cnblogs.com/fanyongbin/p/5000791.html