`
holoblog
  • 浏览: 1228083 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:18936
文章分类
社区版块
存档分类
最新评论

使用DeepEarth加载在线Google地图(卫星、街道)

 
阅读更多

  在《初探DeepEarth控件》一文中简单介绍了一些DeepEarth的基本结构以及地图的TileSource的基本用法,本文通过一个简单的应用示例(加载在线的google卫星地图)继续展开介绍DeepEarth控件的相关用法。

  DeepEarth内部提供的任何TileSource都是继承于DeepEarth.Layers.TileSource类,该类实现了MultiScaleTileSource类和ITileSource接口,共同完成了实现地图图层的加载和相关算法策略。我们要实现加载在线Google地图的原理很简单,找到Google在线地图的Tile System映射地址,编写地图图层加载算法策略就OK了。

  在DeepEarth.Provider中提供了很多种地图加载的TileSource,我们可直接通过修改其中的一个来实现加载Google在线卫星地图,下面以BlueMarble/BmTileSource为例,该类的构造方法提供了多个重载版本,其中一个是接受一个地图Tile System映射地址,既然这样我们可以通过外部调用的时候将Tile System的映射地址传递进来,在这个类中我们只需要修改加载地图底层的算法就可以了,让这个算法方法适应于根据Google在线卫星地图的映射Url加载地图数据,通过重写TileSource的GetTile方法为如下代码即可:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->1publicoverrideUriGetTile(inttileLevel,inttilePositionX,inttilePositionY)
2
{
3
if(IsInitialized)
4
{
5
intzoom=TileToZoom(tileLevel);
6
_IsTileDownloadStarted=true;
7

8stringurl=string.Empty;
9

10switch(MapMode)
11
{
12
caseBmMapModes.BlueMarbleWeb:
13
url=TilePathBlueMarbleWeb;
14
url=string.Format(url,tilePositionX%4,tilePositionX,tilePositionY,zoom);
15
break;
16

17caseBmMapModes.BlueMarbleLocal:
18
url=TilePathBlueMarbleLocal;
19
intport=Application.Current.Host.Source.Port;
20
url=string.Format(url,zoom,tilePositionX,tilePositionY,port);
21

22
break;
23
}
24
returnnewUri(url);
25
}
26
returnnull;
27
}

  由于枚举类型默认为第一个枚举项,所以上面直接修改BlueMarbleWeb模式就可以了。在新建一个Silverlight应用和宿主程序,在Silverlight应用程序页面引入DeepEarth控件并调用DeepEarth的Map控件。

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->xmlns:DeepEarth="clr-namespace:DeepEarth;assembly=DeepEarth"

  下面为使用DeepEarth的Map控件示例代码:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><Gridx:Name="LayoutRoot"Width="640"Height="480">
<StackPanel>
<DeepEarth:Mapx:Name="map"Canvas.ZIndex="1003">
</DeepEarth:Map>
</StackPanel>
</Grid>

  界面也使用了Map控件,下面只需要为这个控件的图层指定一个TileSource就可以成功的加载地图数据了。通过HttpWatch等工具可以分析出Google在线卫星地图的Tile System映射地址为:http://khm{0}.google.com/kh/v=47&x={1}&y={2}&z={3}格式,那么直接将这个地址格式指定给BmTileSource就大功告成了。如下代码:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->1publicMainPage()
2
{
3
InitializeComponent();
4
map.BaseLayer.Source=newBmTileSource("http://khm{0}.google.com/kh/v=47&x={1}&y={2}&z={3}");
5
}

        

  编译运行程序的效果如上(重庆朝天门码头)截图。我们也可以通过修改BmTileSource里的常量TilePathBlueMarbleWeb为如下:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->privateconststringTilePathBlueMarbleWeb=@"http://khm{0}.google.com/kh/v=47&x={1}&y={2}&z={3}";

  这样在使用BmTileSource的时候也可以通过构造方法设置BmMapModes参数来确定加载什么地图:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->1publicMainPage()
2
{
3
InitializeComponent();
4

5
//map.BaseLayer.Source=newBmTileSource("http://khm{0}.google.com/kh/v=47&x={1}&y={2}&z={3}");
6map.BaseLayer.Source=newBmTileSource(BmMapModes.BlueMarbleWeb);
7
}

   同理我们也可以加载在线的Google街道地图,Google的街道地图的加载算法和卫星地图是一样的,不同的是街道地图的Tile System映射地址。同样可以通过HttpWatch等嗅探器工具可得到Google街道地图的地址格式:http://mt{0}.google.com/vt/lyrs=m@116&hl=zh-CN&x={1}&y={2}&z={3}&s= 。要实现加载Google街道地图只需要修改:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->privateconststringTilePathBlueMarbleWeb=@"http://khm{0}.google.com/kh/v=47&x={1}&y={2}&z={3}";

为Google街道地图的Tile System映射地址就可以了,代码如下:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->privateconststringTilePathBlueMarbleWeb=@"http://mt{0}.google.com/vt/lyrs=m@116&hl=zh-CN&x={1}&y={2}&z={3}&s="

        

  如果有Google地图数据,我们也可以自己部署地图数据,然后加载自己部署的Google地图数据也是可以的,这里就不做详细介绍,有兴趣的朋友可查阅我的另一篇文章:《【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps

欢迎加入WebGIS技术群:75662563

分享到:
评论

相关推荐

    deepearth地图瓦片切图工具

    deepearth地图瓦片切图工具,可从google上直接获取地图,分级切图。生成地图时的url为:url = string.Format(TilePath, zoom.ToString("D2"), tilePositionX, tilePositionY)

    deepearth源代码

    DeepEarth是一个地图控件,它将微软的Virtual Earth与...DeepEarth的最新版本是1.1,功能上可以说是很强大和完善了,提供了对多种地图数据服务的支持,包括Google Maps,YaHoo,Bing Maps,MapInfo以及amazonaws等等。

    deepearth.rar

    deepearth.rar 提供了各种Bing Maps上的一些功能示例、比如迷你地图.....

    DeepEarth源代码和DEMO

    本资源包含DeepEarth的源代码和DEMO

    deepearth-vs2010

    在Visual Studio 2010上正确运行的deepearth源代码

    配置好的DeepEarth

    在DeepEarth官网下载的源代码本机配置会存在一些问题,要自己修正,比如“MouseWheelEventArgs”是“System.Windows.Input.MouseWheelEventArgs”和“DeepEarth.Events.MouseWheelEventArgs”之间的不明确的引用,...

    DeepEarth-vs2010-清理后

    DeepEarth-vs2010-清理后DeepEarth-vs2010-清理后DeepEarth-vs2010-清理后

    DeepEarth源码

    DeepEarth.Source,学习C#用。

    [内部培训]DeepEarth架构原理与应用

    DeepEarth架构原理与应用,公司内部培训PPT

Global site tag (gtag.js) - Google Analytics