尝试在R

时间:2019-08-28 16:05:19

标签: r sp tmap

我正在尝试使用R包tmap绘制SpatialLinesDataFrame。但是,我不断收到此错误消息:

  

CPL_geos_is_empty(st_geometry(x))中的错误:评估错误:   IllegalArgumentException:点数组必须包含0或> 1个元素。

我首先尝试使用tmap绘制“ sp”对象。然后,我将sp对象转换为“ sf”对象,仍然收到相同的错误消息。我做了一些谷歌搜索,我认为这可能与SpatialLinesDataFrame中的线未完全连接的事实有关。

因此,我将一组连接的线子集化,并使用tmap进行绘制。

我将这里在这里使用的shapefile放在了Github上。

EX1812_SPB_combined是shapefile,其中包含未连接的线,并且是不使用tmap进行绘制并给出上述错误的文件。如果我使用R的基本plot(),它的绘制就很好。

EX1812_SBP_combined_section是我的shapefile子集,它来自包含连接线的前者。使用tmap可以很好地进行绘制。

这就是我想要做的:

尝试1:尝试绘制shapefile

library(tmap)
library(sf)
library(rgdal) 
library(sp)

# read in shapefile as SpatialLinesDataFrame
sbp <- readOGR(dsn = "file/path", layer = "EX1812_SPB_combined")

# plot using tmap
# this does not work and gives me the aforementioned error 
tm_shape(sbp) + tm_lines() 

尝试2:将SpatialLinesDataFrame转换为sf对象

# convert to sf 
sbp_sf <- st_as_sf(sbp) + st_set_crs(4326) 

# plot using tmap 
# this also does not work and gives me the same error 
tm_shape(sbp_sf) + tm_lines() 

尝试3:读入连接线并绘图的shapefile

# read in shapefile as SpatialLinesDataFrame
sbp_connect <- readOGR(dsn = "file/path", layer = "EX1812_SBP_combined_section") 

# plot using tmap
# this works 
tm_shape(sbp_connect) +  tm_lines()

我只是想绘制整个SpatialLinesDataFrame,即使这些线断开了也是如此。使用tmap可以解决此问题吗?还是我错过了更大的问题?

1 个答案:

答案 0 :(得分:1)

我对您的数据集只有一点了解,所以我无法确定。

但是我建议以下代码;它基于通过使用lwgeom包中的st_make_valid()调用(一种SF的伴侣)来修复SF格式的无效几何。

如果没有别的,它最终会出现一个看起来合理的情节:

library(sf)
library(lwgeom)
library(dplyr)
library(tmap)

sbp <- sf::st_read("EX1812_SPB_combined.shp") %>% 
   lwgeom::st_make_valid() %>% 
   sf::st_set_crs(4326) # always a sensible default (WGS84)

tm_shape(sbp) + tm_lines()

a plausible looking line