使用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 |
|
地級城市 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級,整幅地圖也能夠完全顯示,速度有明顯的提升。