You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)
nametypecanvsilong.name
161DXFvectorread/writeTRUEAutoCAD 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 07:20:54