深入理解最强桌面地图控件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,是为了在加载图片的时候显示。

  1. <UserControl x:Class="Demo.Offline.GMapTrack"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:gmap="clr-namespace:GMap.NET.WindowsPresentation;assembly=GMap.NET.WindowsPresentation">
  5. <Grid>
  6.  
  7. <GroupBox Name="mapgroup" Margin="0,0,50,0" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch">
  8. <gmap:GMapControl x:Name="MainMap" MaxZoom="24" MinZoom="1">
  9.  
  10. </gmap:GMapControl>
  11. </GroupBox>
  12. <GroupBox x:Name="progressBar" Header="正在载入" Height="50" HorizontalAlignment="Right" Margin="0,0,12,12" VerticalAlignment="Bottom" Width="169">
  13. <Grid>
  14. <ProgressBar Margin="2" IsIndeterminate="True" />
  15. </Grid>
  16. </GroupBox>
  17. </Grid>
  18. </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.设置地图的加载模式:缓存,并且设置地图为百度地图

  1. this.MainMap.Manager.Mode = AccessMode.CacheOnly;
  1. this.MainMap.MapProvider = GMapProviders.BaiduMap;

4.从配置文件中读取地图

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

下面是GMapTrack.cs的完整代码:

MapManagerLoader.cs

一个单例模式的地图加载器,主要看这个代码,启动了个线程,并且调用了GMaps.Instance.ImportFromGMDB函数

  1. public bool Load(string fileName)
  2. {
  3. if (!_isLoaded)
  4. {
  5. new Thread(() => GMaps.Instance.ImportFromGMDB(fileName)).Start();
  6. _isLoaded = true;
  7. }
  8. return _isLoaded;
  9. }

下面是MapManagerLoader.cs的完整代码:

其他代码没什么好讲的了,有WPF或C#基础的都应该很快能理解

原文链接:http://www.cnblogs.com/enjoyeclipse/archive/2013/01/29/2882254.html

深入理解最强桌面地图控件GMAP.NET ---离线地图的更多相关文章

  1. 深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView)

    原文:深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView) 很久没有更新博客了,今天无事把GMAP.NET的代码又重新翻了翻,看到了街景地图的例子. 街景地图是谷歌最早提 ...

  2. (转)深入理解最强桌面地图控件GMAP.NET --- 百度地图

    原文地址:http://www.cnblogs.com/enjoyeclipse/archive/2013/01/14/2859026.html 前两篇介绍了GMAP.NET的一些基本功能和如何在自己 ...

  3. 深入理解最强桌面地图控件GMAP.NET ---[更新]百度地图

    之前写了篇博文,深入理解最强桌面地图控件GMAP.NET --- 百度地图 但是很多回复说百度地图更新了,不能显示百度的离线地图.之前承诺说是国庆节更新,最近才更新.代码已经提交到: https:// ...

  4. 如何添加地图控件到Windows Phone 8的页面中

    原文 如何添加地图控件到Windows Phone 8的页面中 本主题介绍了各种方法来添加一个地图控件到Windows Phone 8的项目.该地图控件在Windows Phone的SDK 8.0的库 ...

  5. OpenLayers 3 之 地图控件(control)

    OpenLayers 3 之 地图控件(control) 地图控件(control)是指地图上比例尺,缩略图,拉近拉远的按钮,滚动控制条等控件,默认控件有三个,可以禁用. OpenLayers 3 之 ...

  6. Google地图接口API之地图控件集(五)

    1.默认控件集 当使用一个标准的google地图,它的控件默认设置如下: (1). Zoom-显示一个滑动条来控制map的Zoom级别,如下所示:

  7. Corelocation及地图控件学习笔记

    Corelocation基本使用 在地图章节的学习中,首先要学的便是用户位置定位,因此我们首先要掌握Corelocation的使用.(在IOS8以前可以系统会直接请求授权,现在需要我们自己调用方式通知 ...

  8. 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发

    原文 http://blog.csdn.net/flexmapserver/article/details/5868882 用Windows Form进行ArcGIS Engine二次开发时常见的形式 ...

  9. 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

    原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...

随机推荐

  1. 编译cvaux错误的原因

    引用:   http://www.cnblogs.com/oskycar/archive/2009/08/30/1556920.html VS2013 在debug模式下编译cvaux时会提示三个错误 ...

  2. Xbox360自制系统GOD包安装教程

    1.准备工作 U盘或移动硬盘一个,已下载好的GOD包,本教程用一个32G的U盘和游戏<猎天使魔女>为例. 右击U盘,属性,查看你的U盘是否为FAT32格式. 如果是FAT32格式,则可直接 ...

  3. Linux下编译C代码,出现tan函数报错的情况

    undefined reference to `tan' 但是已经包含了头文件 <math.h>了,可还是报错,说是找不到tan 这个问题的原因不是很清楚, 但是网上给出的方案,就是编译的 ...

  4. 授权给指定用户,使用navicat在其他ip都可以连接linux服务器上的mysql库

    grant all privileges on ao.* to 'tony'@'localhost' identified by '123456'; 在ao库中所有表. 同意 ,授权     给ton ...

  5. 递归与DP

    每一个递归问题都可以改成DP来做...只不过DP会浪费一些空间罢了..DP只是把之前的结果存起来以防再算一遍罢了.....

  6. xib storyboard

    initWithNibName加载xib或者storyboard BLEViewController *controller = [[BLEViewController alloc] initWith ...

  7. asp.net textbox控件readonly为true时,后台取值的问题

    如题,在后台通过textbox.Text方式取值为空,不论你默认值是否是空,如想要获得,需通过request.Form[""]的方式.

  8. [QML] Connections元素介绍

    一个Connections对象创建一个了一个QML信号的连接.在QML中,我们连接信号通常是用使用"on<Signal>"来处理的,如下所示: MouseArea { ...

  9. make TARGET_PRODUCT=am335xevm OMAPES=4.x rowboat_clean 出现sgx相关的错误

    这些错误是一些链接错误,由于地址变更导致的软链接不对.所以只要更改下软链接的具体地址就可以.

  10. error: invalid 'asm': invalid operand for code 'w'

    google 出结果 http://stackoverflow.com/questions/15623609/including-curl-into-the-android-aosp ........ ...