深入理解最强桌面地图控件GMAP.NET ---离线地图
深入理解最强桌面地图控件GMAP.NET ---离线地图
这章会介绍GMAP.NET的核心功能之一:离线地图。这个功能可以满足很多政府项目、保密项目、或者由于种种原因不能上网的项目的需求。
本章主要分成三个方面介绍:演示、生成离线地图、Demo代码。
一.演示
地图显示

地图缩放后还可以显示

网络是断了的

二.生成离线地图
前面已经演示了Demo,这个部分说如何生成离线地图,也就是Data.gmdb。GMAP.NET提供了集中缓存方式,MySQL,SQLLite,MSSQL,Postgre等等,
默认是使用SQLLite的,这部分以后再分析。
1. 启动Demo.WindowsPresentation项目作为生成工具,这个项目在svn或者Download中都有。

2. 选择一个地图厂商(例如百度),并定位你的位置(例如重庆)


3. 按中Alt键并使用鼠标框选,会用蓝色区域表示,点击prefetch


4. 然后开始生成了,是否生成下一层会提示你。

5. 最后生成的文件放在C:\Users\用户名<你的计算机用户名>\AppData\Local\GMap.NET\TileDBv5\en,那个Data.gmdb就是你的地图文件。

OK,整个离线地图就生成好了。
三.Demo代码
代码已经上传至http://code.google.com/p/ypmap/downloads/list:这里有点抱歉的地方,因为地图包实在太大了,上传又是龟速,因此没有上传地图包。
在运行Demo的时候,如果没有离线地图包会Crash掉,需要先生成离线地图包,并在App.Config中配置好,或者注释MapManagerLoader加载的代码。
先看下目录结构,主要包括下面几个文件:
引用GMAP.NET.Core.dll和GMAP.NET.WindowsPresentaion
离线地图包maps\Data.gmdb:比较大,大概有140MB的样子,还只是重庆渝中区 18~22层的地图。
配置文件App.Config: 主要是配置了地图启动的中心点,地图文件的路径
封装的地图显示控件代码GMapTrack.xaml和GMapTrack.xaml.cs:主要逻辑在里面
地图包加载代码MapManagerLoader:做了下简单封装

GMapTrack.xaml
主要包括了GMapControl这个控件,并且放了个进度条ProgressBar,是为了在加载图片的时候显示。

<UserControl x:Class="Demo.Offline.GMapTrack"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:gmap="clr-namespace:GMap.NET.WindowsPresentation;assembly=GMap.NET.WindowsPresentation">
<Grid> <GroupBox Name="mapgroup" Margin="0,0,50,0" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch">
<gmap:GMapControl x:Name="MainMap" MaxZoom="24" MinZoom="1"> </gmap:GMapControl>
</GroupBox>
<GroupBox x:Name="progressBar" Header="正在载入" Height="50" HorizontalAlignment="Right" Margin="0,0,12,12" VerticalAlignment="Bottom" Width="169">
<Grid>
<ProgressBar Margin="2" IsIndeterminate="True" />
</Grid>
</GroupBox>
</Grid>
</UserControl>

GMapTrack.cs
这里是关键, 仔细看:
1.首先从配置文件中读出地图中心点
this.MainMap.Position = new PointLatLng(lat,lng);
2.设置地图的显示区域,因为离线地图肯定是某个区域的,其他地方也显示不出来。
this.MainMap.BoundsOfMap = new RectLatLng(lat+2, lng+2, 2.765142, 4.120995);
3.设置地图的加载模式:缓存,并且设置地图为百度地图
this.MainMap.Manager.Mode = AccessMode.CacheOnly;
this.MainMap.MapProvider = GMapProviders.BaiduMap;
4.从配置文件中读取地图
MapManagerLoader.Instance.Load(ConfigurationManager.AppSettings["mapName"]);

private void MainMap_Loaded(object sender, RoutedEventArgs e)
{
double lat = double.Parse(ConfigurationManager.AppSettings["defaultLat"]);
double lng = double.Parse(ConfigurationManager.AppSettings["defaultLng"]);
this.MainMap.Position = new PointLatLng(lat,lng); // this.MainMap.MapProvider.Area = new RectLatLng(30.981178, 105.351914, 2.765142, 4.120995);
this.MainMap.BoundsOfMap = new RectLatLng(lat+2, lng+2, 2.765142, 4.120995);
this.MainMap.Manager.Mode = AccessMode.CacheOnly;
this.MainMap.MapProvider = GMapProviders.BaiduMap;
this.MainMap.DragButton = MouseButton.Left;
this.MainMap.Zoom = 13;
this.MainMap.MinZoom = 8;
this.MainMap.MaxZoom = 24; MapManagerLoader.Instance.Load(ConfigurationManager.AppSettings["mapName"]);
}

