Создание полигонов из Fis hnet / Сетка (Линии) с помощью R / sf - PullRequest
0 голосов
/ 09 марта 2020

У меня есть датафрейм строк, каждая строка с координатами ax / y начала и конца. Эти строки описывают сетку / fis hnet, как вы можете видеть в минимальном примере ниже. К сожалению, сетка не идеально ровная и время от времени немного смещается.

library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(purrr)
library(ggplot2)

df <- data.frame(
  x_start = c(2:9,rep(1,8)),
  x_end = c(2:9,rep(10,8)),
  y_start = c(rep(1,8),2:9),
  y_end = c(rep(10,8),2:9)
)

head(df)
#>   x_start x_end y_start y_end
#> 1       2     2       1    10
#> 2       3     3       1    10
#> 3       4     4       1    10
#> 4       5     5       1    10
#> 5       6     6       1    10
#> 6       7     7       1    10


lines_sf <- pmap(df,function(x_start,x_end,y_start,y_end){
  st_linestring(
    matrix(
      c(
        x_start,
        y_start,
        x_end,
        y_end),
      ncol = 2,byrow = TRUE)
  )
}) %>%
  st_as_sfc()

lines_sf
#> Geometry set for 16 features 
#> geometry type:  LINESTRING
#> dimension:      XY
#> bbox:           xmin: 1 ymin: 1 xmax: 10 ymax: 10
#> CRS:            NA
#> First 5 geometries:
#> LINESTRING (2 1, 2 10)
#> LINESTRING (3 1, 3 10)
#> LINESTRING (4 1, 4 10)
#> LINESTRING (5 1, 5 10)
#> LINESTRING (6 1, 6 10)

plot(lines_sf)

Я хотел бы создать полигоны из этих линий, где каждый квадрат (из наименьшей единицы) является отдельным многоугольником (без перекрытий). Я проиллюстрировал это на примере, сконструированном вручную: (v0.3.0)

Инструмент ESRI "Feature to Polygon" позволяет выполнять этот тип операции, как показано на рисунке ниже:

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Коллега дал мне знать о st_polygonize(), который добивается цели!

polygons_sf <- st_sf(st_cast(st_polygonize(st_union(lines_sf))))

polygons_sf$nrow <- rnorm(nrow(polygons_sf))

plot(polygons_sf)

Создано в 2020-03-10 представьте пакет (v0.3.0)

0 голосов
/ 09 марта 2020

Попробуйте, идея состоит в том, чтобы создать фактическую сетку (полигоны), подходящую для вашего примера, пометить ячейки строкой и столбцом и отфильтровать первую и последнюю строку & col:

#Size, if not square you could create sizex and sizey
size=length(unique(df$x_start))

#Grid to pols
grid=st_make_grid(lines_sf, n=c(size,size)) #Final number of cells

#Add a df
grid.df=st_sf(ind=1:length(grid), grid)

#Label rows and cols
grid.df$row=cut(grid.df$ind,size, labels=FALSE)
grid.df$col=rep(1:size,size)

#Filter our first and last col and row
polys <- grid.df[!grid.df$row %in% c(1,size) & !grid.df$col %in% c(1,size),]
plot(st_geometry(polys), col="red", add=TRUE)

enter image description here

...