求R中4个坐标的中点坐标
Find the coordinates of mid point of 4 coordinates in R
首先感谢大家对我之前的问题的帮助。
我试图寻找一个可以为我的数据集找到中心坐标的函数:
df <- read.table(sep=",", col.names=c("Start_Latitude","Start_Longitude","End_Latitude", "End_Longitude"),text="43.9567343, -78.8571382, 43.9399364, -78.8497342")
Start_Latitude Start_Longitude End_Latitude End_Longitude
43.9567343 -78.8571382 43.9399364 -78.8497342
我试过这段代码,但它只计算从起点坐标到终点坐标的距离,我想找到中点坐标而不仅仅是距离。我的意思是我需要找到中点的经度和纬度。
#dd the distance as column in the dataframe
df1$dist <- distm(x = df[, c('Start_Longitude', 'Start_Longitude')],
y = df[, c('End_Longitude', 'End_Latitude')],
fun = distHaversine
)
我有这个数据集:
Start_Latitude Start_Longitude End_Latitude End_Longitude dist
43.9567343 -78.8571382 43.9399364 -78.8497342 13669708
有没有办法找到中点的经纬度?另外,如何计算以公里为单位的距离。
提前致谢!
这是 geosphere::midPoint
的方法:
library(geosphere)
data.frame(df,
dist = distHaversine(df[, c('Start_Longitude', 'Start_Latitude')],
df[, c('End_Longitude', 'End_Latitude')]) / 1000,
midPoint(p1 = df[, c('Start_Longitude', 'Start_Latitude')],
p2 = df[, c('End_Longitude', 'End_Latitude')]))
# Start_Latitude Start_Longitude End_Latitude End_Longitude dist lon lat
#1 43.95673 -78.85714 43.93994 -78.84973 1.96183 -78.85344 43.94834
可以通过平均纬度/经度组合来计算中点。使用原始 post 中的数据,我们使用 dplyr::mutate()
计算中点。
textFile <- "Start_Latitude Start_Longitude End_Latitude End_Longitude
43.9567343 -78.8571382 43.9399364 -78.8497342
41.947460 -87.654730 41.890620 -87.624480"
data <- read.table(text=textFile,header=TRUE)
library(dplyr)
data %>% rowwise(.) %>%
mutate(midpoint_lat = sum(Start_Latitude,End_Latitude)/2,
midpoint_long = sum(Start_Longitude,End_Longitude)/2) %>%
as.data.frame(.) # print as df, not tibble
...输出:
Start_Latitude Start_Longitude End_Latitude End_Longitude id midpoint_lat
1 43.95673 -78.85714 43.93994 -78.84973 1 43.94834
2 41.94746 -87.65473 41.89062 -87.62448 2 41.91904
midpoint_long
1 -78.85344
2 -87.63961
正在计算距离(公里)
如 distHaversine() function from the geosphere 包的帮助中所述,结果中的度量单位是根据地球半径的给定参数返回的。默认值为 r = 6378137
米,因此测量单位以米为单位返回。
要转换为公里,有两种选择:
- 将结果除以 1,000(如该问题的其他答案所示),或
- 将参数
r
更改为 6378.137
首先感谢大家对我之前的问题的帮助。
我试图寻找一个可以为我的数据集找到中心坐标的函数:
df <- read.table(sep=",", col.names=c("Start_Latitude","Start_Longitude","End_Latitude", "End_Longitude"),text="43.9567343, -78.8571382, 43.9399364, -78.8497342")
Start_Latitude Start_Longitude End_Latitude End_Longitude
43.9567343 -78.8571382 43.9399364 -78.8497342
我试过这段代码,但它只计算从起点坐标到终点坐标的距离,我想找到中点坐标而不仅仅是距离。我的意思是我需要找到中点的经度和纬度。
#dd the distance as column in the dataframe
df1$dist <- distm(x = df[, c('Start_Longitude', 'Start_Longitude')],
y = df[, c('End_Longitude', 'End_Latitude')],
fun = distHaversine
)
我有这个数据集:
Start_Latitude Start_Longitude End_Latitude End_Longitude dist
43.9567343 -78.8571382 43.9399364 -78.8497342 13669708
有没有办法找到中点的经纬度?另外,如何计算以公里为单位的距离。
提前致谢!
这是 geosphere::midPoint
的方法:
library(geosphere)
data.frame(df,
dist = distHaversine(df[, c('Start_Longitude', 'Start_Latitude')],
df[, c('End_Longitude', 'End_Latitude')]) / 1000,
midPoint(p1 = df[, c('Start_Longitude', 'Start_Latitude')],
p2 = df[, c('End_Longitude', 'End_Latitude')]))
# Start_Latitude Start_Longitude End_Latitude End_Longitude dist lon lat
#1 43.95673 -78.85714 43.93994 -78.84973 1.96183 -78.85344 43.94834
可以通过平均纬度/经度组合来计算中点。使用原始 post 中的数据,我们使用 dplyr::mutate()
计算中点。
textFile <- "Start_Latitude Start_Longitude End_Latitude End_Longitude
43.9567343 -78.8571382 43.9399364 -78.8497342
41.947460 -87.654730 41.890620 -87.624480"
data <- read.table(text=textFile,header=TRUE)
library(dplyr)
data %>% rowwise(.) %>%
mutate(midpoint_lat = sum(Start_Latitude,End_Latitude)/2,
midpoint_long = sum(Start_Longitude,End_Longitude)/2) %>%
as.data.frame(.) # print as df, not tibble
...输出:
Start_Latitude Start_Longitude End_Latitude End_Longitude id midpoint_lat
1 43.95673 -78.85714 43.93994 -78.84973 1 43.94834
2 41.94746 -87.65473 41.89062 -87.62448 2 41.91904
midpoint_long
1 -78.85344
2 -87.63961
正在计算距离(公里)
如 distHaversine() function from the geosphere 包的帮助中所述,结果中的度量单位是根据地球半径的给定参数返回的。默认值为 r = 6378137
米,因此测量单位以米为单位返回。
要转换为公里,有两种选择:
- 将结果除以 1,000(如该问题的其他答案所示),或
- 将参数
r
更改为 6378.137