據(jù)漂移到坐標轉換的GIS必修課)
坐標對不上GIS就沒法做。這幾乎是每個和數(shù)據(jù)打交道的人遲早都會撞上的墻——你手里有幾十萬條帶經(jīng)緯度的記錄導入地圖軟件后居然偏到隔壁縣去了你從別人那里拷來的SHP文件打開一看所有圖形都沒了位置你用在線底圖加載本地數(shù)據(jù)偏移肉眼可見。這些問題的幕后黑手十有八九同一個坐標系沒對齊而EPSG代碼就是用來把它們統(tǒng)一對齊的鑰匙。EPSG代碼全稱可以理解為一套給坐標參考系統(tǒng)CRS編寫的“身份證號碼”。只要告訴軟件或同事“我用的是EPSG:4326”“這份數(shù)據(jù)是EPSG:3857”雙方就能精確無誤地理解這些數(shù)字在地球上代表什么位置。這篇文章寫給所有被坐標系坑過、或者剛入門GIS/測繪/數(shù)據(jù)可視化的人看。讀完你不僅知道EPSG是什么還能自己用工具判定、轉換、驗證坐標系遇到數(shù)據(jù)漂移問題不再手忙腳亂。1. 坐標對不上才是常態(tài)EPSG代碼管的是“坐標系身份證”1.1 兩個GIS人員之間最經(jīng)典的對話“你把數(shù)據(jù)發(fā)我一下唄?!?“好的WGS84的?!?“OK我這邊也用WGS84?!?結果一疊加點位飛了十萬八千里。這不是段子我做過相信你也遇到過。原因往往是對方說的“WGS84”和他的數(shù)據(jù)實際用的坐標系根本不是一回事。有人以為WGS84就是“隨便一個經(jīng)緯度”實際上經(jīng)緯度數(shù)值本身是相對某個參考橢球體計算出來的橢球參數(shù)不同同一個地點經(jīng)緯度讀數(shù)就不同。比如同一個物理位置在WGS84基準面下測出來可能是經(jīng)度116.397度在另一種舊基準面下可能就是116.396度。單看差距極小但累積起來會變成幾十米甚至上百米的位置偏差。對于出圖、選址、找邊界這些工作這種誤差就是致命的。1.2 EPSG代碼就是坐標參考系統(tǒng)的唯一標識符EPSG是European Petroleum Survey Group歐洲石油調(diào)查組織的縮寫他們最早建立了一套編號體系用來管理石油勘探中涉及的大地基準面、坐標系、投影方式。后來這套體系被油氣行業(yè)國際協(xié)會下屬的地球科學委員會繼承并維護慢慢演變成整個地理信息行業(yè)的全球共通語言。每個EPSG號碼對應一套明確無誤的坐標參考系統(tǒng)定義。當你說“我的數(shù)據(jù)是EPSG:4326”翻譯過來就是“我用了WGS84基準面上的經(jīng)緯度坐標”。不用你背橢球參數(shù)不用你解釋投影方式對方只要去查EPSG數(shù)據(jù)庫就能拿到完整的數(shù)學定義并正確加載。這就是身份證明的意義坐標系有千千萬萬種光靠“西安80”“北京54”“高斯克呂格”這種名字交流極其費力。大家不在一個頻道上數(shù)據(jù)就永遠合不到一起。給每個坐標參考系統(tǒng)一個固定編號大家只需要對數(shù)字就能實現(xiàn)零歧義協(xié)作。1.3 哪些行業(yè)離不開它凡是涉及地理位置數(shù)據(jù)的行業(yè)都被EPSG覆蓋測繪工程要用地方投影坐標系導航定位依賴WGS84無人機航測成果需要轉換到國家坐標系城市管網(wǎng)GIS系統(tǒng)必須統(tǒng)一到同一套坐標參考系統(tǒng)甚至車輛軌跡分析、外賣平臺配送范圍圈定都離不開。不懂EPSG就是不懂GIS的數(shù)據(jù)基礎建設。2. 從石油勘探會議到全球GIS默認設置EPSG的來歷2.1 歐洲石油調(diào)查組織留下的遺產(chǎn)1970年代左右歐洲石油勘探行業(yè)面臨一個很現(xiàn)實的問題不同國家、不同公司、不同工區(qū)使用了各自定義的大地基準和投影方式勘探數(shù)據(jù)難以共享。于是歐洲石油調(diào)查組織開始研究并發(fā)布一套統(tǒng)一的地球科學數(shù)據(jù)規(guī)范把當時常見的坐標參考系統(tǒng)、基準面轉換關系都收錄進去每一條記錄分配一個數(shù)字標識。那個年代沒有互聯(lián)網(wǎng)這套規(guī)范以紙質技術報告和磁帶數(shù)據(jù)的形式流傳。但它管用因為石油勘探是全球化行業(yè)跨區(qū)域鉆井平臺定位、地震測線布置、儲量圖件拼接都對坐標系精度有極高要求。大家很快發(fā)現(xiàn)用統(tǒng)一的編號來指代坐標系比在每份報告里重復寫參數(shù)省事得多EPSG編號由此成為行業(yè)事實標準。2.2 由權威行業(yè)機構維護的公共數(shù)據(jù)集今天的EPSG數(shù)據(jù)集由油氣行業(yè)國際協(xié)會下屬的地球科學委員會維護版本持續(xù)更新內(nèi)容公開透明。這個數(shù)據(jù)集不僅記錄編號還包含每個坐標參考系統(tǒng)的完整數(shù)學定義使用哪個橢球體、基準面怎么轉換、投影方法是什么、中央經(jīng)線在哪里、單位是什么。由于它是行業(yè)協(xié)作產(chǎn)物而非商業(yè)公司的私有標準幾乎所有GIS軟件都內(nèi)置了EPSG數(shù)據(jù)集。QGIS、ArcGIS、GDAL、PostGIS、PROJ庫、各類地圖SDK打開安裝包就能識別EPSG:4326、EPSG:3857這些代碼。正因為免費開放、無國界限制、無專利壁壘它成了GIS開發(fā)者之間的共同語言。2.3 數(shù)據(jù)庫里不是只有數(shù)字還有數(shù)學定義EPSG數(shù)據(jù)集里的每條記錄可以理解為一張完整的“身份卡”編號只是名字真正核心的是底層數(shù)學定義。例如EPSG:4326的完整定義包括WGS84基準面、經(jīng)緯度單位、長半軸和扁率等橢球參數(shù)。而EPSG:3857則是基于WGS84橢球構造的Web墨卡托投影坐標系定義里包含投影方法、原點、單位等。這也是為什么你在QGIS里選EPSG:4326和EPSG:3857時軟件能瞬間換算——這不是套公式而是從EPSG數(shù)據(jù)庫里讀取了兩套明確定義的坐標系再用PROJ庫執(zhí)行嚴格的空間數(shù)學轉換。3. 基準面、經(jīng)緯度、投影把“坐標系”這件事徹底說明白3.1 地球不是標準球體基準面決定了“從哪算起”地球本質上是一個近似橢球的形狀不同國家在不同年代用不同技術測量對地球形狀的描述不完全一致。這就產(chǎn)生了很多基準面有的用長半軸6378137米扁率1/298.257223563有的用其他橢球參數(shù)?;鶞拭婢褪恰暗厍蛉S模型起算原點”的組合。生活類比你畫房子平面圖要先確定門的朝向往哪開坐標也是不管用什么測繪手段都得先約定一個參考基準面也不知道是從起點算還是從墻角算。不同基準面就像不同版本的“世界地圖模板”同一個地點在這套模板上是東經(jīng)116度換套模板就是東經(jīng)116度再加幾米偏差。3.2 經(jīng)緯度只是半成品坐標經(jīng)緯度本身是一種球面坐標它告訴你在球面上的角度位置。但是當你需要計算面積、測量長度、規(guī)劃路線時球面坐標沒法直接使用——你不能在三維球面上用勾股定理算兩條街道的直線距離。更關鍵的是經(jīng)緯度并不天然屬于某一套坐標參考系統(tǒng)。它必須配合基準面才有意義。所以嚴格來說不存在“裸的經(jīng)緯度數(shù)據(jù)”每一份經(jīng)緯度數(shù)據(jù)都暗含一套基準面假設只是很多人在導出數(shù)據(jù)時把這個假設丟了。3.3 投影是“把橘子皮攤平”的數(shù)學魔法地球是個球面計算機屏幕是平面底圖和矢量數(shù)據(jù)必須投影到平面上才能顯示。投影的本質是把球面坐標通過特定數(shù)學規(guī)則映射到平面坐標。不同投影有不同的變形特性有些保證角度正確等角投影有些保證面積正確等積投影但無法同時保證兩者。墨卡托投影在低緯度地區(qū)看起來很正常到了高緯度地區(qū)面積夸張放大格陵蘭島被畫得巨大無比。Web墨卡托更是把全球當成一個正方形瓦片來處理最適合互聯(lián)網(wǎng)地圖切片但不適合做面積計算。高斯-克呂格投影則在中央經(jīng)線附近變形極小適合城市級別的精密測繪。所以選擇投影不是“哪個最好”而是“哪個最符合當前場景”。GPS定位用WGS84經(jīng)緯度Web地圖渲染用Web墨卡托省級測繪成果用高斯-克呂格3度帶跨境項目用UTM。3.4 EPSG、WKT、Proj4字符串同一種定義的三張面孔同一套坐標參考系統(tǒng)可以用三種方式表達EPSG號碼是最簡潔的引用方式WKTWell-Known Text是一段描述性文本包含了橢球參數(shù)、基準面、投影方式等完整信息Proj4字符串是PROJ庫使用的參數(shù)化描述。GEOGCS[WGS 84, DATUM[WGS_1984, SPHEROID[WGS 84,6378137,298.257223563]], PRIMEM[Greenwich,0], UNIT[degree,0.0174532925199433]]這段WKT就是EPSG:4326的定義。很多人做數(shù)據(jù)交換時只拷文件不拷投影定義文件結果拿到手全是裸坐標根本無法判斷屬于哪個EPSG。所以專業(yè)做法是傳輸數(shù)據(jù)時坐標系元數(shù)據(jù)必須和坐標數(shù)據(jù)一起走。4. 高頻代碼速查從世界通用到國內(nèi)項目怎么選4.1 三個最常見的代碼4326、3857、4490EPSG名稱典型場景4326WGS84地理坐標系GPS定位原始坐標、衛(wèi)星數(shù)據(jù)、多數(shù)標準經(jīng)緯度文件3857WGS84 Web墨卡托投影互聯(lián)網(wǎng)地圖瓦片渲染、Web前端定位展示4490中國2000國家大地坐標系CGCS2000經(jīng)緯度國內(nèi)測繪成果、國土空間規(guī)劃數(shù)據(jù)4326是全世界最通用的經(jīng)緯度坐標代碼GPS設備默認輸出、GeoJSON默認采用?,F(xiàn)階段幾乎所有Web后端存儲經(jīng)緯度都直接用4326。3857則是前端地圖行業(yè)繞不開的代碼主流的Web地圖平臺切片規(guī)則都基于Web墨卡托。如果你把4326經(jīng)緯度直接當成平面坐標丟給前端地圖引擎點位會全部錯亂因為地圖引擎默認加載的數(shù)據(jù)坐標體系是3857或者經(jīng)過WGS84經(jīng)緯度動態(tài)轉換的。4490是CGCS2000的經(jīng)緯度代碼。中國2000國家大地坐標系是當前國內(nèi)法定的統(tǒng)一基準很多測繪規(guī)劃成果都要求使用它。CGCS2000與WGS84在大部分民用場景下差異不大但涉及高精度工程項目必須嚴格區(qū)分。4.2 全球UTM與國內(nèi)高斯-克呂格投影的代碼規(guī)律UTM投影把全球分成60個經(jīng)度帶每帶6度。北半球代碼落在32601到32660之間南半球代碼落在32701到32760之間。例如EPSG:32650代表WGS84UTM北半球50帶覆蓋我國新疆、青海、西藏部分地區(qū)。國內(nèi)大比例尺測繪更常用高斯-克呂格投影分6度帶或3度帶。6度帶從西到東編號13到233度帶編號25到45。相應的EPSG編號集中在特定區(qū)間例如CGCS2000的6度帶高斯投影分布在EPSG:4491附近CGCS2000的3度帶高斯投影分布在EPSG:4513之后。使用投影坐標系時一定要帶上帶號。同樣是CGCS2000高斯投影三十九帶和四十帶東西向有約3度經(jīng)度的差別在平面坐標上直接相差幾萬米對不上就很正常了。4.3 地圖服務、測繪數(shù)據(jù)、GPS設備的最佳搭配GPS設備原始輸出建議保留為EPSG:4326不做任何投影轉換。數(shù)據(jù)需要入庫做統(tǒng)計分析時也建議統(tǒng)一到4326因為它是球面坐標全球通用不會因為越帶問題產(chǎn)生斷裂。如果要做Web地圖展示或底圖疊加尤其涉及瓦片數(shù)據(jù)時用3857作為顯示坐標系。前端端負責把4326動態(tài)轉換到3857或者直接使用支持坐標系轉換的地圖組件。國內(nèi)測繪項目最終成果如果需要交給政府或規(guī)劃部門務必明確使用CGCS2000相關代碼。若成果用于城建施工則會指定具體的3度帶高斯投影代碼這時必須嚴格按照要求設置選錯中央經(jīng)線整幅圖紙偏。5. 實操拿到一份坐標數(shù)據(jù)怎么找準它的EPSG5.1 第一步查元數(shù)據(jù)別上來就猜拿到地理位置數(shù)據(jù)第一反應不是打開軟件試坐標而是找元數(shù)據(jù)。數(shù)據(jù)生產(chǎn)方如果規(guī)范都會在原始文件里附一份坐標系說明可能是名為prj的投影文件、元數(shù)據(jù)XML、配套文檔或是數(shù)據(jù)庫表字段注釋。最常見的錯誤是拿到別人導出的CSV文件里面只有經(jīng)緯度兩列沒有任何坐標系信息。這種情況下唯一能做的合理假設是EPSG:4326但必須向數(shù)據(jù)來源方確認。盲目假設而實際數(shù)據(jù)是其他坐標系后續(xù)所有疊加分析都會出錯。5.2 第二步用已知地物坐標反推如果確實聯(lián)系不到數(shù)據(jù)生產(chǎn)方還可以通過坐標值本身反推。經(jīng)緯度坐標通常范圍在-90到90和-180到180之間一眼能認出是地理坐標系。如果出現(xiàn)X值500000左右、Y值3200000左右這種量級多半是投影坐標系且疊加了坐標偏移。舉個例子X在500000附近是高斯-克呂格投影在中央經(jīng)線平移后的典型值Y是赤道距離這是投影坐標體系的常見特征。接著根據(jù)區(qū)域的經(jīng)度范圍推算中央經(jīng)線用一個特定地點附近的地標提取那份未知坐標系的坐標值再和已知EPSG:4326的同一地標對比就能反推出中央經(jīng)線和帶號。這個過程可能試錯兩三輪但能自動縮小候選EPSG范圍。5.3 第三步在QGIS、GDAL、PostGIS里落地確認或假設EPSG后就要把它寫到數(shù)據(jù)里。QGIS里右鍵圖層打開屬性找到“源”一欄有專門的坐標系設置。如果原始數(shù)據(jù)沒有被定義坐標系可以用“指派投影”工具為它安裝投影定義如果已經(jīng)有定義但需要轉換用“重投影圖層”工具輸出到新的坐標系。GDAL命令行更自動化。查看坐標系的命令是gdalinfo格式轉換和重投影用ogr2ogr比如把一份ESRI Shapefile從EPSG:4326重投影到EPSG:3857可以寫成ogr2ogr -t_srs EPSG:3857 output.shp input.shp -t_srs EPSG:4326 -lco ENCODINGUTF-8PostGIS數(shù)據(jù)庫處理也常用。建表后給幾何字段設置SRID再根據(jù)需要變換坐標ALTER TABLE poi ALTER COLUMN geom TYPE geometry(Point, 3857) USING ST_Transform(geom, 3857);不要怕坐標轉換關鍵是每次轉換都明確定義“源坐標系”和“目標坐標系”兩者都用EPSG編號寫清楚就不會鬧烏龍。5.4 決策鏈整理遇到一份新數(shù)據(jù)我的判斷順序是這樣的確認是否帶投影文件或元數(shù)據(jù)有就直接采用沒有就用坐標數(shù)值形態(tài)判定是經(jīng)緯度還是平面坐標是平面坐標就分析X量級結合區(qū)域經(jīng)度推算中央經(jīng)線和帶號先假定一個最可能的EPSG加載到軟件里疊加已知底圖檢查偏差大就換下一個候選最終確定了坐標系立刻給數(shù)據(jù)寫入正確的SRID定義并保存一份轉換后的4326副本用于后續(xù)通用處理。這套流程在90%以上的項目中都能解決問題剩下的10%可能涉及多源數(shù)據(jù)沖突或非標準自定義投影就要求助于更專業(yè)的測繪技術支持。6. 錯用EPSG的代價三次坐標漂移的真實排查過程6.1 案例經(jīng)緯度數(shù)據(jù)被當成Web墨卡托渲染某可視化項目后端從數(shù)據(jù)庫讀出經(jīng)緯度后直接填充到前端地圖組件的經(jīng)緯度字段結果所有點都集中在地圖上一個不可思議的角落。排查時發(fā)現(xiàn)前端組件默認要求WGS84經(jīng)緯度格式但接口返回的數(shù)據(jù)被組件內(nèi)部誤判成了Web墨卡托平面坐標來處理。正因為目標坐標系是3857而喂進去的是“不完整的經(jīng)緯度”疊加之后位置自然全錯。解決辦法是把經(jīng)緯度字段和坐標系聲明清楚并讓組件明確使用EPSG:4326進行投影轉換。這類問題在前后端對接中非常多見核心就是沒有明確數(shù)據(jù)的SRID。6.2 案例CGCS2000與WGS84混淆邊界線偏移某項目拿到的規(guī)劃紅線數(shù)據(jù)元數(shù)據(jù)標注“CGCS2000經(jīng)緯度”但同事在導入數(shù)據(jù)庫時順手寫成了EPSG:4326。兩條邊界疊上去之后發(fā)現(xiàn)紅線與底圖存在約半米的整體偏移。半米在普通展示里無所謂但在施工放線時已經(jīng)足夠把管線位置裝錯。有經(jīng)驗的測繪人員會用“已知高精度控制點”來驗證坐標參考系統(tǒng)。給一份WGS84坐標和一份CGCS2000坐標放在同一個位置看它們差多少誤差在幾厘米內(nèi)說明可能是同一套體系差了半米、一米就要檢查是否是基準面混淆導致的系統(tǒng)性平移。6.3 案例老數(shù)據(jù)缺投影定義坐標張冠李戴某歷史數(shù)據(jù)文件只有圖形和屬性沒有任何坐標系信息圖層表現(xiàn)為一串幾千到幾萬量級的X/Y數(shù)值。直觀判斷這大概率是高斯-克呂格投影的平面坐標但具體是哪個帶、中央經(jīng)線是多少完全沒有依據(jù)。排查時先用已知城區(qū)地物做錨點把該地物的那份未知坐標值查出來再套用不同的CGCS2000投影帶計算對應經(jīng)緯度和真實經(jīng)緯度對比。試到某個帶號時誤差最小就可以確定EPSG。這個過程我用過不止一次確認后立刻用“指派投影”寫入SRID再重投影成4326備份。6.4 排查時統(tǒng)一用EPSG號碼對比的要點坐標系排查過程中最忌諱只比較“坐標系名字”。同一套坐標系在不同軟件里命名方式可能不同WGS84可以叫“WGS 84”“WGS_1984”“EPSG:4326”別人嘴里的“WGS84”也可能實際是CGCS2000的框架坐標。正確做法是把所有數(shù)據(jù)源的EPSG號碼統(tǒng)一列出來逐個標注對應數(shù)據(jù)和坐標值然后用同一底圖做疊加驗證。見一個數(shù)字就查一次EPSG絕不靠感覺。數(shù)據(jù)一旦發(fā)生漂移立刻檢查SRID聲明是否正確、投影參數(shù)中央經(jīng)線、帶號是否與區(qū)域匹配十之八九能揪出問題。7. 日常實用技巧與個人經(jīng)驗7.1 讓GIS軟件默認提示坐標系設置建議在QGIS等桌面GIS軟件里開啟“無投影時提示”功能當加載的數(shù)據(jù)沒有SRID定義時軟件會彈窗讓你選擇??此贫嗔艘徊讲僮鲄s能大幅降低后續(xù)分析出錯概率。我見過太多人加載數(shù)據(jù)后軟件彈窗直接被點掉閉著眼睛選了默認選項后面所有流程全廢。7.2 保存一份自己的EPSG速查表不必死記編號但要記錄自己業(yè)務范圍內(nèi)最常用的十幾個。我辦公桌邊上都有這么一張表按項目類型分類涉及GPS數(shù)據(jù)用4326涉及Web地圖展示用3857國內(nèi)規(guī)劃報送用4490具體城建項目必須到測繪部門確認目標坐標系。一個通用建議做任何數(shù)據(jù)交付時配套說明文件里寫上“坐標系EPSG:xxxx”列名寫清楚接收方就不會再問你“這個坐標是什么坐標系”了。7.3 與前后端協(xié)作時強調(diào)坐標系參數(shù)數(shù)據(jù)對接過程中最容易被忽略的就是坐標系元數(shù)據(jù)。接口文檔里寫“返回經(jīng)緯度坐標”卻不寫“坐標系為EPSG:4326”前端拿到數(shù)據(jù)后按照猜想的坐標系處理位置就偏了。我現(xiàn)在做接口設計時都強制在字段注釋里標注坐標系數(shù)據(jù)庫表字段也以GEOM形式保存SRID前端請求一次坐標轉換接口就都能對齊。代碼層面留一行PROJ轉換遠比事后救火簡單。EPSG這東西第一次接觸覺得抽象理解之后會發(fā)現(xiàn)它是整個數(shù)據(jù)地圖世界最基礎的常識。你不需要背下全部編號只需要清楚它的定義、會查詢、敢確認再配合幾個順手的工具就能在項目里少走太多彎路。