缺了 .prj 的 Shapefile,被当成经纬度读进西安以东 500 公里
同事只发了 .shp、.shx、.dbf 三个文件,打开后数据跑到非洲西海岸。
现象
一份关中地区的面数据,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 不等于数据坏了。几何坐标原样保留,
只要补上正确的坐标系定义,数据立刻可用,不需要重新导出。
排查过程
- 看目录里有没有
.prj,以及文件名是否与.shp完全一致(含大小写)。 - 看坐标量级:x 在
500000附近、y 在百万级,是高斯或 UTM 投影;x 在 100 附近是经纬度。 - 由 x 与 500000 的差反推经差,由 y 反推纬度,判断属于哪一带。
- 查看是否有配套的成果表、元数据文档,确认原始坐标系。
# 查看是否有坐标系信息
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
适用版本
| 工具 | 版本 | 行为 |
|---|---|---|
| GDAL | 3.6 及以上 | 无 .prj 时 SRS 为 unknown,按 4326 处理 |
| QGIS | 3.28 及以上 | 可手动指定图层 CRS 后再另存 |
| ArcGIS Pro | 3.x | Define Projection 工具可补写 .prj |
经纬志(2026)。《缺了 .prj 的 Shapefile,被当成经纬度读进西安以东 500 公里》。https://www.jingweizhi.com/cookbook/shapefile-prj-missing.html(访问日期 2026-11-03)。