2.8版本里面有個xyz圖層的例子,稍作修改就可以加載天地圖的影像圖層。在3.0版本中,XYZ , bing 等圖層已經被移植到內核中。所以我們直接用XYZ圖層來加載天地圖即可
XYZImageLayer* osm = new XYZImageLayer(); osgEarth::URI uri("http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=yourkey"); osm->setURL(uri); osm->setProfile(Profile::create("spherical-mercator")); osm->setOpacity(0.5f); map->addLayer(osm);
需要自己申請key. 把 url里面的tk=yourkey. 中的yourkey替換掉即可。
坑1:以上代碼發出的請求,很快被服務器端forbidden.
出現這個錯誤,而且沒有充分的提示。為了查找被服務器拒絕的原因,我們用edge,chrome等瀏覽器發送Get請求到服務器,結果發現,這兩種瀏覽器均能接收正常的消息,如下圖所示:
這表明,只要在發送的Get請求中,正確設置了tk=參數,就能獲取到相應的切片圖像。既然問題沒有出現在服務器端,那么我們可以通過比較osgEarth發送的請求和瀏覽器發送請求的格式有何異同,從而找到問題所在。我們祭出神器wireshark, 對edge, chrome等發送的http內容進行分析:
HTTPClient利用curl發送遠程請求,通過wireshark抓包顯示,curl發送的Http header缺少上述截圖中的內容。我們對上述代碼進行修改,添加上述的header內容后,再次發送請求休息,服務器能夠正常返回200代碼,而且發送了JPG格式的圖片給osgEarth.
坑2:OE無法讀取JPG圖像,出現白色地球
通過wireshark抓包發現,即使給客戶端發送了200返回碼,而且curl接收了jpg圖片,但是OE無法找到合適的Plugin來讀取圖片,反復查看osgPlugin3.6中的插件,我確認並不缺少動態庫及其依賴。跟蹤代碼發現OE中的reponse返回mime類型跟預期中的不一樣,導致OE無法找到相應的reader. 修改HTTPClient.cpp后,終於可正常顯示天地圖的影像。
最后的注意事項:
需要設置環境變量,我電腦上的設置是仿制Qgis的設置。
完整代碼已經上次到百度盤: 鏈接:https://pan.baidu.com/s/1Y3hjpJ65pnbW5DLCfJJucw