利用R语言计算国内两个地点的距离

转发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("深圳大学","北京师范大学")
### 回答1: 可以使用以下代码: from math import radians, cos, sin, asin, sqrt def haversine(lon1, lat1, lon2, lat2): # 将十进制度数转化为弧度 lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) # haversine公式 dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 c = 2 * asin(sqrt(a)) r = 6371 # 地球平均半径,单位为公里 return c * r ### 回答2: 下面是一个用Python编写的计算两个经纬度之间距离的代码: ```python import math def distance_between_coordinates(lat1, lon1, lat2, lon2): # 将经纬度转换为弧度 lat1_rad = math.radians(lat1) lon1_rad = math.radians(lon1) lat2_rad = math.radians(lat2) lon2_rad = math.radians(lon2) # 使用Haversine公式计算距离 dlon = lon2_rad - lon1_rad dlat = lat2_rad - lat1_rad a = math.sin(dlat/2) ** 2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon/2) ** 2 c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a)) distance = 6371 * c return distance # 例子: lat1 = 40.7128 lon1 = -74.0060 lat2 = 34.0522 lon2 = -118.2437 result = distance_between_coordinates(lat1, lon1, lat2, lon2) print("两个坐标之间的距离:", result, "公里") ``` 上述代码使用了Haversine公式计算两个坐标之间的地表距离。其中`lat1`和`lon1`表示第一个坐标点的纬度和经度,`lat2`和`lon2`表示第二个坐标点的纬度和经度。最后输出的是距离的值,单位为公里。 注意,上述代码只适用于球面上的距离计算,不适用于计算地球上的距离。如果需要更精确的计算,可以考虑使用更复杂的法。 ### 回答3: 您好!以下是用Python语言编写的一个计算两个经纬度之间距离的代码: ```python import math def calculate_distance(lat1, lon1, lat2, lon2): # 地球平均半径,单位为千米 earth_radius = 6371.0 # 将经纬度从度数转换为弧度 lat1 = math.radians(lat1) lon1 = math.radians(lon1) lat2 = math.radians(lat2) lon2 = math.radians(lon2) # 计算经度和纬度的差值 dlon = lon2 - lon1 dlat = lat2 - lat1 # 使用Haversine公式计算两点间的距离 a = math.sin(dlat / 2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon / 2) ** 2 c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) # 计算两点间的直线距离 distance = earth_radius * c return distance # 示例使用 lat1 = 39.908823 lon1 = 116.397470 lat2 = 40.908823 lon2 = 116.497470 distance = calculate_distance(lat1, lon1, lat2, lon2) print("两个经纬度之间的距离为:", distance, "千米") ``` 以上代码使用了Haversine公式来计算两个经纬度之间的距离。根据给定的经纬度,通过计算经度和纬度的差值,然后利用Haversine公式和地球半径,最终得到两个经纬度之间的直线距离(单位:千米)。在示例使用中,我们计算了(39.908823,116.397470)和(40.908823,116.497470)这两个点之间的距离,并将结果打印输出。请根据实际需求修改代码中的经纬度值,以获得您需要的计算结果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值