---
title: 组合 / 拆分 / 导出
source: https://vjmap.com/guide/service/api/05-compose-export.html
---

# 组合 / 拆分 / 导出

> 分类代号：C.5  本章共 **6 个接口**

把多张 DWG 组合成一张、把一张大图按图框 / 图层拆成多张、把图纸导出为 PDF / DXF 或离线瓦片包——这一章就是"图纸经纪人"。

**共同特点**：这 6 个接口都相对重，后端会真实创建新图档 / 新文件。测试环境请用临时 mapid，不要对生产图做实验。

---

## 快速索引

| 序号 | SDK 方法 | URL |
|----:|---------|-----|
| 36 | `cmd_compose_new_map` / `cmdComposeNewMap` | `POST /api/v1/map/cmd/composeNewMap/_null/v1` |
| 37 | `cmd_split_map` / `cmdSplitMap` | `POST /api/v1/map/cmd/cmdSplitMap/_null/v1` |
| 38 | `cmd_export_layout` / `cmdExportLayout` | `POST /api/v1/map/cmd/exportLayout/_null/v1` |
| 39 | `cmd_export_pdf` / `cmdExportPdf` | `POST /api/v1/map/cmd/exportPdf/{mapid}/{version}` |
| 40 | `cmd_export_dxf` / `cmdExportDxf` | `POST /api/v1/map/cmd/exportDxf/{mapid}/{version}` |
| 41 | `cmd_save_offline_tile_db` / `cmdSaveOfflineTileDb` | `POST /api/v1/map/cmd/saveOfflineTileDb/_null/v1` |


---

## 36 · 组合新地图 `composeNewMap`

把多张已有 DWG 按几何变换（偏移 + 旋转）拼成一张。

### 请求参数

| 字段 | 类型 | 说明 |
|------|------|------|
| `maps` | array | 组合清单：`[{mapid, version, dx?, dy?, angle?}]` |
| `newMapid` | string | 新图 mapid |
| `newVersion` | string | 新图 version（可省） |
| `bounds` | string | 可选：组合后的 bbox 限定 |

### 响应

成功：`{ "status": true, "mapid": "...", "fileid": "...", "version": "v1" }`  
失败（实采：源文件不存在）：

```json
{
  "error": "file is not exist, ",
  "status": false
}
```

### Python

```python
svc.cmd_compose_new_map(
    maps=[
        {"mapid": "part_a", "version": "v1", "dx": 0,      "dy": 0},
        {"mapid": "part_b", "version": "v1", "dx": 1000.0, "dy": 0, "angle": 0},
    ],
    newMapid="assembled_map",
)
```

### Node.js

```javascript
await svc.cmdComposeNewMap({
  maps: [
    { mapid: 'part_a', version: 'v1', dx: 0, dy: 0 },
    { mapid: 'part_b', version: 'v1', dx: 1000, dy: 0, angle: 0 },
  ],
  newMapid: 'assembled_map',
});
```

---

## 37 · 拆分子图 `cmdSplitMap`

按图框线 / 按图层把一张大图拆成多张小图。

### 请求参数

| 字段 | 类型 | 说明 |
|------|------|------|
| `mapid` / `version` | string | 源图 |
| `splitType` | string | `frame`（按图框）/ `layer`（按图层） |
| `framelayer` | string | 仅 splitType=frame 时：图框线所在图层 |
| `clipBounds` | string | 也可以直接给一系列 bbox 列表拆 |
| `outNamePrefix` | string | 新图 mapid 前缀，默认用源 mapid + 序号 |

### 响应

成功：`{ "status": true, "maps": [{mapid, version, bounds}, ...] }`  
失败（实采：frame 拆分未给 clipBounds）：

```json
{ "error": "clipBounds is empty" }
```

---

## 38 · 导出布局为 DWG `exportLayout`

从 DWG 的**布局空间**（paper space）单独导出一张新 DWG。CAD 里经常一个文件多个布局（A3、A2、首页），这个接口能一次性把某个布局变成独立图档。

### 请求参数

| 字段 | 类型 | 说明 |
|------|------|------|
| `mapid` / `version` | string | 源图 |
| `layoutIndex` | int | 布局序号（0 起） |
| `layoutName` | string | 或直接用布局名，优先级高于 `layoutIndex` |
| `newMapid` | string | 可选：直接导入为新地图 |
| `newVersion` | string | 可选：新地图 version |

### 响应（实采：sys_zp/v1, layoutIndex=0）

```json
{
  "fileid": "pf68817b9655",
  "status": true
}
```

`fileid` 指向后端缓存里的新 DWG 文件，可以接着调用 `open_map(mapid=...)` 打开，或用 `exportDxf / exportPdf` 进一步出图。

### Python

```python
res = svc.cmd_export_layout(mapid="sys_zp", version="v1", layoutIndex=0)
assert res["status"]
print(res["fileid"])  # 'pf68817b9655'
```

---

## 39 · 导出 PDF `exportPdf`

把指定图纸输出为 PDF。支持按地图 bbox 截图 + 指定纸张。

### 请求参数

| 字段 | 类型 | 说明 |
|------|------|------|
| `bounds` / `bbox` | string | 要导出的 bbox：`[minx,miny,maxx,maxy]` |
| `width` / `height` | number | 纸张尺寸（mm），常用 A4=`297×210` |
| `scale` | number | 比例尺（可选） |
| `darkMode` | bool | 是否暗色渲染 |
| `outName` | string | 自定义输出文件名 |
| `layer` | string | 仅导出某 style / layer |

### 响应（实采：sys_zp/v1, 297×210 mm）

```json
{
  "path": "download/d5f939154c.pdf",
  "status": true
}
```

完整下载 URL 是 `http://127.0.0.1:27660/{path}?token=<jwt>`。

### Python

```python
res = svc.cmd_export_pdf(
    mapid="sys_zp", version="v1",
    width=297, height=210,
)
url = svc.base_gateway() + res["path"] + f"?token={svc.token}"
```

### Node.js

```javascript
const res = await svc.cmdExportPdf({
  mapid: 'sys_zp', version: 'v1',
  width: 297, height: 210,
});
const url = `${svc.baseGateway()}${res.path}?token=${svc.token}`;
```

---

## 40 · 导出 DXF `exportDxf`

把当前图档（或其子集）导出为 ASCII DXF 文件。

### 请求参数

| 字段 | 类型 | 说明 |
|------|------|------|
| `bounds` / `bbox` | string | 裁剪 bbox |
| `layer` | string | 限定 style / layer |
| `dxfVersion` | string | DXF 版本 tag：`AC1009` (R12), `AC1018` (R2004) 等 |
| `outName` | string | 自定义输出文件名 |

### 响应

成功：`{ "status": true, "path": "download/xxx.dxf" }`  
失败（实采：当前地图没有可导出图元）：

```json
{
  "error": "Invalid Symbol Table name",
  "status": false
}
```

### Python

```python
res = svc.cmd_export_dxf(
    mapid="sys_zp", version="v1",
    dxfVersion="AC1018",
    bounds="[587661158,3103885970,587661256,3103886087]",
)
```

---

## 41 · 离线瓦片包 `saveOfflineTileDb`

把指定地图范围预切并打成 `.mbtiles` / `.sqlitedb` 离线包，方便前端离线展示。

### 请求参数

| 字段 | 类型 | 说明 |
|------|------|------|
| `mapid` / `version` | string | 源图 |
| `minzoom` / `maxzoom` | int | zoom 范围 |
| `bounds` | string | 要切的 bbox |
| `ismvt` | bool | true 切 MVT（.mbtiles），false 切栅格 PNG |
| `outName` | string | 输出文件名 |

### 响应

成功：`{ "status": true, "path": "download/xxx.mbtiles" }`  
失败（实采：缺 `bounds`）：

```json
{ "error": "param error" }
```

### Python

```python
res = svc.cmd_save_offline_tile_db(
    mapid="sys_zp", version="v1",
    minzoom=0, maxzoom=6,
    bounds="[587661158,3103885970,587661256,3103886087]",
    ismvt=True,
    outName="sys_zp_offline.mbtiles",
)
```

---

## 组合示例：DWG → PDF 一把梭

```python
# 1. 上传并打开 DWG
up = svc.upload_map("project.dwg", mapid="proj", version="v1")
svc.open_map(
    mapid="proj", version="v1",
    fileid=up["fileid"], uploadname=up["uploadname"],
    mapopenway=vjmap.MapOpenWay.GeomRender,
)

# 2. 导出第 0 号布局
lay = svc.cmd_export_layout(mapid="proj", version="v1", layoutIndex=0,
                             newMapid="proj_layout0", newVersion="v1")

# 3. 打开刚生成的布局图并导 PDF
svc.open_map(mapid="proj_layout0", version="v1",
             fileid=lay["fileid"], uploadname="proj_layout0.dwg",
             mapopenway=vjmap.MapOpenWay.GeomRender)
pdf = svc.cmd_export_pdf(mapid="proj_layout0", version="v1",
                          width=297, height=210)
print(svc.base_gateway() + pdf["path"])
```

---