下面是GMapTrack.cs的完整代码:
MapManagerLoader.cs
一个单例模式的地图加载器,主要看这个代码,启动了个线程,并且调用了GMaps.Instance.ImportFromGMDB函数

public bool Load(string fileName)
{
if (!_isLoaded)
{
new Thread(() => GMaps.Instance.ImportFromGMDB(fileName)).Start();
_isLoaded = true;
}
return _isLoaded;
}

下面是MapManagerLoader.cs的完整代码:
其他代码没什么好讲的了,有WPF或C#基础的都应该很快能理解
原文链接:http://www.cnblogs.com/enjoyeclipse/archive/2013/01/29/2882254.html
深入理解最强桌面地图控件GMAP.NET ---离线地图的更多相关文章
- 深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView)
		
原文:深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView) 很久没有更新博客了,今天无事把GMAP.NET的代码又重新翻了翻,看到了街景地图的例子. 街景地图是谷歌最早提 ...
 - (转)深入理解最强桌面地图控件GMAP.NET --- 百度地图
		
原文地址:http://www.cnblogs.com/enjoyeclipse/archive/2013/01/14/2859026.html 前两篇介绍了GMAP.NET的一些基本功能和如何在自己 ...
 - 深入理解最强桌面地图控件GMAP.NET ---[更新]百度地图
		
之前写了篇博文,深入理解最强桌面地图控件GMAP.NET --- 百度地图 但是很多回复说百度地图更新了,不能显示百度的离线地图.之前承诺说是国庆节更新,最近才更新.代码已经提交到: https:// ...
 - 如何添加地图控件到Windows Phone 8的页面中
		
原文 如何添加地图控件到Windows Phone 8的页面中 本主题介绍了各种方法来添加一个地图控件到Windows Phone 8的项目.该地图控件在Windows Phone的SDK 8.0的库 ...
 - OpenLayers 3 之 地图控件(control)
		
OpenLayers 3 之 地图控件(control) 地图控件(control)是指地图上比例尺,缩略图,拉近拉远的按钮,滚动控制条等控件,默认控件有三个,可以禁用. OpenLayers 3 之 ...
 - Google地图接口API之地图控件集(五)
		
1.默认控件集 当使用一个标准的google地图,它的控件默认设置如下: (1). Zoom-显示一个滑动条来控制map的Zoom级别,如下所示:
 - Corelocation及地图控件学习笔记
		
Corelocation基本使用 在地图章节的学习中,首先要学的便是用户位置定位,因此我们首先要掌握Corelocation的使用.(在IOS8以前可以系统会直接请求授权,现在需要我们自己调用方式通知 ...
 - 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发
		
原文 http://blog.csdn.net/flexmapserver/article/details/5868882 用Windows Form进行ArcGIS Engine二次开发时常见的形式 ...
 - 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨
		
原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...
 
随机推荐
- iosOC/C不可变数组排序
			
//1.回顾C数组排序 int a[6] = {1,4,3,5,6,2}; //选择 for (int i =0; i<6-1; i++) { for (int j = i+1; j<6; ...
 - PHP修改记录
			
1. Http请求错误--20151123 参考网址:http://www.lvtao.net/dev/php-nginx-uploadfiy.html 是配置问题,修改php.ini文件: uplo ...
 - php 项目简单分类
			
项目分为:客户需求和自行研发. 商城项目:------------------------商城分类:单商家:商家就是网站所有者.如京东.凡客. 多商家:如淘宝 网站所有者不是卖家. ...
 - Bother
			
Bother Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ...
 - 指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效
			
以下内容来自互联网 (1)web: 需要在客户端配置文件的中增加connectionString节点,此节点描述了EntityClient的连接信息. 例如: 在web.config的中增加conne ...
 - Unity 的ICallHander在C#项目中实现注入
			
项目包引用: Install-Package Unity.Interception 创建项目的接口和其实类: public interface ICalculator { double Calcula ...
 - php-fpm参数优化【转】
			
转自 php-fpm参数优化 | Linux运维笔记https://blog.linuxeye.com/380.html php-fpm进程设置多少合适,设成动态还是静态? <lnmp一键安装包 ...
 - PHP数据库扩展mysqli的函数试题
			
1.mysqli链接数据库的方式是什么? 2.mysqli获取链接错误号的属性是什么? 3.mysqli获取链接错误信息的属性是什么? 4.mysqli执行sql语句的函数是什么? 5.mysqli获 ...
 - QML之使用Loader加载QML组件
			
呵呵,今晚是边看<裸婚时代>边敲代码,那电影看得...!钱真他妈不是个东西. 盼望Meego火起来. QML的Loader元素经常备用来动态加载QML组件.可以使用source属性或者so ...
 - 如何从Apache官网下载apache
			
apache服务器官网地址:http://httpd.apache.org/ linux版本下载比较容易,以windows版本,apache 2.4为例. 点击download 此处随便选一个提供商. ...