cad-epsg
本文回答:怎样从一个 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 在线计算
- 配合"2000 坐标系",得到 EPSG:4525。
vjmap 辅助:
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 坐标已经把纬度唯一确定了,换带只改变经度。所以只需要知道图纸大致在哪条经线(哪个省市)上。
- 定位步骤:
- 拿到图纸大致位置的经纬度:用户告知的省市、图内文字里的地名(
cad_full_search+ 地理编码),或让用户在地图上点选。 - 把 CAD 坐标按每个候选 EPSG 反算成经纬度,与该位置比对,取最近的那个带。
- 坐标系族(2000 / 西安 80 / 北京 54)不能靠距离挑——同一中央经线下它们只差基准,百米量级, 远小于位置提示本身的误差。按图纸注记定,没注记就默认 CGCS2000 并说明假设。
- 拿到图纸大致位置的经纬度:用户告知的省市、图内文字里的地名(
已知带号时才用得上 getEpsgParam:
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 的参数名和符号都不同(源码核实):
// 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 §三。
五、各主要坐标系族
| 族 | 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
页面操作:
- 在左侧输入一个 CAD 坐标 (x, y)。
- 选择坐标系(2000 / 西安 80 / 北京 54)。
- 选择 3° 或 6° 带。
- 工具会显示计算出的 EPSG 号以及在互联网地图上对应的大致位置。
若不确定带号,可以先在右边地图里拖到 CAD 图所在城市,再回填带号。
七、怎么识别无坐标系图
特征:
- 坐标值很小(比如都在 0..10000)。
- 坐标值包含偏移(如都在 1e9 级别且 Y 也很大)。
- CAD 原文件
INSBASE/VIEWCENTER对应的不是真实地理点。
这类图只能走四参数叠加(见 internet-basemap-align)。