使用R语言Terra包将Shapefile导出为DXF文件时遇到问题
问题
我尝试使用R语言的terra包导出AutoCAD的DXF文件,根据文档说明这应该是可行的。
加载包
library(terra) #;-) terra 1.7.71
检查可用驱动
我检查了可用驱动以确认DXF是否受支持:
我通过以下数据框验证了这一点:
DF <- terra::gdal(drivers =T) DF <- DF[DF$name == "DXF",] knitr::kable(DF)
| name | type | can | vsi | long.name | |
|---|---|---|---|---|---|
| 161 | DXF | vector | read/write | TRUE | AutoCAD DXF |
输出结果显示terra应该可以读写DXF文件。
数据准备
以下是一个最小示例,读取一个shapefile并选择单个列:
f <- system.file("ex/lux.shp", package="terra") v <- vect(f) v <- v["NAME_2"]
尝试写入DXF文件
然而,当我尝试将其写入DXF文件时,出现错误并生成了一个空文件:
terra::writeVector(v, "Test.DXF", filetype = "DXF", overwrite = TRUE) #;-) Warning: DXF layer does not support arbitrary field creation, field 'NAME_2' #;-) not created. (GDAL error 1) #;-) Error: [writeVector] Field creation failed for: NAME_2
可以看到生成的文件是空的:
terra::vect("Test.DXF") #;-) class : SpatVector #;-) geometry : none #;-) dimensions : 0, 0 (geometries, attributes) #;-) extent : 0, 0, 0, 0 (xmin, xmax, ymin, ymax) #;-) source : Test.DXF (entities) #;-) coord. ref. :
会话信息
标准输出与标准错误
✖ Install the styler package in order to use `style = TRUE`.
会话信息
sessioninfo::session_info() #;-) ─ Session info ─────────────────────────────────────────────────────────────── #;-) setting value #;-) version R version 4.4.0 (2024-04-24) #;-) os Ubuntu 20.04.6 LTS #;-) system x86_64, linux-gnu #;-) ui X11 #;-) language en_US:en #;-) collate en_US.UTF-8 #;-) ctype en_US.UTF-8 #;-) tz Europe/Copenhagen #;-) date 2024-05-27 #;-) pandoc 2.19.2 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown) #;-) #;-) ─ Packages ─────────────────────────────────────────────────────────────────── #;-) package * version date (UTC) lib source #;-) cli 3.6.2 2023-12-11 [3] CRAN (R 4.3.2) #;-) codetools 0.2-19 2023-02-01 [4] CRAN (R 4.2.2) #;-) digest 0.6.35 2024-03-11 [1] CRAN (R 4.4.0) #;-) evaluate 0.23 2023-11-01 [3] CRAN (R 4.3.2) #;-) fastmap 1.2.0 2024-05-15 [1] CRAN (R 4.4.0) #;-) fs 1.6.4 2024-04-25 [1] CRAN (R 4.4.0) #;-) glue 1.7.0 2024-01-09 [3] CRAN (R 4.3.2) #;-) htmltools 0.5.8.1 2024-04-04 [1] CRAN (R 4.4.0) #;-) knitr 1.46 2024-04-06 [1] CRAN (R 4.4.0) #;-) lifecycle 1.0.4 2023-11-07 [3] CRAN (R 4.3.2) #;-) Rcpp 1.0.12 2024-01-09 [1] CRAN (R 4.4.0) #;-) reprex 2.1.0 2024-01-11 [1] CRAN (R 4.4.0) #;-) rlang 1.1.3 2024-01-10 [3] CRAN (R 4.3.2) #;-) rmarkdown 2.27 2024-05-17 [1] CRAN (R 4.4.0) #;-) rstudioapi 0.16.0 2024-03-24 [1] CRAN (R 4.4.0) #;-) sessioninfo 1.2.2 2021-12-06 [3] CRAN (R 4.1.2) #;-) terra * 1.7-71 2024-01-31 [1] CRAN (R 4.4.0) #;-) withr 3.0.0 2024-01-16 [3] CRAN (R 4.3.2) #;-) xfun 0.44 2024-05-15 [1] CRAN (R 4.4.0) #;-) yaml 2.3.8 2023-12-11 [3] CRAN (R 4.3.2) #;-) #;-) [1] /home/au687614/R/x86_64-pc-linux-gnu-library/4.4 #;-) [2] /usr/local/lib/R/site-library #;-) [3] /usr/lib/R/site-library #;-) [4] /usr/lib/R/library #;-) #;-) ──────────────────────────────────────────────────────────────────────────────
解决方案
DXF格式本身不支持自定义属性字段的存储,这是GDAL驱动的限制。要成功导出,需要先移除所有属性字段,只保留几何信息:
# 移除所有属性字段 v_no_attr <- terra::subset(v, select = NULL) # 写入DXF文件 terra::writeVector(v_no_attr, "Test.DXF", filetype = "DXF", overwrite = TRUE)
验证导出结果:
terra::vect("Test.DXF") # 输出应包含几何信息,无属性字段
如果需要在DXF中保留属性信息,可以考虑将属性值嵌入到几何的图层名称中,GDAL的DXF驱动支持识别layer字段作为图层名:
# 将NAME_2的值赋值给layer字段 v$layer <- v$NAME_2 # 移除原属性字段,仅保留layer v_layer <- terra::subset(v, select = "layer") # 写入DXF文件 terra::writeVector(v_layer, "Test_with_layer.DXF", filetype = "DXF", overwrite = TRUE)
内容的提问来源于stack exchange,提问作者Derek Corcoran
相关产品推荐
相关产品推荐

