1. 程式人生 > >使用Openlayers呼叫天地圖線上服務資料

使用Openlayers呼叫天地圖線上服務資料

國家測繪局2010年10月21日正式釋出中國公眾版國家地理資訊公共服務平臺“天地圖”,作為中國境內資料資源最全的地理資訊服務網站,“天地圖”將為公眾提供權威、可信、統一的地理資訊資源。 “天地圖”公開開放了地圖資料服務介面,第三方使用者 可以直接通過網際網路獲取地圖資料 ,無需授權認證,在公眾服務資訊公開方面可以說是一次非常大的進步。
“天地圖”的 線上服務資料近 10TB 以下是“天地圖” 提供 的線上地理資訊資料資源:

資料型別

資料來源

級別

服務地址

線劃地圖

全球 1:100 萬地理底圖

2-10

http://tile0.tianditu.com/services/A0512_EMap

http://tile0.tianditu.com/services/AB0512_Anno

全國 1:25 萬公開版數字 地形圖

11-12

http://tile0.tianditu.com/services/B0627_EMap1112

全國車載導航

13-18

http://tile0.tianditu.com/services/siwei0608

衛星影像

全球 250 米衛星影像 (MODIS)

2-7

http://tile0.tianditu.com/services/sbsm0210

全國 15 米衛星影像 (ETM)

8-10

全國 2.5 米衛星影像 (P5)

11-14

http://tile0.tianditu.com/services/e11

http://tile0.tianditu.com/services/e12
http://tile0.tianditu.com/services/e13
http://tile0.tianditu.com/services/eastdawnall

地級城市 0.6 米衛星影像

(QuickBird WorldView I WorldView II)

15-18

http://tile0.tianditu.com/services/sbsm1518

數字高程模型

全球 90X90 米數字高程模型

http://tile0.tianditu.com/services/J07098

地名地址

全球 1:100 萬地名地址

http://search.tianditu.com/wfs

全國 1:25 萬地名地址

全國車載導航地名地址

除地名地址資料使用OGC WFS協議釋出外,其他資料全部採用基於OGC WMS-C協議的分級瓦片形式釋出,工作原理類似於谷歌地圖和OSM(OpenStreetMap)。
類似 谷歌地圖,“天地圖”為網際網路開發人員提供了二次開發API( 武大吉奧開發的GeoGlobe二維地圖API)。

通過分析GeoGlobe API程式碼,發現它源自Openlayers,大部分程式碼除了把Openlayers換成GeoSurf 外,沒有任何變化。不知道Openlayers專案組就此作何感想。
正因為如此,我們可以參考OpenLayers.Layer.TileCache和OpenLayers.Layer.XYZ類,編寫一個專用於讀取“天地圖”的TDTLayer類,使Openlayers能夠直接訪問“天地圖”的線上地圖資料。

“天地圖”採用256×256畫素,png格式的地圖瓦片檔案,讀取單個檔案需要四個引數:T、X、Y、L
T=瓦片(Tile)名稱,X=瓦片橫向編碼,Y=瓦片縱向編碼,L=瓦片級別
這個是一個完整的請求示例:http://tile0.tianditu.com/DataServer?T=AB0512_Anno&X=50&Y=12&L=6

天地圖” 地理資訊資料資源列表將地圖瓦片分為16級(L=2-18),其中L=2級比例尺最小,對應全球地圖。
L=2級只有8個瓦片檔案,分別是

 X= 0 1 2 3 0 1 2 3
 Y= 0 0 0 0 1 1 1 1
L=3級有32個瓦片檔案,分別是:
 X= 0-7
 Y= 0-3
L=4級有128個瓦片檔案,分別是:
 X= 0-15
 Y= 0-7
其餘各級以此類推,每級的瓦片檔案數比前一級增加4倍,其中線劃地圖10級以上,衛星地圖8級以上只提供中國境內的資料,沒有覆蓋全球。

檢視 GeoGlobe API主程式碼GeoSurfJSAPI.js檔案(相當於 Openlayers.js ,可以瞭解X(x_num)、Y(y_num)、L(level)的生成方法,虛擬碼如下:
level=getLevelForResolution(map.getResolution()); //計算瓦片級別
coef=TopTileSize.w/Math.pow(2,level); //中間係數
x_num=this.pyramid.topTileFromX<this.pyramid.topTileToX?Math.round((bounds.left-this.pyramid.topTileFromX)/coef):Math.round((this.pyramid.topTileFromX-bounds.right)/coef);
y_num=this.pyramid.topTileFromY<this.pyramid.topTileToY?Math.round((bounds.bottom-this.pyramid.topTileFromY)/coef):Math.round((this.pyramid.topTileFromY-bounds.top)/coef);

根據當前解析度計算地圖瓦片級別
function getLevelForResolution(res){
var ratio=map.getMaxResolution()/res;
if(ratio<1)return 0;
for(var level=0;ratio/2>=1;)
{level++;ratio/=2;}
return level;
}

經過簡單測試,“天地圖”和谷歌地圖在資料上差別不大,二次開發方面藉助於強大的Openlayers地圖客戶端引擎不會弱於Google Map API,唯獨在速度上與谷歌地圖存在較大差距,特別是地圖放大到13級-18級時,延遲變得非常明顯,有時甚至無法顯示。

使用Firebug跟蹤執行發現,大約1/3的地圖瓦片請求超時,導致客戶端讀取失敗。
“天地圖”目前還處於測試階段,希望相關單位繼續改進和提升伺服器端效能,快速穩定的響應大量客戶端發出的併發請求。

測試中發現,
“天地圖”開放的地圖資料服務介面從tile0.tianditu.com一直到 tile7.tianditu.com 。依次ping 這8個服務介面,tile1到 tile7 的響應速度相對較快。修改客戶端js程式碼,將瓦片地圖請求平均傳送給tile0到 tile7 八個服務介面,可以有效加快地圖顯示速度。 “天地圖”提供的GeoSurfJSAPI.js中 已經包含相關程式碼,通過給Layer的mirrorUrl屬性賦值,可以均衡讀取指定的多個服務介面,程式碼如下:
                        var layer3 = new GeoSurf.Layer.GlobeTile("siwei0608", "http://tile6.tianditu.com/services/siwei0608", {
                                transitionEffect: "resize",
                                topLevel: 13,
                                bottomLevel: 18,
                                maxExtent: new GeoSurf.Bounds(100, 27, 110, 34),
                                mirrorUrls: [
                                    "http://tile1.tianditu.com/services/siwei0608",
                                    "http://tile2.tianditu.com/services/siwei0608",
                                    "http://tile3.tianditu.com/services/siwei0608",
                                    "http://tile4.tianditu.com/services/siwei0608",
                                    "http://tile5.tianditu.com/services/siwei0608",
                                    "http://tile6.tianditu.com/services/siwei0608"
                                ]
                            });

客戶端使用上述讀取策略後,即便放大到17-18級,整幅地圖也能夠完全顯示,速度有明顯的提升。