0

我运行以下命令:

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

options(tigris_class = 'sf')
options(tigris_use_cache = TRUE)

nj = tigris::states(cb = T, year = 2015) %>%
  filter(STUSPS == 'NJ')

nj_msas = tigris::core_based_statistical_areas(cb = T, year = 2015) %>%
  filter(grepl('NJ', NAME)) %>%
  sf::st_intersection(nj)

tmap_mode('plot')

nj_msas %>%
  tm_shape() +
  tm_polygons()

最后一个块给出了错误:

vapply(g2, st_is_empty,logical(1)) 中的错误:值的长度必须为 1,但 FUN(X[[3]]) 结果的长度为 148

当我删除 时st_intersection,我从最后一个块中没有得到任何错误。我无法通过谷歌搜索在任何地方找到此错误消息。有谁知道发生了什么?

此外,如果我运行除最后一个块之外的所有上述内容,并且我用它ggplot2::geom_sf来创建地图,而不是tmap函数,我会得到我想要的地图。没有错误。

我正在使用 Ubuntu 18.04.1。RStudio v1.1.463。3.5.2。底格里斯河 0.7. tmap 2.2。SF 0.7-2。

4

2 回答 2

5

似乎是由于交点产生的几何列是“GEOMETRY”类型而不是“POLYGON”类型,可能是由于 和 之间的轻微错位tigris::statestigris::core_based_statistical_areas导致错误tm_shape()

> nj_msas
Simple feature collection with 7 features and 17 fields
geometry type:  GEOMETRY
dimension:      XY
bbox:           xmin: -75.55961 ymin: 38.92852 xmax: -73.89398 ymax: 41.35742
epsg (SRID):    4269
proj4string:    +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
CSAFP CBSAFP       AFFGEOID GEOID                                        NAME LSAD       ALAND     AWATER STATEFP
    1   428  36140 310M200US36140 36140                              Ocean City, NJ   M1   651209688  955666476      34
    2   408  10900 310M200US10900 10900           Allentown-Bethlehem-Easton, PA-NJ   M1  3763879943   58581593      34
    3   428  47220 310M200US47220 47220                      Vineland-Bridgeton, NJ   M1  1252937239  502091171      34
    4   408  45940 310M200US45940 45940                                 Trenton, NJ   M1   581629671   11189320      34
    5   428  37980 310M200US37980 37980 Philadelphia-Camden-Wilmington, PA-NJ-DE-MD   M1 11920145588  693341961      34
    6   408  35620 310M200US35620 35620       New York-Newark-Jersey City, NY-NJ-PA   M1 21478408908 6689374328      34
    7   428  12100 310M200US12100 12100                 Atlantic City-Hammonton, NJ   M1  1439256827  300767732      34
       STATENS  AFFGEOID.1 GEOID.1 STUSPS     NAME.1 LSAD.1     ALAND.1   AWATER.1                       geometry
    1 01779795 0400000US34      34     NJ New Jersey     00 19048075783 3543447118 MULTIPOLYGON (((-74.55255 3...
    2 01779795 0400000US34      34     NJ New Jersey     00 19048075783 3543447118 POLYGON ((-75.12051 40.9683...
    3 01779795 0400000US34      34     NJ New Jersey     00 19048075783 3543447118 POLYGON ((-75.41956 39.4132...
    4 01779795 0400000US34      34     NJ New Jersey     00 19048075783 3543447118 POLYGON ((-74.94228 40.3408...
    5 01779795 0400000US34      34     NJ New Jersey     00 19048075783 3543447118 GEOMETRYCOLLECTION (LINESTR...
    6 01779795 0400000US34      34     NJ New Jersey     00 19048075783 3543447118 POLYGON ((-74.02454 40.7094...
    7 01779795 0400000US34      34     NJ New Jersey     00 19048075783 3543447118 POLYGON ((-74.98522 39.5148...

您可以通过仅从相交结果中提取多边形来解决此问题:

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

options(tigris_class = 'sf')
options(tigris_use_cache = TRUE)

nj = tigris::states(cb = T, year = 2015) %>%
  filter(STUSPS == 'NJ')

nj_msas = tigris::core_based_statistical_areas(cb = T, year = 2015) %>%
  filter(grepl('NJ', NAME)) %>%
  sf::st_intersection(nj) %>% 
  sf::st_collection_extract("POLYGON")

tmap_mode('plot')
#> tmap mode set to plotting
tm_shape(nj_msas) + tm_polygons()

,或通过在数据集上设置精度nj

nj_msas = tigris::core_based_statistical_areas(cb = T, year = 2015) %>%
  filter(grepl('NJ', NAME)) %>%
  sf::st_intersection(sf::st_set_precision(nj ,1000))

tm_shape(nj_msas) + tm_polygons()

reprex 包(v0.2.1)于 2019 年 1 月 10 日创建

于 2019-01-10T08:53:37.463 回答
0

伊布塞特的回应通过添加对我有用

%>% sf::st_collection_extract("POLYGON")

在我的转型变化结束时,试图仅在县边界内确定学区边界。

它也仍然适用于 ggplot。

谢谢

于 2019-02-25T19:13:09.577 回答