使用 tmap 包绘制时,两个多边形之间的边界线似乎与轮廓不同

www*_*www 3 gis maps r tmap r-sf

我正在使用该tmap包绘制多个多边形的边界。以下代码是一个基本示例。

library(sf)
library(tmap)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))

tm_shape(nc) +
  tm_borders()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这看起来不错。但是,如果我更改边界线的样式,则多边形之间的边界看起来与轮廓不同。下面是一个例子。我将线型更改为虚线。一些线段看起来是实心的或有很多点。

tm_shape(nc) +
  tm_borders(lwd = 1, lty = "dotted")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这是另一个例子。我将线宽更改为2,透明度更改为0.6。我们可以看到许多内部边界看起来比轮廓更强大。

tm_shape(nc) +
  tm_borders(lwd = 2, alpha = 0.6)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我想了解为什么会发生这种情况,以及如何使所有边界和轮廓的线条样式通用。我将不胜感激任何提示或想法。

更新:其他绘图选项

在这里,我尝试了其他选项来模拟带有虚线边界的地图。该geom_sfggspatial可以产生非常相似点划线边界的情节。但是,如果我更改了sf对象并使用base Rspplotsp包中绘制它,问题仍然存在。

geom_sf

library(ggplot2)
library(sf)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))

ggplot() +
  geom_sf(data = nc, linetype = "dotted", fill = "white") +
  theme_bw() +
  theme(panel.grid = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

gg空间

library(ggspatial)
library(ggplot2)
library(sf)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))

ggplot() +
  layer_spatial(nc, linetype = "dotted", fill = "white") +
  theme_bw() +
  theme(panel.grid = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

带有 SP 对象的基础 R

library(sf)
library(sp)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))
nc_sp <- as(nc, "Spatial")

plot(nc_sp, col = "white", lty = "dotted")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

带有 SP 对象的 spplot

library(sf)
library(sp)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))
nc_sp <- as(nc, "Spatial")
nc_sp$Z <- 1

spplot(nc_sp, zcol = "Z", col.regions = "white", lty = 3, 
       colorkey = FALSE,
       par.settings = list(axis.line = list(col =  'transparent')))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Dav*_*d_O 7

两个问题都是相关的。多边形具有共享边界,因此在绘制边界时会过度绘制。

使用lty,点在某些边界上对齐,因此显示为虚线。在其他边界上,两组点不对齐,因此一组点填充另一组点的间隙。

随着alpha它的共享边界更暗——它们被绘制了两次,因此得到加强。某一要素独有的边界部分不会过度绘制。

老实说,如果您想使用虚线样式或透明度,则没有一种简单的方法可以解决此问题。您需要做的是将边界的唯一部分标识为 LINESTRING 对象,然后您可以绘制每个边界一次而不会过度绘制。

作为演示,这显示了两个县的 alpha 问题

ncsub <- nc[1:2,]
plot(st_geometry(ncsub), lwd=4, border='#00000099')
Run Code Online (Sandbox Code Playgroud)

阿尔法问题

您可以将边框的每个部分分开:

borders <- st_cast(st_geometry(ncsub), 'MULTILINESTRING')
border1 <- st_difference(borders[1], borders[2])
border2 <- st_difference(borders[2], borders[1])
shared <- st_intersection(borders[1], borders[2])

plot(st_geometry(ncsub), col=c('salmon', 'cornflowerblue'), border=NA)
plot(border1, add=TRUE, col='red', lwd=2, lty=2)
plot(border2, add=TRUE, col='blue', lwd=2, lty=2)
plot(shared, add=TRUE, col='black', lwd=2, lty=2)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

然而,这样做依赖于实际共享的边界线 - 以便完美重叠。我怀疑沿着共享边界的有趣的破折号可能是因为该边界被不完全重叠的部分打破了。下面的代码表明这是正在发生的事情:边界没有完全重叠,因此交集不包括整个边界。应用于lty=2结果给出一组短线,每条短线重新开始虚线序列,导致交错间距。

plot(st_geometry(ncsub), col=c('salmon', 'cornflowerblue'), border=NA)
plot(st_cast(shared, 'LINESTRING'), col=c('black','white'), add=TRUE, lwd=2)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我认为您需要适当拓扑区域模型中的数据才能干净利落地做到这一点,其中边界是真正共享的实体。参见,例如:https : //grasswiki.osgeo.org/wiki/Vector_topology


Orl*_*gal 5

这确实不是一件容易的事。

解决它的一个棘手方法可能是将多边形转换为线,然后获得一条独特的线并绘制它。

library(sf)
library(tmap)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))

ncLines <- st_cast(nc, to = "MULTILINESTRING")
ncLines2 <- st_union(ncLines)

tm_shape(ncLines2) + tm_lines(lty = "dotted")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明