r - 为什么对 sf 中每个特征差异的不同方法会导致不同的绘图缩放?

标签 r sf

我觉得我似乎缺乏直觉,无法始终了解 sf 对象将如何与 tidyverse 工具交互,尤其是 dplyr。这是一个例子。我们正在寻找两个点缓冲区,然后减去较小的缓冲区,以在每个点周围留下一个环/环。我提供了两种方法。

首先断开几何列,使用 map2 获取环,然后将其连接回原始 sf 数据框。这种方法是有道理的;我知道所有部分是如何工作的,但感觉不“整洁”或整洁,因为我们创建了中间对象,我们必须手动替换 crs,感觉好像很容易不匹配几何形状到属性。

第二种方法是我想出的方法,试图将其保存在单个管道中。在这里,我希望 group_bymutate 可以工作,某种程度上,管理至少可以无错误地运行并且似乎创建了正确的环,但是某些原因导致plot 方法放大远。我也不知道这两种方法的实际作用是否存在任何其他差异。

编辑:不仅仅是绘图缩放不同,st_bbox 的结果也因某种原因而不同。然而,环似乎仍然以点为中心,它们在 mapview::mapview() 中看起来是一样的。还包括 session 信息,我已更新到 R 3.4.4、sf 0.6-1、tidyverse 1.2.1。不过,我会更新其他所有内容,看看会发生什么。

library(tidyverse)
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.2.3, proj.4 4.9.3
set.seed(12345)
points = map2(runif(50, -10, 10), runif(50, -10, 10), ~ st_point(c(.x, .y))) %>%
  st_sfc(crs = 4326) %>%
  st_transform(3857)
sf_pts = st_sf(val = 1:50, geometry = points)

ring1 = st_buffer(points, 50000)
ring2 = st_buffer(points, 100000)
sep_rings = st_sfc(map2(ring2, ring1, ~ st_difference(.x, .y)), crs = 3857)
sf_opt1 <- sf_pts %>%
  st_set_geometry(sep_rings)
plot(sf_opt1)

plot(sf_opt1$geometry)
plot(sf_pts$geometry, add = T)

sf_opt2 <- sf_pts %>%
  mutate(
    ring1 = st_buffer(geometry, 50000),
    ring2 = st_buffer(geometry, 100000)
    ) %>%
  rowid_to_column() %>%
  group_by(rowid) %>%
  mutate(geometry = st_difference(ring2, ring1)) %>%
  ungroup() %>%
  select(val)
plot(sf_opt2)

plot(sf_opt2$geometry)
plot(sf_pts$geometry, add = T)

st_bbox(sf_opt1)
#>     xmin     ymin     xmax     ymax 
#> -1210664 -1199345  1190345  1187217
st_bbox(sf_opt2)
#>      xmin      ymin      xmax      ymax 
#>  391818.2  938652.3  591818.2 1138652.3

reprex package 创建于 2018-04-10 (v0.2.0).

