使用terra包vect函数读取在线矢量数据的两类技术问题咨询
解决Terra包读取在线空间数据的两个问题
问题1:直接读取在线ZIP中的SHP文件
Terra的vect函数无法直接通过unz/unzip的连接对象读取在线压缩包内的文件,核心原因是底层GDAL需要借助虚拟文件系统(VSI)处理压缩包,直接使用在线URL易受网络、权限限制。可靠的解决方式是先将ZIP下载到临时文件,再通过GDAL的/vsizip/虚拟路径读取内部SHP:
library(terra) library(curl) # 在线ZIP链接 zip_url <- "https://data.geo.admin.ch/ch.bafu.bundesinventare-amphibien/data.zip" # 创建临时ZIP文件 temp_zip <- tempfile(fileext = ".zip") # 下载ZIP到临时文件 curl_download(zip_url, temp_zip) # 通过虚拟路径读取压缩包内的SHP amphib_vec <- vect(paste0("/vsizip/", temp_zip, "/Amphibien_LV95/Amphibien_LV95.shp"))
说明:GDAL的/vsizip/前缀可直接解析压缩包内的文件,先下载到临时文件避免了远程读取时的GDAL配置限制,比直接用在线URL更稳定。
问题2:直接读取在线GPKG报错,转SF可行的原因
直接用vect(link)读取在线GPKG报错,本质是GDAL远程读取该图层时,未能正确识别几何类型元数据(报错提示的Unknown (any)就是明证)。而sf::st_read内部做了额外处理:
- 自动启用GDAL的
/vsicurl/虚拟文件系统处理远程数据源,确保几何类型元数据被正确解析; - 若图层存在混合几何类型,
st_read会自动转换为通用的GEOMETRY类型存入SF对象。
当把SF对象转为Terra的Vect时,数据已在本地内存中,几何类型明确,因此不会报错。
你可以直接用GDAL虚拟路径读取在线GPKG绕开问题:
library(terra) gpkg_url <- "https://data.geo.admin.ch/ch.bfe.elektrizitaetsproduktionsanlagen/gpkg/2056/ch.bfe.elektrizitaetsproduktionsanlagen.gpkg" # 用/vsicurl/虚拟路径读取指定图层 power_vec <- vect(paste0("/vsicurl/", gpkg_url), layer = "ElectricityProductionPlant")
或者先下载到临时文件再读取,稳定性更高:
library(terra) library(curl) temp_gpkg <- tempfile(fileext = ".gpkg") curl_download(gpkg_url, temp_gpkg) power_vec <- vect(temp_gpkg, layer = "ElectricityProductionPlant")
内容的提问来源于stack exchange,提问作者MPB_2022
相关产品推荐
相关产品推荐

