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; } 根据不同的参数组合为一个又一个完整的地图底片映射地址然后组合在一起就显示出了完整的地图编译运行这个示例我们可看到如下效果 文章出处; 或 |