赞
踩
C #Devexpress的Mapcontrol是一个强大的地图控件,可以连接Bing等网络地图,也可以连接搭建的WMS服务器地图,并且可以在地图上进行各种图形的绘制,但是我们会遇到某些客户环境是没有网络的,但是需要有离线的地图展示,因此可以参照本文方法进行离线地图加载。
网上有很多的下载器可以下载,但是精度,放大级别比较高的地图大多需要收费,大家可以自己找下,一般来说下载好的切片地图,文件夹结果应该是如下的(截图为谷歌地图):
切片结构如下,地图会因为下载的范围和级别不同,生成不同的文件夹和名称
窗体代码 C#
。
public Form1() {
InitializeComponent();
}
ImageLayer imageTilesLayer = new ImageLayer();
private void Form1_Load(object sender, EventArgs e) {
// Create a map control, set its dock style and add it to the form.
//MapControl map = new MapControl();
//map.Dock = DockStyle.Fill;
//this.Controls.Add(map);
// Create a layer to load image tiles from a local map data provider.
map.Layers.Add(imageTilesLayer);//添加图层
imageTilesLayer.DataProvider = new LocalProvider();//图层数据源设置为本地资源
}
/// <summary>
/// 本地资源类
/// </summary>
public class LocalProvider : MapDataProviderBase {
readonly SphericalMercatorProjection projection = new SphericalMercatorProjection();
public LocalProvider() {
TileSource = new LocalTileSource(this);
}
public override ProjectionBase Projection {
get {
return projection;
}
}
public override MapSize GetMapSizeInPixels(double zoomLevel) {
double imageSize;
imageSize = LocalTileSource.CalculateTotalImageSize(zoomLevel);
return new MapSize(imageSize, imageSize);
}
protected override Size BaseSizeInPixels {
get { return new Size(Convert.ToInt32(LocalTileSource.tileSize * 2), Convert.ToInt32(LocalTileSource.tileSize * 2)); }
}
}
public class LocalTileSource : MapTileSourceBase {
public const int tileSize = 256;
public const int maxZoomLevel = 18;
string directoryPath;
internal static double CalculateTotalImageSize(double zoomLevel) {
if (zoomLevel < 1.0)
return zoomLevel * tileSize * 2;
return Math.Pow(2.0, zoomLevel) * tileSize;
}
public LocalTileSource(ICacheOptionsProvider cacheOptionsProvider) :
base((int)CalculateTotalImageSize(maxZoomLevel), (int)CalculateTotalImageSize(maxZoomLevel), tileSize, tileSize, cacheOptionsProvider) {
DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory());
directoryPath = dir.Parent.Parent.FullName;
}
//重写基类的获取图片的方法,一定要对应按下载地图的文件结构
public override Uri GetTileByZoomLevel(int zoomLevel, int tilePositionX, int tilePositionY) {
if (zoomLevel <= maxZoomLevel) {
Uri u = new Uri(string.Format("file://" + directoryPath + "\\"+Mapstyle+ "\\{0}\\{1}\\{2}."+ MapsFormat, zoomLevel, tilePositionX, tilePositionY));
return u;
}
return null;
}
}
不同所缩放级别,控件会自动读取对应的层级的切片文件夹,如图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。