首先回顾下Bing Maps Silverlight Control是如何加载Google卫星地图,其原理就是为Google卫星地图定制一个TileSource,在这个TileSource里实现加载Google卫星地图的算法,主要就是构造正确的TileSource映射Url,此Url的格式能够经过HttpWatch等HTTP嗅探器工具抓取分析获得。
1
public class
GoogleTileSource : TileSource
2
{
3
public
GoogleTileSource()
4
: base("http://khm{0}.google.com/kh/v=47&x={1}&y={2}&z={3}"
)
5
{ }
6
7
public override Uri GetUri(int x, int y, int
zoomLevel)
8
{
9
return new Uri(string.Format(this.UriFormat, x % 4
, x, y, zoomLevel));
10
}
11
}
1
public partial class
MainPage : UserControl
2
{
3
public
MainPage()
4
{
5
InitializeComponent();
6
7
MapTileLayer tileLayer = new
MapTileLayer();
8
GoogleTileSource gts = new
GoogleTileSource();
9
tileLayer.TileSources.Add(gts);
10
myMap.Children.Add(tileLayer);
11
this.myMap.Mode = new
MercatorMode();
12
}
13
}
如上便实现了加载Google在线卫星地图,虽然实现了功能可是仍是不够完美,若是咱们没有联网就没法加载地图,这就须要咱们本身部署地图数据,那如何实现加载自定义部署的地图数据呢?Google地图数据其实很简单,部署地图数据一样简单,只须要将地图数据经过Web服务器(如:IIS)部署好就好了。
地图数据部署完备,接下来就能够基于本身部署的地图数据开发TileSource的Url映射算法,而后同加载Google在线地图数据同样的方式将本身部署的地图数据加载并呈现出来。修改上面加载在线地图数据的算法,让其适应于加载本身部署的Google Maps数据。
1
public class
GoogleTileSource : TileSource
2
{
3
public
GoogleTileSource()
4
: base("http://localhost:5000/CQ_{0}/{1}-{2}.png"
)
5
{ }
6
7
public override Uri GetUri(int x, int y, int
zoomLevel)
8
{
9
int port =
Application.Current.Host.Source.Port;
10
11
string url = string.Format(this.UriFormat, (zoomLevel + 1).ToString("D2"), (y + 1).ToString("D6"), (x + 1).ToString("D6"
), port);
12
return new
Uri(url);
13
}
再次编译运行上面的程序,能够看到已经成功的将本身部署的Google Maps数据加载并呈现出来了,爽~~~~~~。有了Google地图数据,本身部署就不用担忧没有联网形成不能加载地图的麻烦了。
若是你以为上图的效果不是很好看,你能够给地图设置一个背景颜色,相对来讲就好看多了,和在线的Google Maps显示效果是同样的。上面完成了加载本身部署的地图数据中的路况地图,其实咱们也能够从本身部署的地图数据服务器上加载Google卫星地图,实现方式和加载路况地图同样简单,在此基础上只须要作小小修改就能够达到目的。在Google Maps地图数据中,路况地图和卫星地图的Tile Source算法是同样的,只是用了不一样类型的图片而已,上面使用路径地图是:
1
public
GoogleTileSource()
2
: base("http://localhost:5000/CQ_{0}/{1}-{2}.png"
)
3
{ }
要实现加载本身部署的地图数据服务器上的卫星地图,只须要将上面的Tile System的映射Url的地图图片类型修改成.jpg就好了,以下代码块:
就这样就能够加载出卫星地图了,编译运行程序就会感受到有的图层没有加载出来,这是因为TileSource的图片映射Url映射计算错误的缘由,地图的不一样方大级别的算法这里就不作介绍,但愿经过本文抛砖引玉,引出更多更好更深刻的技术文章。