C# Devexpress Mapcontrol地图离线加载本地切片地图数据

C# Devexpress Mapcontrol 地图离线加载本地切片地图数据

C #Devexpress的Mapcontrol是一个强大的地图控件,可以连接Bing等网络地图,也可以连接搭建的WMS服务器地图,并且可以在地图上进行各种图形的绘制,但是我们会遇到某些客户环境是没有网络的,但是需要有离线的地图展示,因此可以参照本文方法进行离线地图加载。

未经作者许可,禁止转载!

1、首先我们需要下载地图资源

网上有很多的下载器可以下载,但是精度,放大级别比较高的地图大多需要收费,大家可以自己找下,一般来说下载好的切片地图,文件夹结果应该是如下的(截图为谷歌地图):C# Devexpress Mapcontrol地图离线加载本地切片地图数据_第1张图片
切片结构如下,地图会因为下载的范围和级别不同,生成不同的文件夹和名称
C# Devexpress Mapcontrol地图离线加载本地切片地图数据_第2张图片

2、在WinForm界面加入Mapcontrol

C# Devexpress Mapcontrol地图离线加载本地切片地图数据_第3张图片
窗体代码 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();//图层数据源设置为本地资源

        }
        /// 
        /// 本地资源类
        /// 
        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;
            }
        } 

运行效果

C# Devexpress Mapcontrol地图离线加载本地切片地图数据_第4张图片
不同所缩放级别,控件会自动读取对应的层级的切片文件夹,如图:
C# Devexpress Mapcontrol地图离线加载本地切片地图数据_第5张图片

结束

你可能感兴趣的:(Devexpress控件,c#)