R sf:将几何体中的Lat/Long写入单独的列,并保留ID列
我有一个df,其中多边形ID来自一个形状文件,其中心点位于几何体列中:R sf:将几何体中的Lat/Long写入单独的列,并保留ID列,r,sf,R,Sf,我有一个df,其中多边形ID来自一个形状文件,其中心点位于几何体列中: # A tibble: 3 x 2 ID geometry <dbl> <POINT [°]> 1 1 (117.2 31.8) 2 2 (116.4 40.1) 3 4 (117.9 26) #一个tible:3 x 2 ID几何 1 1 (117.2 31.8) 2 2 (116.4 40.1) 3 4 (117.9
# A tibble: 3 x 2
ID geometry
<dbl> <POINT [°]>
1 1 (117.2 31.8)
2 2 (116.4 40.1)
3 4 (117.9 26)
#一个tible:3 x 2
ID几何
1 1 (117.2 31.8)
2 2 (116.4 40.1)
3 4 (117.9 26)
我想将纬度/经度值放在单独的列中,因此:
library(sf)
centres<- as.data.frame(st_coordinates(df))
库(sf)
中心使用unlist+map()的解决方案
库(tidyverse)
分离的合作伙伴%
突变(lat=unlist(映射(df$geometry,1)),
long=unlist(映射(df$geometry,2)))
分离坐标
一种可能的方法是取消它的列表
setNames(data.frame(df[[1]],
matrix(unlist(df[2]), ncol=2, byrow=TRUE)),
c("ID", "lon", "lat"))
# ID lon lat
# 1 1 117.2 31.8
# 2 2 116.4 40.1
# 3 4 117.9 26.0
解释
使用str(df)
检查数据结构显示变量-geometry
-处于列表
格式,这可能是不规则的。解决此问题的一种方法是unlist()
it,将其转换为2列矩阵,并将其与第一列重新组合。使用setNames()
我们可以一步分配新列名。st\u geometry
可以与dplyr::mutate
一起使用:
library(magrittr)#用于管道
df%
dplyr::mutate(lat=sf::st_坐标(.)[,1],
lon=sf::st_坐标(.)[,2])
df
具有3个功能和3个字段的简单功能集合
几何图形类型:点
尺寸:XY
bbox:xmin:116.4ymin:26xmax:117.9ymax:40.1
CRS:EPSG:4326
#一个tibble:3x4
三维几何
*
1 1 (117.2 31.8) 117. 31.8
2 2 (116.4 40.1) 116. 40.1
3 4 (117.9 26) 118. 26
如果您不再关心几何体
,请使用df%>%sf::st_set_geometry(NULL)
cbind(df,st_坐标(df))
在标准数据帧中进行转换,谢谢!干得好,格雷特汉克斯!非常有效long
和lat
可能是错误的方法(使用epsg 4236时)。这非常有效。我认为它应该是一个随sf
附带的函数,类似于add_coordinates()
。很好的解决方案。也许翻转lon和lat标签?
library(tidyverse)
separated_coord <- df %>%
mutate(lat = unlist(map(df$geometry,1)),
long = unlist(map(df$geometry,2)))
separated_coord
setNames(data.frame(df[[1]],
matrix(unlist(df[2]), ncol=2, byrow=TRUE)),
c("ID", "lon", "lat"))
# ID lon lat
# 1 1 117.2 31.8
# 2 2 116.4 40.1
# 3 4 117.9 26.0