Горячий, чтобы получить чистые полигоны в R после st_combine / st_union с пакетом sf? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть аккуратный набор данных для секторов переписи в формате sf ( setores_sp_ok.rda ), в котором есть многоугольники для двух различных территориальных моделей, обозначенных переменной modelo.Я хочу объединить сектора переписи по modelo и cnes, чтобы создать еще один набор данных с новыми границами.

Я могу сделать это, используя технику group_by() + summarise(), которая автоматически использует st_union() длясовокупные полигоны.Но результат плохой, со многими внутренними границами.

# load packages
library(dplyr)
library(ggplot2)
library(sf)
library(lwgeom)

# import data
load(url("https://github.com/bruno-pinheiro/app_acesso_saude/raw/master/data/setores_sp_ok.rda"))

# combine polygons
ubs_malhas <- setores_sp %>% 
  st_make_valid() %>% 
  group_by(cnes, modelo) %>% 
  summarise(area = sum(area)) %>% 
  ungroup()

# plot
ggplot(ubs_malhas[ubs_malhas$modelo == "vigente", ]) +
  geom_sf(lwd = .2)

result have many internal boundaries

Я знаю, что возможно реализовать этот вид операции, комбинируя st_combine, st_union и st_intersect, но я не понимаю, как это сделать.

Как объединить полигоны по modelo и cnes и получить чистые агрегированные полигоны без внутренних границ?

У кого-нибудь есть совет?

Большое спасибо!

1 Ответ

0 голосов
/ 30 ноября 2018

Ваши данные могут быть аккуратными в обратном смысле, но геометрия, конечно, нет.Границы между моделями "vigente" во многих случаях не совсем совпадают, поэтому вы получаете эти небольшие "остатки", вызванные промежутками между единицами.Я бы привязал их к сетке, скажем, 1 см, а затем вызвал бы st_union.

# load packages
library(dplyr)
library(ggplot2)
library(sf)
library(lwgeom)

# import data
load(url("https://github.com/bruno-pinheiro/app_acesso_saude/raw/master/data/setores_sp_ok.rda"))

# combine polygons
ubs_malhas <- setores_sp %>% 
  st_snap_to_grid(size = 0.01) %>%
  st_make_valid() %>% 
  group_by(cnes, modelo) %>% 
  summarise(area = sum(area)) %>% 
  ungroup()

# plot
ggplot(ubs_malhas[ubs_malhas$modelo == "vigente", ]) +
  geom_sf(lwd = .2)

. Если у вас остались нежелательные полигоны, возможно, вам придется увеличить размер сетки или удалить их вручную,например, в QGIS или тому подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...