Отверстия с шейп-файлом из ArcGIS не сохранены в R или QGIS - PullRequest
1 голос
/ 07 апреля 2020

Мой коллега прислал мне несколько шейп-файлов для анализа. В этих шейп-файлах должны быть отверстия. Вот пример того, как один из шейп-файлов выглядит на их компьютере в ArcGIS: Map from colleague, a shapefile with many holes

Но на моем компьютере, использую ли я QGIS или R (я не на моей машине есть ArcGIS), файл выглядит следующим образом (увеличенный в левой части первого изображения шейп-файла):

a shapefile with overlapping polygons instead of holes

Я пытался " Исправить геометрию »в QGIS версии 3.12, которая не добралась до цели - некоторые дыры были восстановлены, остальные перекрывающиеся полигоны остались:

a shapefile with some overlapping polygons and some holes

Я попытался исправить это в R (версия 3.6.1, работающая на Ma c OS 10.15.4) с помощью clgeo_Clean () из пакета cleanGeo, но все, что было сделано, это удалить перекрывающиеся полигоны, не превращая их обратно в дыры. Мне нужно сохранить дыры, и у меня нет доступа к ArcGIS с моего домашнего компьютера (спасибо, covid-19). Есть ли способ восстановить этот файл, или что мой коллега может сделать по-другому, отправив его мне? Вот ссылка на образец файла (оригинал, а не тот, который был обработан с помощью «Fix Geometries»): ссылка на файл примера проблемы shapefile

1 Ответ

2 голосов
/ 07 апреля 2020

Я прочитал шейп-файл, используя sf, и привел к многоугольнику, чтобы попытаться пересечь отдельные многоугольники, которые были наложены на другие многоугольники, а не на различия. Некоторые из этих многоугольников, казалось, имели неправильную геометрию, поэтому было необходимо также использовать lwgeom::st_make_valid(). Затем я смог успешно пересечь многоугольники и отфильтровать те многоугольники, которые перекрываются.

Если у вас sh, вы также можете st_union результат, чтобы вернуться к мультиполигону, а не к коллекции многоугольников.

library(lwgeom)
library(sf)
library(dplyr)
library(ggplot2)

shp <- read_sf('AAbe.shp')

shp2 <- shp %>%
  st_cast("POLYGON")  %>%
  st_make_valid() %>%
  st_intersection() %>%
  filter(n.overlaps < 2)

ggplot(shp2) +
  geom_sf(fill = 'yellow') +
  coord_sf(xlim = c(-98, -96), ylim = c(17, 20))

zoomed in image of holes in shapefile

...