簡體   English   中英

從具有多個嵌套幾何形狀的 geomoetrycollection 鑄造 r sf

[英]casting from geomoetrycollection with multiple nested geometries r sf

這個問題與How to simplify a MULTISURFACE, CURVEPOLYGON, or COMPOUNDCURVE geometry?有關。 . 我發布了一個新問題,它超出了那里提出的最初問題,並包括一個可重現的例子。 您可以將多表面幾何體投射到幾何體集合,然后通過幾何體集合使用 lapply 到 go 並投射到多邊形。 但是,當幾何集合中有多個嵌套幾何時,這似乎並非如此。 例如,在下面的代碼中,我展示了如何將具有 CURVEPOLYGON 的 geometrycollection 轉換為多面體,但是在第二個示例中,該要素具有多個幾何圖形,因此會引發錯誤。

第一個例子的格式是:

CURVEPOLYGON (
  LINESTRING ())

第二個例子的格式是:

CURVEPOLYGON(
       COMPOUNDCURVE(
              LINESTRING(...),
              CIRCULARSTRING(...),
              LINESTRING(...),
              CIRCULARSTRING(...),
              CIRCULARSTRING(...),
              LINESTRING(...)))

如何以有效的方式將這兩者轉換為多面體? 是否需要根據嵌套結構不同使用lapply? 我嘗試了許多不同的方法但沒有成功。

library(sf)
#> Linking to GEOS 3.9.3, GDAL 3.5.2, PROJ 8.2.1; sf_use_s2() is TRUE
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

# Download example data
# This repo available: https://github.com/ARMurray/example_data
# gpkg: https://github.com/ARMurray/example_data/blob/master/data/gc_cast.gpkg

# load data
sf <- st_read("./data/gc_cast.gpkg")
#> Error: Cannot open "./data/gc_cast.gpkg"; The file doesn't seem to exist.

# A singular CURVEPOLYGON
cp <- sf%>%
  filter(COMID == "167120949")
#> Error in filter(., COMID == "167120949"): object 'sf' not found

# extract nested geometries
geoms <- lapply(cp$geom, `[`)
#> Error in lapply(cp$geom, `[`): object 'cp' not found

# cast to different geom
mp <- lapply(geoms, function(x) sf::st_multipolygon( x = x ) )
#> Error in lapply(geoms, function(x) sf::st_multipolygon(x = x)): object 'geoms' not found

# Create sf object
sf_mp <- sf::st_sfc(mp)%>%
  st_sf()
#> Error in sf::st_sfc(mp): object 'mp' not found

# Check and Plot
sf_mp
#> Error in eval(expr, envir, enclos): object 'sf_mp' not found
plot(sf_mp)
#> Error in plot(sf_mp): object 'sf_mp' not found


# Multiple CURVEPOLYGONS
mcp <- sf%>%
  filter(COMID == "21411435")
#> Error in filter(., COMID == "21411435"): object 'sf' not found

m.geoms <- lapply(mcp$geom, `[`)
#> Error in lapply(mcp$geom, `[`): object 'mcp' not found

# This throws error: "Error in vapply(y, ncol, 0L) : values must be length 1, but FUN(X[[1]]) result is length 0"
m.mp <- lapply(m.geoms, function(x) sf::st_multipolygon( x = x ) )
#> Error in lapply(m.geoms, function(x) sf::st_multipolygon(x = x)): object 'm.geoms' not found

創建於 2022-11-17,使用reprex v2.0.2

