尝试在 R 中使用 tmap 绘制 SpatialLinesDataFrame 时出错
Posted
技术标签:
【中文标题】尝试在 R 中使用 tmap 绘制 SpatialLinesDataFrame 时出错【英文标题】:Error when trying to plot SpatialLinesDataFrame using tmap in R 【发布时间】:2020-01-01 21:55:37 【问题描述】:我正在尝试使用 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】:我对你的数据集只有一点了解,所以我无法确定。
但我建议使用以下代码;它基于通过使用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()
【讨论】:
以上是关于尝试在 R 中使用 tmap 绘制 SpatialLinesDataFrame 时出错的主要内容,如果未能解决你的问题,请参考以下文章