devtools::session_info()
#> Session info -------------------------------------------------------------
#>  setting  value                       
#>  version  R version 3.4.4 (2018-03-15)
#>  system   x86_64, mingw32             
#>  ui       RTerm                       
#>  language (EN)                        
#>  collate  English_United Kingdom.1252 
#>  tz       America/Los_Angeles         
#>  date     2018-04-10
#> Packages -----------------------------------------------------------------
#>  package    * version    date       source                            
#>  assertthat   0.2.0      2017-04-11 CRAN (R 3.4.1)                    
#>  backports    1.1.2      2017-12-13 CRAN (R 3.4.3)                    
#>  base       * 3.4.4      2018-03-15 local                             
#>  bindr        0.1.1      2018-03-13 CRAN (R 3.4.4)                    
#>  bindrcpp   * 0.2        2017-06-17 CRAN (R 3.4.1)                    
#>  broom        0.4.3      2017-11-20 CRAN (R 3.4.2)                    
#>  cellranger   1.1.0      2016-07-27 CRAN (R 3.4.1)                    
#>  class        7.3-14     2015-08-30 CRAN (R 3.4.4)                    
#>  classInt     0.1-24     2017-04-16 CRAN (R 3.4.2)                    
#>  cli          1.0.0      2017-11-05 CRAN (R 3.4.2)                    
#>  colorspace   1.3-2      2016-12-14 CRAN (R 3.4.1)                    
#>  compiler     3.4.4      2018-03-15 local                             
#>  crayon       1.3.4      2017-09-16 CRAN (R 3.4.2)                    
#>  curl         3.1        2017-12-12 CRAN (R 3.4.3)                    
#>  datasets   * 3.4.4      2018-03-15 local                             
#>  DBI          0.8        2018-03-02 CRAN (R 3.4.3)                    
#>  devtools     1.13.5     2018-02-18 CRAN (R 3.4.3)                    
#>  digest       0.6.15     2018-01-28 CRAN (R 3.4.3)                    
#>  dplyr      * 0.7.4      2017-09-28 CRAN (R 3.4.2)                    
#>  e1071        1.6-8      2017-02-02 CRAN (R 3.4.2)                    
#>  evaluate     0.10.1     2017-06-24 CRAN (R 3.4.2)                    
#>  forcats    * 0.3.0      2018-02-19 CRAN (R 3.4.3)                    
#>  foreign      0.8-69     2017-06-22 CRAN (R 3.4.4)                    
#>  ggplot2    * 2.2.1.9000 2018-03-28 Github (tidyverse/ggplot2@3c9c504)
#>  glue         1.2.0      2017-10-29 CRAN (R 3.4.2)                    
#>  graphics   * 3.4.4      2018-03-15 local                             
#>  grDevices  * 3.4.4      2018-03-15 local                             
#>  grid         3.4.4      2018-03-15 local                             
#>  gtable       0.2.0      2016-02-26 CRAN (R 3.4.1)                    
#>  haven        1.1.1      2018-01-18 CRAN (R 3.4.3)                    
#>  hms          0.4.2      2018-03-10 CRAN (R 3.4.4)                    
#>  htmltools    0.3.6      2017-04-28 CRAN (R 3.4.2)                    
#>  httr         1.3.1      2017-08-20 CRAN (R 3.4.1)                    
#>  jsonlite     1.5        2017-06-01 CRAN (R 3.4.1)                    
#>  knitr        1.20       2018-02-20 CRAN (R 3.4.3)                    
#>  lattice      0.20-35    2017-03-25 CRAN (R 3.4.4)                    
#>  lazyeval     0.2.1      2017-10-29 CRAN (R 3.4.2)                    
#>  lubridate    1.7.2      2018-02-06 CRAN (R 3.4.3)                    
#>  magrittr     1.5        2014-11-22 CRAN (R 3.4.1)                    
#>  memoise      1.1.0      2017-04-21 CRAN (R 3.4.2)                    
#>  methods    * 3.4.4      2018-03-15 local                             
#>  mime         0.5        2016-07-07 CRAN (R 3.4.1)                    
#>  mnormt       1.5-5      2016-10-15 CRAN (R 3.4.1)                    
#>  modelr       0.1.1      2017-07-24 CRAN (R 3.4.1)                    
#>  munsell      0.4.3      2016-02-13 CRAN (R 3.4.1)                    
#>  nlme         3.1-131.1  2018-02-16 CRAN (R 3.4.4)                    
#>  parallel     3.4.4      2018-03-15 local                             
#>  pillar       1.2.1      2018-02-27 CRAN (R 3.4.3)                    
#>  pkgconfig    2.0.1      2017-03-21 CRAN (R 3.4.1)                    
#>  plyr         1.8.4      2016-06-08 CRAN (R 3.4.1)                    
#>  psych        1.7.8      2017-09-09 CRAN (R 3.4.1)                    
#>  purrr      * 0.2.4      2017-10-18 CRAN (R 3.4.2)                    
#>  R6           2.2.2      2017-06-17 CRAN (R 3.4.1)                    
#>  Rcpp         0.12.16    2018-03-13 CRAN (R 3.4.4)                    
#>  readr      * 1.1.1      2017-05-16 CRAN (R 3.4.1)                    
#>  readxl       1.0.0      2017-04-18 CRAN (R 3.4.1)                    
#>  reshape2     1.4.3      2017-12-11 CRAN (R 3.4.3)                    
#>  rlang        0.2.0.9001 2018-03-26 Github (r-lib/rlang@49d7a34)      
#>  rmarkdown    1.9        2018-03-01 CRAN (R 3.4.3)                    
#>  rprojroot    1.3-2      2018-01-03 CRAN (R 3.4.3)                    
#>  rvest        0.3.2      2016-06-17 CRAN (R 3.4.1)                    
#>  scales       0.5.0.9000 2018-01-23 Github (hadley/scales@d767915)    
#>  sf         * 0.6-1      2018-03-22 CRAN (R 3.4.4)                    
#>  stats      * 3.4.4      2018-03-15 local                             
#>  stringi      1.1.7      2018-03-12 CRAN (R 3.4.4)                    
#>  stringr    * 1.3.0      2018-02-19 CRAN (R 3.4.3)                    
#>  tibble     * 1.4.2      2018-01-22 CRAN (R 3.4.3)                    
#>  tidyr      * 0.8.0      2018-01-29 CRAN (R 3.4.3)                    
#>  tidyverse  * 1.2.1      2017-11-14 CRAN (R 3.4.2)                    
#>  tools        3.4.4      2018-03-15 local                             
#>  udunits2     0.13       2016-11-17 CRAN (R 3.4.1)                    
#>  units        0.5-1      2018-01-08 CRAN (R 3.4.3)                    
#>  utils      * 3.4.4      2018-03-15 local                             
#>  withr        2.1.2      2018-03-26 Github (jimhester/withr@79d7b0d)  
#>  xml2         1.2.0      2018-01-24 CRAN (R 3.4.3)                    
#>  yaml         2.1.18     2018-03-08 CRAN (R 3.4.3)

最佳答案

AFAICT,在您的示例中,您实际上是在每一行上编写一个循环(围绕变异分组/取消分组);通过在此循环中覆盖几何图形,您将获得最后一个特征的边界框,而不是整个几何图形列表列的边界框。问题是 st_difference 做所有成对差异,而不是行差异。您可以使用以下代码(需要来自 github 的 sf)获得逐行差异:

sf_opt2 <- sf_pts %>%
  mutate(
    ring1 = st_buffer(geometry, 50000),
    ring2 = st_buffer(geometry, 100000)
  ) %>%
  mutate(geometry = ring2 / ring1) %>%
  select(val)
plot(sf_opt2)

关于r - 为什么对 sf 中每个特征差异的不同方法会导致不同的绘图缩放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49761698/

相关文章:

r - 查找两条曲线之间的重叠面积

linux - 多个用户使用的 Linux 服务器上的 R 包安装位置?

r - 在现有 geom_sf 图层下方插入 geom_sf 图层

r - 使用 tmap 包绘制时,两个多边形之间的边界线似乎与轮廓不同

重新分类二维星阵列

删除数据框中所有行中具有相同值的所有列

使用 dplyr 将多行中的值按列类别重组为单行

r - 更新包并防止它恢复到原始状态

r - 用 st_buffer 围绕一个地理点

r - 将 sf 对象列表转换为一个 sf