布 ArcGIS 瓦片全流程:環(huán)境搭建、配置與避坑指南)
簡(jiǎn)介本資源面向需要在 GeoServer 中發(fā)布 ArcGIS 瓦片服務(wù)的 GIS 開發(fā)者與運(yùn)維人員解決切片數(shù)據(jù)遷移、離線地圖服務(wù)搭建及跨平臺(tái)發(fā)布等實(shí)際問題適合具備一定 GIS 基礎(chǔ)、希望打通 ArcGIS 與開源地圖服務(wù)鏈路的中高級(jí)用戶。壓縮包共 1571 個(gè)文件約 137.36MB以 png 瓦片圖片、jar 依賴庫(kù)、xml 配置、prj 投影文件、sld 樣式、shp/dbf/shx 矢量數(shù)據(jù)及 pgw 坐標(biāo)文件為主另含 properties、bat 啟動(dòng)腳本與日志等運(yùn)行支撐文件覆蓋服務(wù)部署所需的完整目錄結(jié)構(gòu)。目前已有 1090 人學(xué)習(xí)下載。資源內(nèi)含可直接運(yùn)行的 GeoServer 環(huán)境與配套瓦片數(shù)據(jù)讀者可據(jù)此完成瓦片圖層發(fā)布、樣式配置與切片預(yù)覽并參考日志與配置文件排查發(fā)布過程中的常見問題快速?gòu)?fù)現(xiàn) ArcGIS 瓦片在 GeoServer 中的發(fā)布流程。1. 從一次瓦片發(fā)布翻車說起為什么我堅(jiān)持用 GeoServer 發(fā) ArcGIS 瓦片去年幫一個(gè)做智慧園區(qū)的朋友處理地圖服務(wù)他們前端用的是 ArcGIS JS API底圖卻想換成自己切的瓦片。我第一反應(yīng)是拿 GeoServer 直接發(fā)結(jié)果第一次就翻車了——瓦片目錄結(jié)構(gòu)對(duì)不上緩存切片規(guī)則沒配好前端加載出來全是灰塊。折騰到凌晨?jī)牲c(diǎn)才發(fā)現(xiàn)問題根本不在 GeoServer而在我切瓦片時(shí)用的坐標(biāo)系和網(wǎng)格集沒對(duì)齊。這件事讓我意識(shí)到用 GeoServer 發(fā)布 ArcGIS 瓦片這件事看起來只是點(diǎn)幾下鼠標(biāo)實(shí)際上從環(huán)境準(zhǔn)備到參數(shù)配置每一步都有坑。如果你也正卡在「GeoServer 怎么裝」「ArcGIS 瓦片怎么發(fā)布」「GeoServer 環(huán)境搭建」這些問題上那這篇筆記就是我從零到跑通的全過程記錄包括版本選擇、安裝步驟、配置參數(shù)和翻車后的補(bǔ)救辦法。整套流程在 Windows 和 Linux 上都驗(yàn)證過新手照著走能跑通熟手也能看到我在參數(shù)取舍上的思考。2. 環(huán)境準(zhǔn)備與版本選擇GeoServer 裝哪個(gè)版本、Java 怎么配2.1 GeoServer 版本與 Java 運(yùn)行時(shí)的對(duì)應(yīng)關(guān)系GeoServer 是基于 Java 的 Web 應(yīng)用裝之前第一件事不是下載 GeoServer而是確認(rèn) Java 版本。我見過太多人直接下最新版 GeoServer結(jié)果本機(jī) Java 是 8啟動(dòng)直接報(bào)UnsupportedClassVersionError。常見做法是GeoServer 2.20 及以后版本要求 Java 11 或 172.19 及以前可以用 Java 8。如果你不確定去 GeoServer 官網(wǎng)的下載頁(yè)看每個(gè)版本旁邊的「Java Version」標(biāo)注這是最穩(wěn)的。我一般會(huì)選 GeoServer 2.23.x 配 Java 17原因是這個(gè)組合在 Windows 和 Linux 上都有長(zhǎng)期支持且對(duì) ArcGIS 瓦片緩存的支持比較成熟。如果你機(jī)器上已經(jīng)有 Java 8 且不想動(dòng)那就退到 GeoServer 2.19.x但要注意后續(xù)插件兼容性會(huì)差一些。GeoServer 版本推薦 Java 版本適用場(chǎng)景2.23.x 及以上Java 17新部署需要長(zhǎng)期維護(hù)2.20.x ~ 2.22.xJava 11平衡穩(wěn)定與新特性2.19.x 及以下Java 8老系統(tǒng)兼容不推薦新項(xiàng)目提示不要同時(shí)裝多個(gè) Java 版本后不設(shè)JAVA_HOMEGeoServer 啟動(dòng)腳本會(huì)優(yōu)先讀環(huán)境變量讀不到才用默認(rèn)路徑很容易啟動(dòng)到錯(cuò)誤的 Java 上。2.2 下載與安裝 GeoServer 的兩種方式GeoServer 官方提供兩種安裝包平臺(tái)無關(guān)的二進(jìn)制包zip/tar.gz和 Windows 安裝程序。我強(qiáng)烈建議用二進(jìn)制包因?yàn)榘惭b程序會(huì)往系統(tǒng)里寫服務(wù)、注冊(cè)表卸載不干凈而二進(jìn)制包解壓就能用遷移也方便。以 Linux 為例下載和解壓命令如下# 下載 GeoServer 2.23.2 二進(jìn)制包 wget https://sourceforge.net/projects/geoserver/files/GeoServer/2.23.2/geoserver-2.23.2-bin.zip # 解壓到 /opt 目錄 unzip geoserver-2.23.2-bin.zip -d /opt/ # 進(jìn)入目錄并設(shè)置環(huán)境變量 cd /opt/geoserver-2.23.2 export JAVA_HOME/usr/lib/jvm/java-17-openjdk-amd64 export GEOSERVER_HOME/opt/geoserver-2.23.2這段命令里JAVA_HOME必須指向 JDK 17 的根目錄不是bin目錄。GEOSERVER_HOME是 GeoServer 自己的環(huán)境變量啟動(dòng)腳本會(huì)用它定位數(shù)據(jù)目錄和配置文件。如果你不設(shè)GEOSERVER_HOME啟動(dòng)腳本會(huì)默認(rèn)用當(dāng)前目錄一旦你從別的路徑執(zhí)行startup.sh就會(huì)找不到配置。Windows 下同理解壓后編輯startup.bat在開頭加上set JAVA_HOMEC:\Program Files\Java\jdk-17然后雙擊運(yùn)行。注意路徑里如果有空格不要加引號(hào)set命令會(huì)自己處理。2.3 啟動(dòng)前必須檢查的三個(gè)配置項(xiàng)解壓完別急著啟動(dòng)先改三個(gè)地方否則后面發(fā)布瓦片時(shí)一定會(huì)回來改。第一data_dir的位置。默認(rèn)在 GeoServer 安裝目錄下的data_dir但生產(chǎn)環(huán)境我一般會(huì)挪到獨(dú)立磁盤比如/data/geoserver_data。改法是編輯bin/startup.sh找到-DGEOSERVER_DATA_DIR參數(shù)把路徑改掉。這樣升級(jí) GeoServer 時(shí)直接替換程序目錄數(shù)據(jù)不受影響。第二端口號(hào)。默認(rèn) 8080如果機(jī)器上已經(jīng)有 Tomcat 或其他服務(wù)占了改成 8088 或別的。改etc/jetty.xml里的jetty.port值。第三內(nèi)存分配。默認(rèn)啟動(dòng)腳本給的是 512MB 初始堆發(fā)布大量瓦片時(shí)不夠用。在startup.sh里找到-Xms和-Xmx我一般設(shè)成-Xms1024m -Xmx2048m具體看機(jī)器內(nèi)存別超過物理內(nèi)存的 70%。# 編輯 startup.sh 中的 JAVA_OPTS JAVA_OPTS-Xms1024m -Xmx2048m -DGEOSERVER_DATA_DIR/data/geoserver_data改完保存執(zhí)行./bin/startup.sh看到日志里出現(xiàn)Started SelectChannelConnector0.0.0.0:8088就說明起來了。瀏覽器訪問http://你的IP:8088/geoserver默認(rèn)賬號(hào)admin密碼geoserver能進(jìn)管理界面就算環(huán)境通了。3. 發(fā)布 ArcGIS 瓦片從數(shù)據(jù)準(zhǔn)備到服務(wù)配置的完整鏈路3.1 ArcGIS 瓦片目錄結(jié)構(gòu)與 GeoServer 的對(duì)應(yīng)關(guān)系A(chǔ)rcGIS 瓦片也叫切片緩存的目錄結(jié)構(gòu)是固定的根目錄下是Layers文件夾里面按縮放級(jí)別分_alllayers/L00、L01這樣的子目錄每個(gè)級(jí)別下再按行列號(hào)分R0000C0000.png這樣的文件。GeoServer 要發(fā)布這種瓦片不能直接指向Layers目錄而是要用 GeoServer 的「GeoWebCache」模塊來識(shí)別。我一般會(huì)先把瓦片目錄整理成 GeoServer 能讀的格式。假設(shè)你的瓦片在/data/tiles/mytiles里面是Layers/_alllayers/L00/R00000000C00000000.png這樣的結(jié)構(gòu)。GeoServer 需要你在「Tile Caches」里新建一個(gè)緩存然后指定這個(gè)目錄作為「Tile Directory」。但這里有個(gè)關(guān)鍵點(diǎn)GeoServer 默認(rèn)的瓦片網(wǎng)格集是 EPSG:900913也就是 Web Mercator而 ArcGIS 瓦片可能是 EPSG:4326 或別的。如果網(wǎng)格集對(duì)不上GeoServer 會(huì)找不到瓦片文件前端加載就是空白。所以第一步是確認(rèn)你的瓦片切圖時(shí)用的坐標(biāo)系和網(wǎng)格集。常見做法是在 ArcGIS 里切瓦片時(shí)如果用的是「Google Maps」或「Bing Maps」的切片方案那就是 EPSG:900913GeoServer 里選EPSG:900913網(wǎng)格集即可。如果是自定義的需要在 GeoServer 里新建一個(gè)對(duì)應(yīng)的網(wǎng)格集參數(shù)包括縮放級(jí)別、分辨率、瓦片尺寸。3.2 在 GeoServer 中新建瓦片緩存并掛載目錄登錄 GeoServer 管理界面左側(cè)菜單找到「Tile Caches」點(diǎn)擊「Create a new tile cache」。填寫時(shí)注意幾個(gè)參數(shù)Name隨便起比如arcgis_tilesTile Directory填你的瓦片根目錄比如/data/tiles/mytilesGridset選EPSG:900913或你自定義的Format選image/png或image/jpeg要和瓦片文件后綴一致Zoom Start / Stop填你的瓦片實(shí)際有的級(jí)別比如 0 到 18填完保存GeoServer 會(huì)去掃描目錄。如果目錄結(jié)構(gòu)不對(duì)它會(huì)報(bào)「No tiles found」。這時(shí)候去日志里看一般會(huì)提示它期望的路徑格式。我踩過的坑是ArcGIS 的_alllayers目錄名必須完全一致大小寫敏感少個(gè)下劃線都不行。# 檢查瓦片目錄結(jié)構(gòu)是否正確 ls /data/tiles/mytiles/Layers/_alllayers/ # 應(yīng)該輸出 L00 L01 L02 ... 這樣的級(jí)別目錄如果輸出的是L0而不是L00那說明你的瓦片不是標(biāo)準(zhǔn) ArcGIS 格式可能是別的工具切的。這種情況要么重新切要么在 GeoServer 里手動(dòng)改目錄名但改完要確保每個(gè)級(jí)別下的行列號(hào)也是 8 位補(bǔ)零格式。3.3 配置 GeoWebCache 的磁盤配額與緩存策略瓦片目錄掛上后GeoServer 默認(rèn)會(huì)把它當(dāng)成「已緩存的瓦片」直接讀但如果你后續(xù)要更新瓦片或者想控制磁盤占用就得配 GeoWebCache 的磁盤配額。在「Tile Caches」里找到你剛建的緩存點(diǎn)進(jìn)去有個(gè)「Disk Quota」選項(xiàng)。我一般會(huì)設(shè)兩個(gè)值Disk Quota設(shè)成 10GB 或根據(jù)磁盤剩余空間定Eviction Policy選Least Frequently Used。這樣當(dāng)緩存超過配額時(shí)GeoServer 會(huì)自動(dòng)清理不常用的瓦片避免磁盤寫滿。另外如果你希望 GeoServer 在找不到瓦片時(shí)自動(dòng)去后端地圖服務(wù)取圖并緩存那就要在「Tile Layers」里把圖層和緩存關(guān)聯(lián)起來。但注意如果你只有靜態(tài)瓦片沒有后端 WMS 服務(wù)那就不要開「Auto Cache」否則 GeoServer 會(huì)不斷嘗試請(qǐng)求一個(gè)不存在的服務(wù)日志里全是報(bào)錯(cuò)。注意靜態(tài)瓦片發(fā)布時(shí)Tile Layers里的圖層必須和緩存名稱一致否則前端請(qǐng)求的 URL 會(huì) 404。我一般會(huì)在「Layer Preview」里先預(yù)覽一下確認(rèn)能出圖再給前端。4. 避坑與排查發(fā)布 ArcGIS 瓦片時(shí)最常見的五個(gè)問題4.1 瓦片加載出來是空白或灰塊現(xiàn)象前端請(qǐng)求瓦片 URL 返回 200但圖片是空白或灰色。原因最常見的是網(wǎng)格集不匹配。GeoServer 按 EPSG:900913 的網(wǎng)格去算行列號(hào)但你的瓦片是按 EPSG:4326 切的行列號(hào)對(duì)不上GeoServer 找不到文件就返回一個(gè)空?qǐng)D片。解決確認(rèn)切圖時(shí)的坐標(biāo)系在 GeoServer 里新建對(duì)應(yīng)的網(wǎng)格集。如果不想重建可以用gdal2tiles重新切一份 Web Mercator 的瓦片。我一般會(huì)在切圖前就統(tǒng)一用 EPSG:900913省得后面折騰。4.2 啟動(dòng)報(bào)錯(cuò) UnsupportedClassVersionError現(xiàn)象執(zhí)行startup.sh后閃退日志里寫UnsupportedClassVersionError: geoserver/web/... has been compiled by a more recent version of the Java Runtime。原因GeoServer 版本和 Java 版本不匹配。比如 GeoServer 2.23 需要 Java 17但你機(jī)器上JAVA_HOME指向的是 Java 8。解決java -version確認(rèn)當(dāng)前版本然后改startup.sh里的JAVA_HOME指向正確的 JDK。如果機(jī)器上有多個(gè) Java用update-alternatives --config java切換默認(rèn)版本但更穩(wěn)的是直接在啟動(dòng)腳本里寫死路徑。4.3 瓦片目錄掃描不到文件現(xiàn)象在 Tile Caches 里填了目錄保存后提示「No tiles found」但目錄里明明有圖片。原因ArcGIS 瓦片目錄結(jié)構(gòu)是Layers/_alllayers/L00/R00000000C00000000.png但 GeoServer 期望的可能是Layers/_alllayers/L00/R00000000C00000000.png這種格式差一個(gè)字符都不行。另外如果目錄權(quán)限不對(duì)GeoServer 進(jìn)程讀不到也會(huì)報(bào)這個(gè)錯(cuò)。解決用ls -R看目錄結(jié)構(gòu)對(duì)比 GeoServer 日志里提示的期望路徑。權(quán)限問題用chown -R geoserver:geoserver /data/tiles改一下確保運(yùn)行 GeoServer 的用戶有讀權(quán)限。4.4 前端跨域請(qǐng)求被攔截現(xiàn)象瀏覽器控制臺(tái)報(bào)CORS policy: No Access-Control-Allow-Origin header。原因GeoServer 默認(rèn)沒開 CORS前端從別的域名請(qǐng)求瓦片時(shí)被瀏覽器攔截。解決編輯webapps/geoserver/WEB-INF/web.xml找到cross-origin相關(guān)的 filter把a(bǔ)llowedOrigins改成*或你的前端域名。改完重啟 GeoServer。如果用的是 Jetty也可以在etc/jetty.xml里加 CORS 配置但改web.xml更通用。4.5 瓦片更新后前端還是舊圖現(xiàn)象重新切了瓦片覆蓋上去但前端加載的還是舊圖。原因?yàn)g覽器緩存或 GeoServer 的瓦片緩存沒刷新。GeoServer 的 GeoWebCache 會(huì)緩存瓦片元數(shù)據(jù)即使文件變了它可能還讀舊的。解決在 Tile Caches 里找到對(duì)應(yīng)緩存點(diǎn)「Seed/Truncate」選「Truncate」清空緩存然后重新訪問。如果只是瀏覽器緩存強(qiáng)制刷新CtrlF5或加個(gè)版本號(hào)參數(shù)。我一般會(huì)在瓦片 URL 后面加?t時(shí)間戳來繞過緩存。5. 裝完怎么驗(yàn)證跑通三個(gè)必做的檢查與一個(gè)習(xí)慣5.1 用 Layer Preview 做第一輪驗(yàn)證GeoServer 裝完、瓦片發(fā)布完第一件事不是直接給前端而是用自帶的「Layer Preview」看能不能出圖。在左側(cè)菜單點(diǎn)「Layer Preview」找到你發(fā)布的圖層點(diǎn)「OpenLayers」預(yù)覽。如果能看到地圖說明 GeoServer 本身配置沒問題。如果看不到按 F12 看網(wǎng)絡(luò)請(qǐng)求哪個(gè)瓦片 404 或 500就去日志里找對(duì)應(yīng)錯(cuò)誤。這一步能過濾掉 80% 的配置問題比如網(wǎng)格集不對(duì)、目錄權(quán)限不對(duì)、瓦片格式不對(duì)。我一般會(huì)在這個(gè)頁(yè)面多縮放幾級(jí)確認(rèn)每個(gè)級(jí)別都能正常加載因?yàn)橛行﹩栴}只在特定級(jí)別出現(xiàn)。5.2 用 curl 模擬前端請(qǐng)求瓦片Layer Preview 能出圖不代表前端就能用。因?yàn)榍岸苏?qǐng)求的 URL 可能和 GeoServer 內(nèi)部用的不一樣。我一般會(huì)用curl模擬一下# 模擬請(qǐng)求一個(gè)瓦片替換成你的實(shí)際 URL curl -I http://你的IP:8088/geoserver/gwc/service/tms/1.0.0/arcgis_tilesEPSG:900913png/0/0/0.png看返回的 HTTP 狀態(tài)碼。如果是 200且Content-Type是image/png說明瓦片能正常訪問。如果是 404檢查 URL 里的緩存名稱、網(wǎng)格集、格式是否和 GeoServer 里配的一致。如果是 500去日志里看具體報(bào)錯(cuò)。這一步能發(fā)現(xiàn) URL 拼寫錯(cuò)誤、緩存名稱大小寫不一致等問題。我踩過的坑是GeoServer 里緩存名是arcgis_tiles但前端寫成了arcgis-tiles橫線和下劃線搞混了排查了半天。5.3 檢查日志里的警告和錯(cuò)誤GeoServer 的日志在logs/geoserver.log啟動(dòng)后如果有配置問題日志里會(huì)有WARN或ERROR。我一般會(huì)tail -f盯著日志然后在前端刷新頁(yè)面看有沒有新的報(bào)錯(cuò)。常見的警告包括「Could not find tile」「GridSet not found」「Permission denied」每個(gè)都對(duì)應(yīng)一個(gè)具體的配置問題。如果日志里全是INFO沒有報(bào)錯(cuò)但瓦片就是出不來那可能是前端的問題比如請(qǐng)求的 URL 路徑不對(duì)或者跨域被攔截。這時(shí)候用瀏覽器的開發(fā)者工具看網(wǎng)絡(luò)請(qǐng)求比看日志更直接。5.4 我養(yǎng)成的習(xí)慣每次改配置前先備份 data_dir從那以后我每次動(dòng) GeoServer 配置前都會(huì)先cp -r /data/geoserver_data /data/geoserver_data_bak。因?yàn)?GeoServer 的配置全在data_dir里改壞了直接回滾目錄比重新配一遍快得多。這個(gè)習(xí)慣幫我省過至少三次通宵。另外發(fā)布瓦片時(shí)我會(huì)先用一個(gè)小范圍的瓦片目錄測(cè)試確認(rèn)能跑通再掛全量避免一上來就掃幾十萬個(gè)文件把 GeoServer 卡死。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取