從同事那裡拿到一個 Shapefile,疊加到底圖上,發現建築物偏移了 200 公尺——.prj 檔寫的是 "GCS_WGS_1984",但資料實際上是用 TWD67 採集的。這類不匹配要花好幾個小時排查,而根源只有一個:EPSG 代碼搞錯了。
EPSG 代碼是座標參考系統(CRS)的數字簡稱。說 EPSG:4326,任何 GIS 工程師都知道你指的是 WGS 84——沒有歧義,不需要去解析 WKT 字串。搞清楚它,是避免資料偏移的第一步。
EPSG 代碼從何而來?
EPSG 是歐洲石油勘測集團(European Petroleum Survey Group)的縮寫,成立於 1985 年。背景是:多家石油公司在同一片海域做勘探,但各公司使用不同座標系,資料無法合併。Elf Aquitaine 的首席測量師 Jean-Patrick Girbig 召集了 Agip、BP、Deminex、Shell、Statoil 和 Total 的大地測量師來解決這個問題。
他們的第一個任務是建立標準化的 CRS 資料庫,於 1993 年公開發布,包含超過 500 個定義。1995 年,GeoTIFF v1.0 標準採用 EPSG 代碼作為 CRS 識別符,EPSG 由此走出石油產業,進入主流 GIS 領域。
2005 年,EPSG 工作組在 IOGP(國際油氣生產商協會)下重組,但 EPSG 這個名稱保留了下來。目前 EPSG 資料集(v12.053)包含超過 7,000 個 CRS 定義、2,500 種投影方法和 2,500 個座標轉換——總計超過 20,000 個條目。
EPSG 代碼到底是什麼?
EPSG 代碼是 4 到 5 位數字識別符(範圍 1024–32767),用於在 EPSG 資料集中唯一識別一個 CRS、基準面(datum)、橢球體或座標轉換方法。其技術基礎是 ISO 19111 標準。
標準表示格式
最常見的格式是 authority:code:
EPSG:4326
OGC 還定義了 URL 格式,常用於 Web 服務:
http://www.opengis.net/def/crs/EPSG/0/4326
每個 EPSG 定義包含什麼?
每個代碼對應一套完整的 CRS 定義:橢球體參數(長半軸、扁率)、基準面、座標軸方向和順序、計量單位(度或公尺),以及適用地理範圍。
最常見的陷阱是座標軸順序。EPSG:4326 的標準定義是緯度在前(lat, lng),但多數 GIS 軟體實際上是經度在前(lng, lat)。GeoJSON 用 lng, lat;Leaflet 的 L.latLng() 期望 lat, lng——搞混的結果不是明顯的座標對調,而是地圖上點位隨機散落。
最常用的 EPSG 代碼
| EPSG 代碼 | 名稱 | 類型 | 單位 | 典型用途 |
|---|---|---|---|---|
| 4326 | WGS 84 | 地理坐標系 | 度 | GPS、全球資料交換 |
| 3857 | Web Mercator | 投影坐標系 | 公尺 | 網路地圖(Google Maps、OSM) |
| 3824 | TWD97 | 地理坐標系 | 度 | 台灣國家標準 |
| 3826 | TWD97 / TM2 121°E | 投影坐標系 | 公尺 | 台灣地形圖、土地測量 |
| 4490 | CGCS2000 | 地理坐標系 | 度 | 中國大陸國家標準 |
| 4269 | NAD83 | 地理坐標系 | 度 | 美國、加拿大 |
| 32601–32660 | UTM 北半球各帶 | 投影坐標系 | 公尺 | 局部高精度測量 |
| 32701–32760 | UTM 南半球各帶 | 投影坐標系 | 公尺 | 局部高精度測量 |
EPSG:4326 vs EPSG:3857——最容易混淆的兩個代碼
EPSG:4326(WGS 84) 是地理坐標系,以經緯度角度表示位置。GPS 的原始輸出就是 WGS 84,是資料儲存和交換的標準。
EPSG:3857(Web Mercator) 是投影坐標系,將地球投影到平面上,單位為公尺。Google Maps 於 2005 年發布時採用了這個投影,幾乎所有網路地圖都跟進了。
EPSG 最初拒絕登記 3857。他們的異議:它對橢球基準面使用球面公式,在數學上是錯誤的。Google 仍然發布了它,等到 2009 年 EPSG 妥協並指定代碼時,全球每一張網路地圖都已在使用它了。儘管無所不在,3857 不適合精確的面積或距離測量——與標準 Mercator 相比大約有 0.33% 的比例誤差。
關鍵規則:4326 用於儲存,3857 用於顯示。 KunYu 的座標轉換工具支援兩者互轉。
如何找到正確的 EPSG 代碼
情境一:知道 CRS 名稱
如果你知道名稱(例如 "WGS 84" 或 "TWD97"),直接在 EPSG Search 工具中搜尋即可。支援按代碼、名稱和地區搜尋 8,000 多個 EPSG 定義。
情境二:知道地理位置,不知道 CRS
當你需要為特定區域找合適的投影 CRS 時,使用 EPSG Finder 工具——在地圖上點擊或框選一個區域,它會列出適用範圍涵蓋該地區的所有 EPSG 代碼。
情境三:收到資料但沒有 CRS 資訊
檢查資料附帶的元資料檔案。Shapefile 有 .prj 檔(用任何文字編輯器開啟),包含 WKT 格式的 CRS 定義。GeoTIFF 通常在元資料中嵌入 EPSG 資訊。使用 GDAL:
# 查看 GeoTIFF 的 CRS
gdalsrsinfo input.tif
# 讀取 Shapefile 的 .prj 檔
cat data.prj
在 GIS 軟體中使用 EPSG 代碼
QGIS:專案屬性 → CRS 面板,可按 EPSG 代碼搜尋和切換 CRS。QGIS 預設使用 EPSG:4326。
GDAL/OGR:直接用 EPSG 代碼指定目標 CRS:
# 將 Shapefile 從 TWD97 重投影為 WGS 84
ogr2ogr -s_srs EPSG:3824 -t_srs EPSG:4326 output.shp input.shp
PROJ:開源座標轉換引擎。其資料庫(proj.db)整合了 EPSG、IGNF 和 ESRI CRS 定義。
在程式碼中,EPSG 代碼的使用方式相同:
// Proj4js (JavaScript)
import proj4 from "proj4";
proj4.defs("EPSG:4490", "+proj=longlat +ellps=GRS80 +no_defs");
const result = proj4("EPSG:4326", "EPSG:4490", [116.4074, 39.9042]);
# pyproj (Python)
from pyproj import Transformer
transformer = Transformer.from_crs("EPSG:4326", "EPSG:3857", always_xy=True)
x, y = transformer.transform(121.5654, 25.0330)
常見問題
EPSG:4326 和 CRS:84 有什麼差別?
兩者都是 WGS 84,但座標軸順序不同。EPSG:4326 的標準定義是緯度在前(lat, lng),而 CRS:84 是經度在前(lng, lat)。GeoJSON 用 lng, lat,但 Leaflet 的 L.latLng() 期望 lat, lng——混用是常見 bug 來源。
我的資料偏移了幾十到幾百公尺,為什麼?
最常見的原因是 EPSG 代碼錯誤。在台灣,TWD67(EPSG:3821)與 TWD97(EPSG:3824)之間約有 820 公尺的系統性偏移——如果你的資料出現這個量級的位移,幾乎可以確定是基準面不匹配的問題。更大的偏移(幾百公尺)通常是把 WGS 84 和本地基準面混用造成的。
EPSG 代碼會過期嗎?
會更新,但不會被刪除或重新分配。IOGP 大地測量分委員會定期更新 EPSG 資料集。已廢棄的代碼會標記為 deprecated,並指向替代代碼。
台灣用什麼 EPSG 代碼?
台灣的國家坐標系統是 TWD97,地理坐標系對應 EPSG:3824。實務上地形測量常用 TWD97/TM2 中央子午線 121°E,也就是 EPSG:3826。舊版 TWD67(EPSG:3821)仍存在於舊資料中,與 TWD97 之間有約 820 公尺的系統偏移,遇到舊資料要特別留意。
中國大陸的國家標準坐標系用哪個 EPSG?
中國 2000 國家大地坐標系(CGCS2000)對應 EPSG:4490。需要注意的是,GCJ-02(火星坐標,高德/騰訊地圖使用)和 BD-09(百度坐標)是沒有 EPSG 代碼的加密坐標系。如需在這些坐標系之間轉換,可以使用 KunYu 的座標轉換工具。
涵蓋九成情況的那條規則
記住核心規則:4326 用於儲存和交換,3857 用於網路顯示。 遇到不確定的,用 EPSG Search 按名稱查,用 EPSG Finder 按地圖位置查。