唯杰地图 logo唯杰地图
VJMAP
EN

export-dwg

vjmap/references/backend/export-dwg.md 4.8 KB120 行
原文

本文回答:从 vjmap 后台导出 DWG / DXF 文件。

一、接口

const result = await svc.execCommand(
  "exportDxf",
  {},                  // 参数
  mapid,
  version,
  true                 // useGet:true 走 GET,false/省略走 POST
);
if (result.error) throw new Error(result.error);
// result = { status: true, fileid: "原图名_.dxf" }
// ⚠️ 与 exportPdf 不同:exportDxf 不返回 path,只返回 fileid
//    文件写在服务端 mapfiles 目录(Util::GetMapFilesPath)

二、下载

DXF 文件落在服务端 data/mapfiles/ 目录,需走配置的静态下载路由取回。出厂 config.json 的映射:

// system.token_router_static:
"_downmapfiles::./data/mapfiles"   // URL 前缀 _downmapfiles → mapfiles 目录

拼 URL 下载(前缀以你部署的 config 为准):

const url = svc.baseUrl() + "_downmapfiles/" + result.fileid + "?token=" + svc.accessToken;
window.open(url);

要拿内容:svc.httpGet(url, undefined, { raw: true }) 拿文本(第 2 参是 query 参数,不是请求配置;不加 raw:true 会把响应体当 JSON 解析而失败,结果在返回对象的 .data),要 blob 直接用 fetch(url)。

对比:exportPdf 返回的是 {status, path: "download/xxx.pdf"}(文件在 data/download/,根静态路由 /download),所以 PDF 可以 svc.baseUrl() + result.path + "?token=...",DXF 不行。/download 与 _downmapfiles 都注册在 JWT 鉴权之后,URL 必须带 ?token=(否则 403)。

三、试用版限制

试用版由于数据安全,不能下载 dwg 或 dxf图,只能在线预览。正式版可以。

正式版:需要在后端 config.json 开启下载许可。

四、先变换再导出

例:旋转 90° 后导出。

// 1) 用 composeNewMap 生成新图(四参数 rotate)
const composed = await svc.composeNewMap({
  mapid,
  version,
  fourParameter: [0, 0, 1, -Math.PI / 2]
});

// 2) 绑定到临时 mapid
const tempId = vjmap.getTempMapId(5);
const upd = await svc.updateMap({
  mapid: tempId,
  fileid: composed.fileid,
  mapopenway: vjmap.MapOpenWay.Memory,
  style: { backcolor: 0 }
});

// 3) 导出(exportDxf 返回 fileid,按第二节的下载路由拼 URL)
const exp = await svc.execCommand("exportDxf", {}, tempId, upd.version, true);
window.open(svc.baseUrl() + "_downmapfiles/" + exp.fileid + "?token=" + svc.accessToken);

五、仅导出指定图层

⚠️ exportDxf 写出的是整个图形数据库,style.layeron/layeroff 只控制显示,不会过滤导出内容。要真正只导出某些图层,先用 composeNewMap 的 layers 过滤实体生成新图,再导出:

const part = await svc.composeNewMap({ mapid, version, layers: ["图层A", "图层B"] });  // 不在列表里的图层实体被删除
const tempId = vjmap.getTempMapId(5);
const upd = await svc.updateMap({
  mapid: tempId,
  fileid: part.fileid,
  mapopenway: vjmap.MapOpenWay.Memory
});

const exp = await svc.execCommand("exportDxf", {}, tempId, upd.version, true);

六、vjmapext 绘制后导出(mapdata 回写)

import { MapCadLayer } from "vjmapext";

const cad = new MapCadLayer();
map.addControl(cad);
cad.createUI({ theme: "dark" });

// 绘制 / 修改
cad.addEntity(...);
// 回写后端:exportDwg 内部构造 DbDocument → service.updateMap 生成新图
const res = await cad.exportDwg({ newMapId: "my_new_map" });   // 返回 {mapid, version, ...}

// 也可用 svc.execCommand 直接导出既有图为 DXF
const exp = await svc.execCommand("exportDxf", {}, mapid);

exportDwg 默认生成新 mapid(newMapId 未传时用 vjmap.getTempMapId() 临时图);对新图 openMap/exportDxf 即可看到叠加的实体。

七、其他导出格式

  • PDF:svc.execCommand("exportPdf", pdfParam, mapid, version, true),支持 DPI / 纸张 / 边距。
  • PNG:走 svc.wmsTileUrl({ width, height, bbox, transparent, backgroundColor }) 拼 URL window.open。
  • GeoJSON:conditionQueryFeature({ includegeom: true, realgeom: true, toMapCoordinate: true })(fields 若指定须含 geojson)再自行序列化,见 export-formats §三。
  • ForgeViewer:参见官方指南 https://vjmap.com/guide/forgeviewer.html。

八、常见坑

  1. 试用版下载 403 → 正式版才能下载。
  2. 导出大图超时 → nginx proxy_read_timeout / 后端命令超时需要加长。
  3. 导出后的 DWG 原生 AutoCAD 打不开 → 导出是 DXF(ASCII),用 "另存为 DWG" 即可。或要求后端使用 DWG 输出。
  4. 含自定义块导出:部分实体(vjmap 自定义)导出时会转成标准 AcDb 实体。