唯杰地图 logo唯杰地图
VJMAP
EN

cad-epsg

vjmap/references/coord/cad-epsg.md 5.0 KB104 行
原文

本文回答:怎样从一个 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 坐标已经把纬度唯一确定了,换带只改变经度。所以只需要知道图纸大致在哪条经线(哪个省市)上。
  • 定位步骤:
    1. 拿到图纸大致位置的经纬度:用户告知的省市、图内文字里的地名(cad_full_search + 地理编码),或让用户在地图上点选。
    2. 把 CAD 坐标按每个候选 EPSG 反算成经纬度,与该位置比对,取最近的那个带。
    3. 坐标系族(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

页面操作:

  1. 在左侧输入一个 CAD 坐标 (x, y)。
  2. 选择坐标系(2000 / 西安 80 / 北京 54)。
  3. 选择 3° 或 6° 带。
  4. 工具会显示计算出的 EPSG 号以及在互联网地图上对应的大致位置。

若不确定带号,可以先在右边地图里拖到 CAD 图所在城市,再回填带号。

七、怎么识别无坐标系图

特征:

  • 坐标值很小(比如都在 0..10000)。
  • 坐标值包含偏移(如都在 1e9 级别且 Y 也很大)。
  • CAD 原文件 INSBASE / VIEWCENTER 对应的不是真实地理点。

这类图只能走四参数叠加(见 internet-basemap-align)。