坐标对之间的距离(UTM),单位为km,R

af7jpaap  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(256)

我有一个包含2对UTM(32 N)坐标的 Dataframe ,我需要计算它们之间从原点到目的地的公里差异。我尝试使用sf库,使用“by_element”,但我得到一个错误消息“Error in st_distance(data,by_element = TRUE):!missing_y non è TRUE”。有什么问题吗?如果我不使用“by_element”选项,它可以工作,并创建所有坐标之间的距离矩阵,但这不是我需要的。

library(sf)
df <- data.frame(id = c(1,2,3), x_origin = c(642683.2, 373775,383881 ), y_origin = c(5082920, 4997274,4994504), x_dest =c(642683.3, 1126050,942763.9 ), y_dest=c(5082920, 4374481,4534235  )) 

data <- st_as_sf(df, coords = c("x_origin", "y_origin"), crs="4326" )

distances <- st_distance(data, by_element = TRUE  )
xxe27gdn

xxe27gdn1#

您提供了x(起点)到st_distance(),但没有提供y(终点)。CRS不可能是正确的,如果EPSG代码是字符串,sf无法识别,4326表示坐标是WGS84纬度/经度。假设32632,WGS 84/UTM区域32N。

library(sf)
df <- data.frame(id = c(1,2,3), x_origin = c(642683.2, 373775,383881 ), y_origin = c(5082920, 4997274,4994504), x_dest =c(642683.3, 1126050,942763.9 ), y_dest=c(5082920, 4374481,4534235  )) 
origin <- st_as_sf(df, coords = c("x_origin", "y_origin"), crs=32632 )
dest <- st_as_sf(df, coords = c("x_dest", "y_dest"), crs=32632 )

(distances <- st_distance(origin, dest,  by_element = TRUE ))
#> Units: [m]
#>        1        2        3 
#>      0.1 976621.1 724015.0

创建于2023年1月25日,使用reprex v2.0.2

jv4diomz

jv4diomz2#

首先,sf无法通过您输入数据的方式知道您正在计算起点和终点之间的距离;其次,UTM Zone 32 N的EPSG代码不是4326;第三,您应该使用crs = st_crs(4326)而不是crs = "4326"
使用以下代码段创建计算感兴趣的距离所需的对象

library(sf)
df <- data.frame(id = c(1, 2, 3),
                 x_origin = c(642683.2, 373775, 383881),
                 y_origin = c(5082920, 4997274, 4994504),
                 x_dest = c(642683.3, 1126050, 942763.9),
                 y_dest = c(5082920, 4374481, 4534235))

origin <- st_as_sf(df, coords = c("x_origin", "y_origin"),
                   crs = st_crs(32632))
dest <- st_as_sf(df, coords = c("x_dest", "y_dest"),
                 crs = st_crs(32632))

注意CRS的不同EPSG代码。
接下来,我们计算距离(此投影的默认单位为米)

distances <- st_distance(origin, dest, by_element = TRUE)

如果你使用by_element = FALSE,你会得到所有的两两距离。
最后,我们可以使用units包将距离转换为km(或者我们可以简单地将它们除以1000)。

units::set_units(distances, "km")
> Units: [km]
> [1]   0.0001 976.6211 724.0150

相关问题