深入理解最强桌面地图控件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接口的基础上,进行二次开发,封装 ...
随机推荐
- 编译cvaux错误的原因
引用: http://www.cnblogs.com/oskycar/archive/2009/08/30/1556920.html VS2013 在debug模式下编译cvaux时会提示三个错误 ...
- Xbox360自制系统GOD包安装教程
1.准备工作 U盘或移动硬盘一个,已下载好的GOD包,本教程用一个32G的U盘和游戏<猎天使魔女>为例. 右击U盘,属性,查看你的U盘是否为FAT32格式. 如果是FAT32格式,则可直接 ...
- Linux下编译C代码,出现tan函数报错的情况
undefined reference to `tan' 但是已经包含了头文件 <math.h>了,可还是报错,说是找不到tan 这个问题的原因不是很清楚, 但是网上给出的方案,就是编译的 ...
- 授权给指定用户,使用navicat在其他ip都可以连接linux服务器上的mysql库
grant all privileges on ao.* to 'tony'@'localhost' identified by '123456'; 在ao库中所有表. 同意 ,授权 给ton ...
- 递归与DP
每一个递归问题都可以改成DP来做...只不过DP会浪费一些空间罢了..DP只是把之前的结果存起来以防再算一遍罢了.....
- xib storyboard
initWithNibName加载xib或者storyboard BLEViewController *controller = [[BLEViewController alloc] initWith ...
- asp.net textbox控件readonly为true时,后台取值的问题
如题,在后台通过textbox.Text方式取值为空,不论你默认值是否是空,如想要获得,需通过request.Form[""]的方式.
- [QML] Connections元素介绍
一个Connections对象创建一个了一个QML信号的连接.在QML中,我们连接信号通常是用使用"on<Signal>"来处理的,如下所示: MouseArea { ...
- make TARGET_PRODUCT=am335xevm OMAPES=4.x rowboat_clean 出现sgx相关的错误
这些错误是一些链接错误,由于地址变更导致的软链接不对.所以只要更改下软链接的具体地址就可以.
- error: invalid 'asm': invalid operand for code 'w'
google 出结果 http://stackoverflow.com/questions/15623609/including-curl-into-the-android-aosp ........ ...