Session 資料
sessioninfo::session_info() #> ─ Session info ─────────────────────────────────────────────────────────────── #> setting value #> version R version 4.2.2 (2022-10-31 ucrt) #> os Windows 10 x64 (build 19042) #> system x86_64, mingw32 #> ui RTerm #> language (EN) #> collate English_United States.utf8 #> ctype English_United States.utf8 #> tz America/New_York #> date 2022-11-17 #> pandoc 2.19.2 @ C:/Program Files/RStudio/bin/quarto/bin/tools/ (via rmarkdown) #> #> ─ Packages ─────────────────────────────────────────────────────────────────── #> package * version date (UTC) lib source #> assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.2.2) #> class 7.3-20 2022-01-16 [2] CRAN (R 4.2.2) #> classInt 0.4-8 2022-09-29 [1] CRAN (R 4.2.2) #> cli 3.4.1 2022-09-23 [1] CRAN (R 4.2.2) #> DBI 1.1.3 2022-06-18 [1] CRAN (R 4.2.2) #> digest 0.6.30 2022-10-18 [1] CRAN (R 4.2.2) #> dplyr * 1.0.10 2022-09-01 [1] CRAN (R 4.2.2) #> e1071 1.7-12 2022-10-24 [1] CRAN (R 4.2.2) #> evaluate 0.18 2022-11-07 [1] CRAN (R 4.2.2) #> fansi 1.0.3 2022-03-24 [1] CRAN (R 4.2.2) #> fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.2.2) #> fs 1.5.2 2021-12-08 [1] CRAN (R 4.2.2) #> generics 0.1.3 2022-07-05 [1] CRAN (R 4.2.2) #> glue 1.6.2 2022-02-24 [1] CRAN (R 4.2.2) #> highr 0.9 2021-04-16 [1] CRAN (R 4.2.2) #> htmltools 0.5.3 2022-07-18 [1] CRAN (R 4.2.2) #> KernSmooth 2.23-20 2021-05-03 [2] CRAN (R 4.2.2) #> knitr 1.40 2022-08-24 [1] CRAN (R 4.2.2) #> lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.2.2) #> magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.2.2) #> pillar 1.8.1 2022-08-19 [1] CRAN (R 4.2.2) #> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.2.2) #> proxy 0.4-27 2022-06-09 [1] CRAN (R 4.2.2) #> R6 2.5.1 2021-08-19 [1] CRAN (R 4.2.2) #> Rcpp 1.0.9 2022-07-08 [1] CRAN (R 4.2.2) #> reprex * 2.0.2 2022-08-17 [1] CRAN (R 4.2.2) #> rlang 1.0.6 2022-09-24 [1] CRAN (R 4.2.2) #> rmarkdown 2.18 2022-11-09 [1] CRAN (R 4.2.2) #> rstudioapi 0.14 2022-08-22 [1] CRAN (R 4.2.2) #> sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.2.2) #> sf * 1.0-9 2022-11-08 [1] CRAN (R 4.2.2) #> stringi 1.7.8 2022-07-11 [1] CRAN (R 4.2.1) #> stringr 1.4.1 2022-08-20 [1] CRAN (R 4.2.2) #> tibble 3.1.8 2022-07-22 [1] CRAN (R 4.2.2) #> tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.2.2) #> units 0.8-0 2022-02-05 [1] CRAN (R 4.2.2) #> utf8 1.2.2 2021-07-24 [1] CRAN (R 4.2.2) #> vctrs 0.5.0 2022-10-22 [1] CRAN (R 4.2.2) #> withr 2.5.0 2022-03-03 [1] CRAN (R 4.2.2) #> xfun 0.34 2022-10-18 [1] CRAN (R 4.2.2) #> yaml 2.3.6 2022-10-18 [1] CRAN (R 4.2.1) #> #> [1] C:/Users/AMURRA02/RPackages #> [2] C:/Program Files/R/R-4.2.2/library #> #> ──────────────────────────────────────────────────────────────────────────────

我在 R 中找不到嚴格執行此操作的方法,但ogr2ogr實用程序能夠將曲線轉換為多邊形,並刪除GEOMETRYCOLLECTION類型。


編輯:

事實證明,您可以在 R 中完成所有操作:

