我试图从一个sf对象创建一个正确格式化为topoJSON的列表。
当阅读有效的topoJSON文件时,可以执行以下操作:
sa <- jsonlite::read_json("https://raw.githubusercontent.com/pachadotdev/d3po/main/dev/south-america.topojson", simplifyVector = F)
我想做的是:
# install_github("pachadotdev/canadamaps")
library(canadamaps)
library(sf)
library(geojsonio)
provinces <- get_provinces()
provinces <- st_as_sf(provinces)
geojson_write(provinces, file = "provinces.geojson")
provinces2 <- geojson_read("provinces.geojson")
geo2topo(provinces)
Error: no 'geo2topo' method for sftbl_dftbldata.frame
有没有从R转换为topoJSON的选项?
我尝试保存为geoJSON,然后在QGIS中重新导出,但它不保存为topoJSON。
2条答案
按热度按时间qrjkbowd1#
geo2topo
适用于JSON字符串,而不是R对象。从您在示例中编写的
geoJSON
文件开始。ogrinfo
告诉我它的geoJSON
:将其作为文本读入R-这是纯文本geoJSON:
现在转换为
topoJSON
字符串:并将文本写入文件:
将
gdal
解释为topoJSON
:我不知道它从哪里得到的
foo
层名称,这可能是设置为其他地方,除非它实际上在数据中...bf1o4zei2#
除了Spacedman描述的
geo2topo
方法之外,您还可以考虑geojsonio::topojson_json()
。一个可能的障碍可能是provinces对象位于一些本地CRS中,而当前的geojson标准只要求EPSG:4326。有一个很好的故事,可能是杜撰的,标准制定机构不相信主要用户(IT,而不是GIS人员)理解地球不平坦的问题,并删除了在EPSG数据库中使用CRS作为标准化的选项,这是原始标准所允许的。
geojson / topojson仍然很难使用CRS,即使根据标准保存并读回R,它也会与CRS斗争,这就是为什么我必须应用
sf::st_set_crs(4326)
。