2017-12-11 31 views
4

これはmy previous similar questionの更新です。これは同じタスクで、sfフレームワーク内で実行する必要があります。r gis:ポリゴンの内側境界を特定する


このマップでは、ポリゴン、赤線の内側の境界を特定する必要があります。私はSpacedmanのanswer @包まれた自己記述された機能を利用するために使用さsp枠組みの中で

enter image description here


。ここには:

identify_borders <- function(SPolyDF){ 
    require(rgeos) 
    require(sp) 
    borders <- gDifference(
      as(SPolyDF,"SpatialLines"), 
      as(gUnaryUnion(SPolyDF),"SpatialLines"), 
      byid=TRUE) 

    df <- data.frame(len = sapply(1:length(borders), 
            function(i) gLength(borders[i, ]))) 
    rownames(df) <- sapply(1:length(borders), 
          function(i) [email protected][[i]]@ID) 

    SLDF <- SpatialLinesDataFrame(borders, data = df) 
    return(SLDF) 
} 

raster::boundaries()を使用することもできます。


空間データを取得し、地図に

# dev version of ggplot2 for geom_sf() 
devtools::install_github("tidyverse/ggplot2") 

library(tidyverse) 
library(sf) 

load(url("https://ikashnitsky.github.io/misc/171211-so-question-identify-borders/geodata.Rdata")) 

ggplot() + 
     geom_sf(data = gd_nuts0) + 
     geom_sf(data = gd_borders, color = "red") + 
     coord_sf(datum = NA) + 
     theme_void() 

答えて

6

rmapshaperが浮気れるjavascriptを使用しています!私が試した:

i = st_intersection(gd_nuts0, gd_nuts0) 
i2 <- i[i$nuts_id != i$nuts_id.1,] 
plot(gd_nuts0[1]) 
plot(i2, add = TRUE, col ='red', lwd = 2) 

enter image description here

5

を複製するコードはrmapshaperが正確に所望の機能を持っているし、うまくsfオブジェクトで動作することが判明 - ms_innerlines()。 (ms_innerlines())は、sfオブジェクトではなくリストを返すという唯一の難点(おそらくバグ)があります。しかし、この奇妙な行動は簡単に修正されます。ソリューションコードは以下のとおりです。違いを見るために最初のポリゴンを単純化することに注意してください。 sfオブジェクトから作成された新しい内側の境界線は、ネイビーカラーでプロットされます。

# dev version of ggplot2 for geom_sf() 
devtools::install_github("tidyverse/ggplot2") 

library(tidyverse) 
library(sf) 
library(rmapshaper) 

load(url("https://ikashnitsky.github.io/misc/171211-so-question-identify-borders/geodata.Rdata")) 

sf_poly_simp <- gd_nuts0 %>% 
     ms_simplify(keep = .2, keep_shapes = TRUE) 

sf_bord_simp <- sf_poly_simp %>% 
     ms_innerlines() %>% 
     as_tibble() %>% 
     st_as_sf() 

ggplot() + 
     geom_sf(data = sf_poly_simp) + 
     geom_sf(data = sf_bord_simp, color = "navy", size = 1) + 
     geom_sf(data = gd_borders, color = "red", size = .1) + 
     coord_sf(datum = NA) + 
     theme_void() 

enter image description here

関連する問題