在R & sf中,如何更新所选要素的坐标?

nvbavucw  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(119)

我遇到了一个看似简单的问题。我想手动更正所选点的地理编码结果。假设“Dare”的质心需要更新:

library(sf)     
nc <- st_centroid(st_read(system.file("shape/nc.shp", package = "sf")))
st_coordinates(filter(nc, NAME== "Dare"))

如何更改的原始值

X        Y
1 -75.80982 35.73548

变成不同的东西?
我以为会是

st_coordinates(filter(nc, NAME== "Dare")) <- matrix(c(-73, 33), nrow = 1)

或者

nc %>% 
  mutate(geometry = ifelse(place_full_name == "Dare", 
                           yes = st_set_geometry(c(-73, 33)), 
                           no = geometry))

但两种解决方案都产生了错误。

gopyfrb3

gopyfrb31#

使用st_geometry<-

  • 获取 * 原始几何图形(仅用于检查):
st_geometry(nc[nc$NAME == "Dare", ])
# Geometry set for 1 feature 
# geometry type:  POINT
# dimension:      XY
# bbox:           xmin: -75.80982 ymin: 35.73548 xmax: -75.80982 ymax: 35.73548
# epsg (SRID):    4267
# proj4string:    +proj=longlat +datum=NAD27 +no_defs
# POINT (-75.80982 35.73548)

st_geometry<- * 替换 * 选定的几何图形。替换值需要是简单的特征几何图形,因此为st_sfc(st_point(...

st_geometry(nc[nc$NAME == "Dare", ]) <-  st_sfc(st_point(c(-80, 40)))

# check again
st_geometry(nc[nc$NAME == "Dare", ])
# Geometry set for 1 feature 
# geometry type:  POINT
# dimension:      XY
# bbox:           xmin: -80 ymin: 40 xmax: -80 ymax: 40
# epsg (SRID):    4267
# proj4string:    +proj=longlat +datum=NAD27 +no_defs
# POINT (-80 40)

注:

Twitter discussion shared by @radek中,sf包的作者@Edzer Pebesma注解说原始几何体的边界框没有更新。
原始定界框:

st_bbox(nc)
#      xmin      ymin      xmax      ymax 
# -84.05976  34.07663 -75.80982  36.49101

用原始边界框外的坐标替换选定的几何图形,此处x小于xminy大于ymax

st_geometry(nc[nc$NAME == "Dare", ]) <-  st_sfc(st_point(c(-90, 40)))

对象的bbox未更新:

st_bbox(nc)
#      xmin      ymin      xmax      ymax 
# -84.05976  34.07663 -75.80982  36.49101
vx6bjr1n

vx6bjr1n2#

可以像@Henrik的answer那样使用st_geometry<-,但要替换整个几何体,以便也更新边界框。

st_geometry(nc) <- st_sfc(
    ifelse(nc$NAME == "Dare", st_sfc(st_point(c(-90, 40))), nc$geometry),
    crs = st_crs(nc$geometry))

请查看对象的bbox现在已更新:

st_bbox(nc)
#      xmin      ymin      xmax      ymax 
# -90.00000  34.07663 -76.02750  40.00000

相关问题