Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R sf:将几何体中的Lat/Long写入单独的列,并保留ID列_R_Sf - Fatal编程技术网

R sf:将几何体中的Lat/Long写入单独的列,并保留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

我有一个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 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