DeepEarth是一個地圖控件它將微軟的Virtual Earth與Silverlight 聯合起來該開源項目由其創建者(一群NET的狂熱愛好者)在CodePlex上發布這句話已經在一年前就已經在網上隨處可見了去年月InfoQ的張龍老師就翻譯了一篇關於DeepEarth的文章資料《DeepEarth使用Silverlight的地圖控件》當時我也又關注不過一直都沒有花時間去研究它最近寫Bing Maps開發文章很多朋友都問我有研究過DeepEarth的話題為了幫助這些朋友解決一些困擾特把DeepEarth簡單學習了下特此分享給大家關於DeepEarth的最新信息可訪問進行了解
DeepEarth的最新版本是功能上可以說是很強大和完善了提供了對多種地圖數據服務的支持包括Google MapsYaHooBing MapsMapInfo以及amazonaws等等本文通過DeepEarth加載amazonaws的衛星地圖的示例程序初步探索下DeepEarth的基本使用方法
首先建立Silverlight項目以及Siverlight宿主Web應用程序附加DeepEarth源代碼項目到解決方案中並添加項目引用到新建的Siverlight應用項目解決方案如下
到這裡一個基本的入門工作已經准備好了接下來就是如何使用DeepEarth首先得在新建的Silverlight的MainPagexaml裡聲明DeepEarth的引用如下
xmlns:DeepEarth=clrnamespace:DeepEarth;assembly=DeepEarth
xmlns:DeepBlueMarble=clrnamespace:DeepEarthProviderBlueMarble;assembly=DeepEarthProvider
xmlns:DeepControls=clrnamespace:DeepEarthControls;assembly=DeepEarth
有了引用的聲明下面就可以使用DeepEarth控件以及其他的一些輔助控件(功能導航控件)具體使用如下代碼塊
<Grid x:Name=LayoutRoot Width= Height=>
<DeepEarth:Map x:Name=map>
<DeepControls:NavControl CanvasZIndex=>
</DeepControls:NavControl>
<DeepControls:CoordControl />
</DeepEarth:Map>
</Grid>
前端開發就這樣了現在轉到後台代碼視圖並編寫如下代碼
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
if (HtmlPageIsEnabled)
{
mapBaseLayerSource = new BmTileSource(BmMapModesBlueMarbleWeb);
mapEventsMapLoaded += PageLoad;
}
}
protected void PageLoad(Map m MapEventArgs args)
{
//定位地圖的經度和緯度坐標
double longitude = doubleParse();
double latitude = doubleParse();
mSetViewCenter(new Point(longitude latitude) );
}
}
或許有人會說代碼我都能看懂這到底代表什麼意思呢?其實很簡單這段後台代碼就是給前端的DeepEarth控件初始化了一個地圖圖層並為地圖控件的加載事件委托了處理函數當地圖控件運行初始化時將地圖定位到指定的經度和緯度以及地圖所顯示的放大級別
主要的實現還是在BmTileSource這個地圖圖層源裡也可以叫他地圖圖片系統源或地圖圖片映射系統源吧關於TileSource可查看我的另一篇文章【Silverlight】Bing Maps學習系列(七)使用Bing Maps的圖片系統(Tile System)
現在我們將目光轉移到BmTileSource類裡去位於DeepEarthProviderBlueMarble目錄下你將會看到這樣一句代碼
private const string TilePathBlueMarbleWeb = @;
這就是amazonaws衛星地圖數據的Tile System(圖片系統)的映射Url通過這個Url我們就可以使用DeepEarth控件去加載amazonaws的衛星地圖這裡需要注意的就是BmTileSource類裡的GetTile方法它就是用於計算地圖圖片系統的圖片映射Url的
public override Uri GetTile(int tileLevel int tilePositionX int tilePositionY)
{
if (IsInitialized)
{
int zoom = TileToZoom(tileLevel);
_IsTileDownloadStarted = true;
string url = stringEmpty;
switch (MapMode)
{
case BmMapModesBlueMarbleWeb:
url = TilePathBlueMarbleWeb;
url = stringFormat(url zoom tilePositionX tilePositionY);
break;
case BmMapModesBlueMarbleLocal:
url = TilePathBlueMarbleLocal;
int port = ApplicationCurrentHostSourcePort;
url = stringFormat(url zoom tilePositionX tilePositionY port);
break;
}
return new Uri(url);
}
return null;
}
根據不同的參數組合為一個又一個完整的地圖底片映射地址然後組合在一起就顯示出了完整的地圖編譯運行這個示例我們可看到如下效果
文章出處; 或
From:http://tw.wingwit.com/Article/program/net/201311/12533.html