无法将 topojson 读入 R 以使用 ggplot2 和 sp 进行绘图

Having trouble reading a topojson into R for plotting using ggplot2 and sp

我正在尝试将 topojson 读入 R 以供 ggplot2 使用。看来 rgdal 包要退役了,所以我想在 sp 包中使用 st_read,但我只是得到一个大盒子,仅此而已。看起来我得到的字段差不多是正确的,但它肯定没有把整个东西都正确地放在那里。它说它只有一个特征和两个字段。知道我可能做错了什么吗?谢谢。

我尝试按照这些说明进行操作,但似乎没有任何效果:

https://www.r-bloggers.com/2014/09/overcoming-d3-cartographic-envy-with-r-ggplot/

我可以给出一个示例文件---我知道它有效,因为我们确实使用它并且能够用 D3 显示它,但我希望能够使用 ggplot2 显示它。

无效的示例代码:

library(ggplot2)
library(sp)

j <- sf::st_read("mytopo.json")

ggplot() +
  geom_sf(aes(fill = iso_a3), j) +
  coord_sf()

j <- geojsonio::topojson_read("mytopo.json")

ggplot() +
  geom_sf(aes(fill = iso_a3), j) +
  coord_sf()

注意:出于安全原因删除了示例中的 link。

这些文件也可以在 mapshaper.org. I used the online upload, but there's a command line tool 的帮助下在 R 中打开。

使用 mapshaper 将文件导出为 shapefile。可能有一些选项可以纠正 R 难以处理的几何形状,但我不熟悉 mapshaper 及其选项。下面的代码很好地解决了 R 中无效几何图形的问题。一旦被 mapshaper 转换,您将拥有一个包含 .dbf、.shp 和 .shx 文件的文件夹,R 的 sf 包可以读取这些文件。

library(dplyr)
library(sf)
library(ggplot2)

my_sf <- st_read('path/to/shapefile/folder/')
#> Reading layer `00005f8d4076b8ced__' from data source `path/to/shapefile/folder/' using driver `ESRI Shapefile'
#> Simple feature collection with 218 features and 1 field (with 3 geometries empty)
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: 0 ymin: 0 xmax: 940 ymax: 470
#> CRS:           NA

# But some geometries are not valid (only showing first 3 rows)
st_is_valid(my_sf[1:3,])
#> [1]  TRUE FALSE FALSE

# Fixing the invalid geometries taken from:
#  https://r-spatial.org/r/2017/03/19/invalid.html#making-invalid-polygons-valid

valid <- st_is_valid(my_sf)
my_sf_valid <- st_buffer(my_sf[!is.na(valid),], 0.0)

ggplot(my_sf_valid) +
  geom_sf()

制图出现但被翻转了。这里有一个 gis 堆栈问题:https://gis.stackexchange.com/a/233792/161721

可能与 .svg/topojson 文件的 mapshaper 翻转坐标有关

width= (SVG/TopoJSON) Set the width of the output dataset in pixels. When used with TopoJSON output, this option switches the output coordinates from geographic units to pixels and flips the Y axis. SVG output is always in pixels (default SVG width is 800).

以上引用自:https://github.com/mbloch/mapshaper/wiki/Command-Reference

reprex package (v2.0.1)

于 2022-03-18 创建