1

我在 R 中有一个带有空间隐式边缘的 sfnetwork。我想使用 tmap 绘制它,因此我想通过将边缘变成线条来使边缘在空间上明确。

我创造了这个怪物来做到这一点

edges <- activate(graph, "edges") %>% as_tibble() %>%
  inner_join(activate(graph, "nodes") %>% as_tibble(), by=c("from"="node_id")) %>%
  inner_join(activate(graph, "nodes") %>% as_tibble(), by=c("to"="node_id")) %>%
  mutate(geometry = purrr::pmap(list(geometry.x, geometry.y), st_union)) %>%
  st_as_sf() %>%
  st_cast("MULTIPOINT") %>%
  st_cast("LINESTRING")

可能需要 MULTIPOINT 演员表,因为图中存在自循环,我假设在 st_union 下,它变成了 POINT,而不是 MULTIPOINT,这让 LINESTRING 演员感到沮丧。

这看起来真的很尴尬,它创建了一个单独的对象,我无法将其粘回 sfnetwork。

我应该怎么做呢?

4

1 回答 1

2

我认为以下代码可以从具有空间隐式边缘的对象sfnetwork开始创建具有空间显式边缘的对象。sfnetwork

一、加载包

library(sfnetworks)
library(tmap)

创建一些虚假数据。示例取自?sfnetwork

p1 = sf::st_point(c(7, 51))
p2 = sf::st_point(c(7, 52))
p3 = sf::st_point(c(8, 52))
nodes = sf::st_as_sf(sf::st_sfc(p1, p2, p3, crs = 4326))

e1 = sf::st_cast(sf::st_union(p1,p2), "LINESTRING")
e2 = sf::st_cast(sf::st_union(p1,p3), "LINESTRING")
e3 = sf::st_cast(sf::st_union(p2,p3), "LINESTRING")
edges = sf::st_as_sf(sf::st_sfc(e1, e2, e3, crs = 4326))
edges$from = c(1, 1, 2)
edges$to = c(2, 3, 3)

创建具有空间隐含边缘的网络

(my_sfnetwork <- sfnetwork(nodes, edges, directed = FALSE, edges_as_lines = FALSE))
#> # An sfnetwork with 3 nodes and 3 edges
#> #
#> # CRS:  EPSG:4326 
#> #
#> # An undirected simple graph with 1 component with spatially implicit edges
#> #
#> # Node Data:     3 x 1 (active)
#> # Geometry type: POINT
#> # Dimension:     XY
#> # Bounding box:  xmin: 7 ymin: 51 xmax: 8 ymax: 52
#>             x
#>   <POINT [°]>
#> 1      (7 51)
#> 2      (7 52)
#> 3      (8 52)
#> #
#> # Edge Data: 3 x 2
#>    from    to
#>   <int> <int>
#> 1     1     2
#> 2     1     3
#> 3     2     3

使边缘空间明确

(my_sfnetwork <- tidygraph::convert(
  my_sfnetwork, 
  to_spatial_explicit_edges, 
  .clean = TRUE
))
#> # An sfnetwork with 3 nodes and 3 edges
#> #
#> # CRS:  EPSG:4326 
#> #
#> # An undirected simple graph with 1 component with spatially explicit edges
#> #
#> # Node Data:     3 x 1 (active)
#> # Geometry type: POINT
#> # Dimension:     XY
#> # Bounding box:  xmin: 7 ymin: 51 xmax: 8 ymax: 52
#>             x
#>   <POINT [°]>
#> 1      (7 51)
#> 2      (7 52)
#> 3      (8 52)
#> #
#> # Edge Data:     3 x 3
#> # Geometry type: LINESTRING
#> # Dimension:     XY
#> # Bounding box:  xmin: 7 ymin: 51 xmax: 8 ymax: 52
#>    from    to                x
#>   <int> <int> <LINESTRING [°]>
#> 1     1     2     (7 51, 7 52)
#> 2     1     3     (7 51, 8 52)
#> 3     2     3     (7 52, 8 52)

reprex 包(v0.3.0)于 2020 年 10 月 27 日创建

在这里查看,?tidygraph::convert了解?to_spatial_explicit_edges更多详情。

于 2020-10-27T15:59:00.623 回答