强化shapefile

时间:2017-09-01 15:01:36

标签: r ggplot2 shapefile

我试图使用ggplot绘制shapefile(this one)的多边形,以便可视化有关其中包含的区域的一些数据。下面的代码会产生错误:

library(rgdal)
library(tidyverse)
library(maptools)

hsa <- readOGR(dsn = "Data/hsa_bdry", layer = "HSA_Bdry") %>% fortify(region = "HSA93")

ggplot() + geom_polygon(data = hsa, aes(x = long, y = lat, group = group))
  

错误:TopologyException:输入geom 0无效:自相交点或附近点-103.18495682693303 24.986200983871445 at -103.18495682693303 24.986200983871445

如何保持附加到强化数据框的shapefile @data插槽中的数据而不会出现绘图错误?

到目前为止我已尝试过:

如果我从region删除了fortify参数,它成功生成了一个地图,但是我需要区域ID,所以我可以合并其余的数据(传递给ggplot中的aes参数) )。

我在调用spTransform(CRS("+init=epsg:4269"))之前尝试将fortify添加到我的管道中(shapefile的文档说它使用的是North American Datum 1983,这是EPSG 4269)但是我得到了一个错误

  

spTransform(xSP,CRSobj,...)出错:     NA参考系统无法进行转换

1 个答案:

答案 0 :(得分:2)

如错误消息所示,shapefile中存在无效的自相交点,导致fortify出现问题。您可以先使用gBuffer包中的rgeos预处理shapefile:

# read in the shapefile as SpatialPolygonsDataFrame, but don't fortify it yet
hsa <- readOGR(dsn = "hsa_bdry", layer = "HSA_Bdry")

# check if there are invalid geometries & correct that
rgeos::gIsValid(hsa) #returns FALSE
hsa <- rgeos::gBuffer(hsa, byid = TRUE, width = 0)
rgeos::gIsValid(hsa) #returns TRUE

# fortify shouldn't encounter problems now.
hsa <- hsa %>% fortify(region = "HSA93")

以下是使用基本主题选项的结果示例:

ggplot() + 
  geom_polygon(data = hsa, aes(x = long, y = lat, group = group),
               fill = "white", col = "black") +
  coord_map()

map

来自GIS Stack Exchange的

This post也讨论了这个问题。

编辑:在gBuffer(可选)之前添加无效几何的视觉检查

如果您希望在更正之前检查无效几何图形,则可以查看shapefile&amp ;;放大报告问题的坐标。我通常喜欢自己在GIS软件中这样做,但是可以使用基础包的plot函数在R中绘制SpatialPolygonsDataFrame。

# after loading in the shapefile but before any transformation
plot(hsa, col = "lightblue");axis(1);axis(2); title(main = "Full view")
points(x = -103.18495682693303, y = 24.986200983871445, 
       col = "red", cex = 5)

full view

# toggle xlim & ylim till we get a good zoom
plot(hsa, col = "lightblue",
     xlim = c(-103.185, -103.18),
     ylim = c(24.98, 24.99)); axis(1); axis(2); title(main = "Zoom in")
points(x = -103.18495682693303, y = 24.986200983871445, 
       col = "red", cex = 5)

我们可以看到问题所在。两条线在该三角形中相交的点仅略微重叠。它很小,你可能不会自己注意到它,但是当我们试图强化它时它会引起问题。

zoom in 1

执行gBuffer步骤后,再次查看shapefile(除标题外不更改代码):

zoom in 2