经纬志
首页 / 实战手册 / 数据加载

缺了 .prj 的 Shapefile,被当成经纬度读进西安以东 500 公里

先看结论

同事只发了 .shp、.shx、.dbf 三个文件,打开后数据跑到非洲西海岸。

最后验证 2026-11-03 · 多技术栈 · 更新 2026-10-29 · 引用本文

现象

一份关中地区的面数据,x 在 350000~650000,y 在 3780000 附近。 打开后图层落到经度 50 万度、纬度 378 万度的位置, QGIS 直接提示「图层范围无效」。

文件列表里只有 .shp、.shx、.dbf, 缺少 .prj,而 .shp 文件头本身不记录坐标系。

原因

Shapefile 的坐标系信息只存在于同名的 .prj 文件(WKT 文本)中。 GDAL 找不到 .prj 时,默认按 EPSG:4326 解释坐标。

于是 500000 被当成经度 50 万度,3800000 被当成纬度 380 万度, 超出合法范围。QGIS 会把范围裁剪到 ±180/±90,看起来就是一片空白或跑到西非。

缺 .prj 不等于数据坏了。几何坐标原样保留, 只要补上正确的坐标系定义,数据立刻可用,不需要重新导出。

排查过程

  1. 看目录里有没有 .prj,以及文件名是否与 .shp 完全一致(含大小写)。
  2. 看坐标量级:x 在 500000 附近、y 在百万级,是高斯或 UTM 投影;x 在 100 附近是经纬度。
  3. 由 x 与 500000 的差反推经差,由 y 反推纬度,判断属于哪一带。
  4. 查看是否有配套的成果表、元数据文档,确认原始坐标系。
# 查看是否有坐标系信息
ogrinfo -al -so districts.shp
# 输出中若为 Layer SRS WKT: (unknown) 即缺 .prj

# 用坐标反推:x=500000 -> 中央经线上;y=3800000 -> 北纬约 34.3

解决方案

补一个 WKT 格式的 .prj。下面是对应 CGCS2000 3 度带 108°E(第 36 带)的定义, 文件名必须与 .shp 同名。

PROJCS["CGCS2000_3_Degree_GK_CM_108E",
  GEOGCS["China Geodetic Coordinate System 2000",
    DATUM["China_2000", SPHEROID["CGCS2000",6378137,298.257222101]],
    PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433]],
  PROJECTION["Transverse_Mercator"],
  PARAMETER["latitude_of_origin",0],
  PARAMETER["central_meridian",108],
  PARAMETER["scale_factor",1],
  PARAMETER["false_easting",500000],
  PARAMETER["false_northing",0],
  UNIT["metre",1]]

用 GDAL 也可以一次写回,避免手抄 WKT 出错。

# 指定源坐标系并重写
ogr2ogr -f "ESRI Shapefile" fixed districts.shp -a_srs EPSG:4546

# 或用 QGIS 的「另存为」,在 CRS 下拉框里选 CGCS2000 / 3-degree Gauss-Kruger CM 108E

验证

ogrinfo -al -so 的 Layer SRS WKT 不再是 unknown; 图层范围落在 106.5~109.5°E、33~35°N,与关中平原吻合。

ogrinfo -al -so fixed.shp | Select-String -Pattern "Extent|SRS"
# Extent: (350000.0, 3780000.0) - (650000.0, 3820000.0)
# SRS: EPSG:4546

适用版本

工具版本行为
GDAL3.6 及以上无 .prj 时 SRS 为 unknown,按 4326 处理
QGIS3.28 及以上可手动指定图层 CRS 后再另存
ArcGIS Pro3.xDefine Projection 工具可补写 .prj
引用本文

经纬志(2026)。《缺了 .prj 的 Shapefile,被当成经纬度读进西安以东 500 公里》。https://www.jingweizhi.com/cookbook/shapefile-prj-missing.html(访问日期 2026-11-03)。