R語言:根據經緯度計算國內兩個地點之間的距離


############################################
# 輸入國內兩個地點
# 根據經緯度計算兩個經緯度之間的距離
############################################

# 計算距離函數
add_dist <- function(address1,address2){
        
        add_id <- c(address1,address2)
        
        #載入需要的包
        library(rjson)
        library(RCurl)
        library(geosphere)
        
        #輸入自己申請的百度地圖的AK密鑰
     #以下密鑰必須替換成自己的
     # AK申請網址:http://lbsyun.baidu.com/index.php?title=webapi/direction-api AK <- "" #設定空向量 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("深圳大學","北京師范大學")

#致謝:https://www.zhihu.com/question/28565852/answer/69047752

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM