我正在尝试使用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可以解决此问题吗?还是我错过了更大的问题?
答案 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()