У меня проблемы с одной из карт, которые я делаю для отчета. Я знаю проблему, но не знаю, как ее исправить.
Четыре многоугольника в моем шейп-файле недействительны - они являются самопересекающимися кольцами. Файл формы предназначен для района метро Нью-Йорка. Когда я открываю его в QGIS, четыре проблемных полигона c действительны. Проблема возникает только тогда, когда я открываю их в R, используя ggplot
или tmap
.
Вот мой код:
# remove all objects in R and clear R
remove(list=ls())
# Load packages
library(tidyverse) # tidy verse package for data maninpulation
library(sp)
library(sf) # sf package to deal with shapefiles and perform spaital operations
library(rnaturalearth)
library(tmap) # tmap package for mapping
library(tmaptools)
library(rmapshaper)
library(haven) # read Stata data
library(leaflet) # leaflet
library(htmlwidgets) # htmlwidgets
library(ggplot2)
# load shapefile
# ==============
shapefile <- read_sf("/Users/Dora/Library/Mobile Documents/com~apple~CloudDocs/Projects/Latino Data Project/Data/Shapefiles/ipums_cpuma0010/ipums_cpuma0010.shp")
# check class, should be sf
class(shapefile)
glimpse(shapefile)
# filter out only States we want : New York, New Jersey, Conn.
shapefile <- shapefile %>%
filter(State %in% c("New York", "New Jersey", "Connecticut"))
# check that only 3 states have been filtered
unique(shapefile$State)
# test to see if this works with ggplot, it does not, geometry is invalid
# ggplot() + geom_sf(data = shapefile)
puma.preview <- tm_shape(shapefile) +
tm_borders()
puma.preview
Краткое изложение того, что я делаю: я загружаю файл формы (который предназначен для всей страны) и сокращаю его до В нескольких штатах в районе метро используется пакет sf
. Затем я объединяю его с моими данными, чтобы в дальнейшем сократить до PUMA (гео-область), которые я хочу для моей окончательной карты. Но когда я пытаюсь построить границы, как на последнем шаге, появляется предупреждающее сообщение:
Предупреждение: шейп-файл недействителен. См. Sf :: st_is_valid
Я нашел это обсуждение r-пространственного , которое помогает идентифицировать недопустимые геометрии. Я запустил следующий код.
#################################
# OPTION 1: Make shapefile valid
#################################
# which geometries are invalid and why?
st_is_valid(shapefile, reason = TRUE)
# items 109, 110, 128, 132 are not valid
# true to make valid
shapefile.fix <- st_make_valid(shapefile)
# test to see if shape is valid
st_is_valid(shapefile.fix, reason = TRUE)
и определили, что четыре геометрии недопустимы, потому что они имеют:
«Самопересечение кольца
[109]» Самопересечение кольца [1844806.7743 586468.577099999] "
[110]" Самопересечение кольца [1856751.9054 600658.621400001] "
[128]" Самопересечение кольца [1885193.1836 576520.4439] "
[132] "" Самопересечение кольца [1837919.417 592619.7127] "
Итак, я попытался исправить их с помощью st_make_valid()
, и хотя сообщение об ошибке go исчезло, геометрия все еще отсутствует финальные карты. Область, обведенная красным, должна быть заполнена.
В идеале, я бы смог исправить геометрию, чтобы я мог сопоставить эти многоугольники. Есть ли у кого-нибудь идеи о том, как я могу это сделать или в чем еще может быть проблема? Я повторно загрузил шейп-файл, и это не имело значения. Я не могу получить файл формы из альтернативного источника - так что это не вариант. Использование QGIS тоже не вариант, потому что я уже сделал большую часть из 20 нужных мне карт. Недавно я обновил свои R (4.0.0) и RStudio (Версия 1.2.5042) и раньше не замечал этой проблемы. Может ли это быть источником проблемы - что есть какая-то ошибка в том, как tmap
и новейшая версия RStudio работают вместе? Я не могу думать ни о чем другом.
Любая помощь будет принята с благодарностью, так как я должен представить этот проект на следующей неделе или около того. Спасибо.