gdalUtilities::ogr2ogr('input.filename', 'output.filename', explodecollections = T, nlt = 'CONVERT_TO_LINEAR')

Output 看起來與下圖相同。


下面我用的是R的system命令,不過可以事先在R之外的命令行單獨完成。 一般語法是: ogr2ogr output.filename input.filename -explodecollection -nlt CONVERT_TO_LINEAR

library(sf)
library(tidyverse)
library(patchwork)

# read original file as sf object
sf1 <- st_read('/home/x/Downloads/gc_cast.gpkg')

# use ogr2ogr to 'explode' GEOMETRYCOLLECTION and 
#  convert curve geometries to polygons
system('ogr2ogr  /home/x/Downloads/output.gpkg /home/x/Downloads/gc_cast.gpkg -explodecollections -nlt CONVERT_TO_LINEAR')

# read newly created file as sf object
sf2 <- st_read('/home/x/Downloads/output.gpkg')

# take a look at new data & get geometry types
sf2
#> Simple feature collection with 2 features and 12 fields
#> Geometry type: POLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -114.4936 ymin: 32.81916 xmax: -89.30414 ymax: 43.09026
#> Geodetic CRS:  NAD83
#>       COMID Area_Current_Km Near_Int yearCompleted Area_Old_Km ORIG_FID
#> 1 167120949     22.37534815       31          1938 22.37534815     7622
#> 2  21411435      0.02400404        6          1937  0.03111449      851
#>                fldd_zn           MAX_fldd_z STATE_ABBR STATE_FIPS Shape_Length
#> 1       cool temperate       cool temperate         WI         55   0.44919727
#> 2 tropical dry/montane tropical dry/montane         AZ         04   0.01450313
#>     Shape_Area                           geom
#> 1 2.471884e-03 POLYGON ((-89.33469 43.0900...
#> 2 2.311433e-06 POLYGON ((-114.4936 32.8237...

st_geometry_type(sf2)
#> [1] POLYGON POLYGON
#> 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT ... TRIANGLE

在新的 object sf2上方有 POLYGON 的geom列,而不是 GEOMETRYCOLLECTION 和 CURVE 類型的幾何。

繪制兩個對象以確保一切看起來都差不多。 這兩個區域(第 1 行和第 2 行)相距很遠,所以我在下面分別繪制了它們。

# plots
p1a <- ggplot() +
  geom_sf(data = sf1[1,]) +
  ggtitle('old w/curve geo')
p2a <- ggplot() + 
  geom_sf(data = sf2[1,]) +
  ggtitle('new w/polygon geo')

p12b <- ggplot() + 
  geom_sf(data = sf1[2,], alpha = .2, color = 'red', lwd = 2) +
  geom_sf(data = sf2[2,], alpha = .2, fill = 'blue') +
  ggtitle('old(red) & new(blue) overplotted')

p1a + p2a

p12b

# Truncated sessioninfo
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.0.3 (2020-10-10)
#>  os       Ubuntu 20.04.5 LTS
#>  system   x86_64, linux-gnu
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       America/New_York
#>  date     2022-11-19
#>  pandoc   2.17.1.1 @ /usr/lib/rstudio/bin/quarto/bin/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date (UTC) lib source

#>  ggplot2     * 3.3.5   2021-06-25 [1] CRAN (R 4.0.3)
#>  patchwork   * 1.1.1   2020-12-17 [1] CRAN (R 4.0.3)
#>  sessioninfo   1.2.2   2021-12-06 [1] CRAN (R 4.0.3)
#>  sf          * 1.0-10  2022-11-17 [1] Github (r-spatial/sf@12f931b)
#>  tidyverse   * 1.3.1   2021-04-15 [1] CRAN (R 4.0.3)
#>  units         0.8-0   2022-02-05 [1] CRAN (R 4.0.3)
──────────────────────────────────────────────────────────────────────────────

reprex package (v2.0.1) 創建於 2022-11-19

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM