> **本文回答**：怎样从一个 CAD 坐标值反推它属于哪个 EPSG，以及 vjmap 提供的在线工具。

## 一、位数判断法

规则（适用于国内国家 2000 / 西安 80 / 北京 54 等平面坐标）：

| X 整数位 | Y 整数位 | 说明 |
|---|---|---|
| **8** | 7 | X 包含 "带号前缀"，可直接确定 3 度带或 6 度带号 |
| **6** | 7 | 没有带号前缀，需要借助地图定位获取经纬度再推算带号 |
| 其它 | 其它 | 基本不是国内平面坐标（可能是 UCS 局部坐标、无坐标系图） |

## 二、X 是 8 位的情况

一个点 `(37526356.44561, 4377447.23355)`：

- X = 37526356 → 前两位 `37`，即 3 度带第 37 带（中央子午线 = 111°E）。
- 在线工具：[epsg 在线计算](https://vjmap.com/demo/#/demo/map/web/03webzgetepsg)
- 配合"2000 坐标系"，得到 **EPSG:4525**。

vjmap 辅助：

```js
vjmap.transform.getEpsgParam(vjmap.transform.EpsgCrsTypes.CGCS2000, 37).epsg;
// => "EPSG:4525"
```

⚠️ `getEpsgParam(crs, 带号)` **只产带号变体**（x_0 = 带号×1e6+500000）。图纸 X 是 6 位不带号时不能用它——要找同中央经线的不带号变体（见下节），选错变体 X 偏约 39,000,000。

⚠️ 第二参是**带号（如 `39`）或 8 位带号坐标（如 `39116000`）**，不是普通经度——传 `116` 这类值会**静默返回 `null`**，不报错。务必先判空再用 `.epsg`。

## 三、X 是 6 位的情况

`(526356.44561, 4377447.23355)`：

- X 只有 6 位，没有带号。**所有分带的 X 都落在 500000 附近，光看坐标无法区分带号**：
  `vjmap.transform.getEpsgCode([x, y], crsType, is3DegreeBelt)` 这时会返回 20+ 个候选，
  它只按"投影范围包含该点"过滤，不可能替你定带号。
- 关键性质：**Y 坐标已经把纬度唯一确定了**，换带只改变经度。所以只需要知道图纸大致在哪条经线（哪个省市）上。
- 定位步骤：
  1. 拿到图纸大致位置的经纬度：用户告知的省市、图内文字里的地名（`cad_full_search` + 地理编码），或让用户在地图上点选。
  2. 把 CAD 坐标按每个候选 EPSG 反算成经纬度，与该位置比对，取最近的那个带。
  3. 坐标系族（2000 / 西安 80 / 北京 54）**不能靠距离挑**——同一中央经线下它们只差基准，百米量级，
     远小于位置提示本身的误差。按图纸注记定，没注记就默认 CGCS2000 并说明假设。

已知带号时才用得上 `getEpsgParam`：

```js
vjmap.transform.getEpsgParam(vjmap.transform.EpsgCrsTypes.CGCS2000, /* 带号 */ 39).epsg;
```

**注意等价 EPSG**：无带号写法下，6° 带与 3° 带只要中央经线相同，投影参数就完全一致 ——
例如 `EPSG:4509`（6° CM 117E）与 `EPSG:4548`（3° CM 117E）换算结果一模一样，任选其一即可。

## 四、6 位带号补齐

没有带号意味着后端做 `svc.cmdTransform` 时 "同样的 X" 有歧义。用四参数在服务端换算前**先**补齐 `x += 39000000`——注意两个 API 的参数名和符号都不同（源码核实）：

```js
// svc.webMapUrl 里：
fourParameterBefore: "39000000,0,1,0"   // 带号 39 的 3 度带
// svc.wmsTileUrl 里（没有 fourParameterBefore！用 fourParameter；方向相反：
//   它在 srs→crs 之后把 EPSG 带号坐标映射回 CAD，所以是减去带号）：
fourParameter: "-39000000,0,1,0"
```

> `svc.cmdTransform` 返回 `[[x,y],...]` **数组**不是 `{x,y}` 对象；`srs`=源、`crs`=目标（与 `wmsTileUrl` 语义相反）；points 必须 `vjmap.geoPoint(...)` 包装，裸 `[x,y]` 会序列化成 `undefined,undefined`。详见 [gis-transforms](gis-transforms.md) §三。

## 五、各主要坐标系族

| 族 | `EpsgCrsTypes` 常量（枚举大小写敏感，源码核实） | 示例 EPSG |
|---|---|---|
| WGS84 | `Wgs84` | 4326 |
| Web 墨卡托 | `Merc3857` | 3857 |
| CGCS2000（国家 2000） | `CGCS2000` | 4490~4554 |
| Xian80（西安 80） | `Xian80` | 2327~2390 |
| Beijing54（北京 54） | `Beijing54` | 2401~2442 |
| NewBeijing54（新北京 54） | `NewBeijing54` | 4568~4578 等 |

同一族下 EPSG 差别就是 "3° / 6° 带 + 带号"。

## 六、在线计算示例

[https://vjmap.com/demo/#/demo/map/web/03webzgetepsg](https://vjmap.com/demo/#/demo/map/web/03webzgetepsg)

页面操作：

1. 在左侧输入一个 CAD 坐标 (x, y)。
2. 选择坐标系（2000 / 西安 80 / 北京 54）。
3. 选择 3° 或 6° 带。
4. 工具会显示计算出的 EPSG 号以及在互联网地图上对应的大致位置。

若不确定带号，可以先在右边地图里拖到 CAD 图所在城市，再回填带号。

## 七、怎么识别无坐标系图

特征：

- 坐标值很小（比如都在 0..10000）。
- 坐标值包含偏移（如都在 1e9 级别且 Y 也很大）。
- CAD 原文件 `INSBASE` / `VIEWCENTER` 对应的不是真实地理点。

这类图只能走**四参数叠加**（见 [internet-basemap-align](internet-basemap-align.md)）。
