Недопустимая геометрия для карты, созданной в Tmap - PullRequest
0 голосов
/ 06 мая 2020

У меня проблемы с одной из карт, которые я делаю для отчета. Я знаю проблему, но не знаю, как ее исправить.

Четыре многоугольника в моем шейп-файле недействительны - они являются самопересекающимися кольцами. Файл формы предназначен для района метро Нью-Йорка. Когда я открываю его в 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 исчезло, геометрия все еще отсутствует финальные карты. Область, обведенная красным, должна быть заполнена.

enter image description here

В идеале, я бы смог исправить геометрию, чтобы я мог сопоставить эти многоугольники. Есть ли у кого-нибудь идеи о том, как я могу это сделать или в чем еще может быть проблема? Я повторно загрузил шейп-файл, и это не имело значения. Я не могу получить файл формы из альтернативного источника - так что это не вариант. Использование QGIS тоже не вариант, потому что я уже сделал большую часть из 20 нужных мне карт. Недавно я обновил свои R (4.0.0) и RStudio (Версия 1.2.5042) и раньше не замечал этой проблемы. Может ли это быть источником проблемы - что есть какая-то ошибка в том, как tmap и новейшая версия RStudio работают вместе? Я не могу думать ни о чем другом.

Любая помощь будет принята с благодарностью, так как я должен представить этот проект на следующей неделе или около того. Спасибо.

1 Ответ

0 голосов
/ 07 мая 2020

Если ваш набор данных содержит ID PUMA, вы можете рассмотреть возможность удаления вашей недопустимой геометрии (при сохранении части данных, такой как рента, показанная на вашей карте) и присоединения ее к действительной геометрии; это можно легко получить с помощью пакета {tigris}.

library(tigris)
library(sf)
library(dplyr)
library(tmap)

# download PUMA 
big_cats <- tigris::pumas("New York", class = "sf") %>% 
  rbind(tigris::pumas("New Jersey", class = "sf")) %>% 
  rbind(tigris::pumas("Connecticut", class = "sf"))

# some sort of dplyr::*_join to your data here...

tm_shape(big_cats) + tm_polygons()

enter image description here

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