一 地图的加载与显示

关于GMap的介绍与使用可以看我以前的文章:

GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件

GMap.Net是.Net下一个地图控件,可以基于Http协议加载各个公司的地图,如Google,Bing,ArcGIS的,主要原理是通过解析各个公司的地图服务的URL,传入相应的参数得到对应的切片底图(Tiled map),如一个高德地图的GMapProvider的实现如下:

using System;
using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.Projections; namespace GMapProvidersExt
{
public abstract class AMapProviderBase : GMapProvider
{
public AMapProviderBase()
{
MaxZoom = null;
RefererUrl = "http://www.amap.com/";
//Copyright = string.Format("{0} 高德 Corporation, {0} NAVTEQ, {0} Image courtesy of NASA", DateTime.Today.Year);
} public override PureProjection Projection
{
get { return MercatorProjection.Instance; }
} GMapProvider[] overlays;
public override GMapProvider[] Overlays
{
get
{
if (overlays == null)
{
overlays = new GMapProvider[] { this };
}
return overlays;
}
}
} public class AMapProvider : AMapProviderBase
{
public static readonly AMapProvider Instance; readonly Guid id = new Guid("EF3DD303-3F74-4938-BF40-232D0595EE88");
public override Guid Id
{
get { return id; }
} readonly string name = "AMap";
public override string Name
{
get
{
return name;
}
} static AMapProvider()
{
Instance = new AMapProvider();
} public override PureImage GetTileImage(GPoint pos, int zoom)
{
try
{
string url = MakeTileImageUrl(pos, zoom, LanguageStr);
return GetTileImageUsingHttp(url);
}
catch (Exception ex)
{
return null;
}
} string MakeTileImageUrl(GPoint pos, int zoom, string language)
{
var num = (pos.X + pos.Y) % 4 + 1;
//string url = string.Format(UrlFormat, num, pos.X, pos.Y, zoom);
string url = string.Format(UrlFormat, pos.X, pos.Y, zoom);
return url;
} //static readonly string UrlFormat = "http://webrd04.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=7";
static readonly string UrlFormat = "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={0}&y={1}&z={2}";
}
}

如下为高德地图的显示:

通过类似的办法,可以实现加载Google、腾讯的地图,百度的地图也可以加载,但是因为百度采用自己的加偏算法(BD-09),导致加载的地图显示偏差大,当在不同的地图间切换时,无法正确显示。。

二 Marker的显示与操作

GMapMarker为地图上要显示的数据元素,继承GMapMarker可以实现自己想要的地图元素效果,如下显示自定义元素的样式:

关于自定义Marker,可以看这篇文章:GMap.Net开发之自定义Marker,通过C# GDI+可以实现自己想要的各种图标样式和显示效果。

三 图形的显示与操作

在地图上手动画各种多边形,来实现类似“电子围栏”的功能,可以使用GMapPolygon。

如下为我实现的圆形(Circle)、矩形(Rectangle)、多边形(Polygon)和折线段(Polyline):

关于画多边形,可以看我以前的这篇文章:GMap.Net开发之在地图上添加多边形,手动画多边形时可以实时查看效果,画完的多边形随地图放大(缩小)而放大(缩小)。

实现类似百度地图“测距”的功能:

通过点、线和提示框可以实现类似百度地图的“测距”功能,点击红色的“X”,实现删除这次测距。

四 地址解析与路径查找

地址解析:GMap中的地址解析主要用到GeocodingProvider中的如下方法:

//根据关键字得到一组坐标
GeoCoderStatusCode GetPoints(string keywords, out List<PointLatLng> pointList); //根据关键字得到一个坐标
PointLatLng? GetPoint(string keywords, out GeoCoderStatusCode status); //根据坐标得到一组地址
GeoCoderStatusCode GetPlacemarks(PointLatLng location, out List<Placemark> placemarkList); //根据坐标得到一个地址
Placemark GetPlacemark(PointLatLng location, out GeoCoderStatusCode status);

路径查找:GMap中的路径查找主要用到RoutingProvider的如下方法:

//avoidHighways:是否避免走高速公路
//walkingMode:是否步行
//zoom:查找路径时的zoom,貌似越大路径越准确 //根据起止点start、end和当前的zoom查找路径
MapRoute GetRoute(PointLatLng start, PointLatLng end, bool avoidHighways, bool walkingMode, int Zoom); //根据出发点地址start、目的点地址end和当前的zoom查找路径
MapRoute GetRoute(string start, string end, bool avoidHighways, bool walkingMode, int Zoom);

接口使用方式:

RoutingProvider rp = mapControl.MapProvider as RoutingProvider;
GeocodingProvider gp = mapControl.MapProvider as GeocodingProvider;

GeocodingProvider和RoutingProvider都是通过当前的MapProvider转换得到的,也就是说如果要在加载的地图上实现地址解析与路径查找,就需要实现加载地图的三大接口:

GMapProvider接口:用于显示地图。

RoutingProvider:用于路径查找。

GeocodingProvider:用于地址解析。

关于地址解析与路径查找的使用:GMap.Net开发之地址解析与路径查找

五 坐标纠偏

中国国内的地图都是经过“加偏”处理的,所以被称为“火星坐标”。

现在主流的坐标系是WGS84坐标系,即地球坐标系,国际上通用的坐标系,经过国家测绘局要求采用GCJ02算法加偏后即为“火星坐标”,百度在“火星坐标”的基础上又采用了自己的加偏算法BD09加偏后,得到“百度坐标”,国内的搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的。

而现在Google中国、腾讯和高德采用的是WGS84经过GCJ02算法加偏后的“火星坐标”。

通过GPS设备采集到的坐标一般是没有经过“加偏”处理的WGS84坐标,所以放到国内地图上显示会有误差,可以把采集到的坐标也通过加偏算法加偏后再放到地图上显示,就可以得到对应的地点。

如下是经过加偏算法加偏后处理的情况:

如上使用Google中国地图,现在采用的算法在地图1-16级可以基本没有误差,误差很小,当然和采集设备采集的点的准确度也有关系。

当地图放大超过16级时候,就出现了误差,但误差也就在几米:

六 中国行政区域边界

有中国各个省市的边界数据,就可以实现行政区域的显示:

如下显示江苏省和南京市的行政边界:

缓存到本地的离线地图数据就可以作为地图数据包使用。

八 离线方案

离线地图下载,CS或BS离线地图使用:

百度谷歌离线地图解决方案(离线地图下载)

九 项目地址

项目代码已经开源到Github。

项目地址:https://github.com/luxiaoxun/MapDownloader

十 参考链接

https://greatmaps.codeplex.com/

原文地址:

作者:阿凡卢
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

[转]基于GMap.Net的地图解决方案的更多相关文章

  1. 基于GMap.Net的地图解决方案

    一 地图的加载与显示 关于GMap的介绍与使用可以看我以前的文章: GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件 GMap.Net是.Net下一个地图控件,可以基于Ht ...

  2. 用Gmap开发winform地图应用程序(一)Gmap介绍与添加

    GMap.NET是一个强大的免费开源.NET组件.该组件允许用户加载Google.雅虎.必应.街景等地图.用户可以在这些地图上进行点的标记.路线规划.区域操作.GMap.NET应用于Windows F ...

  3. 基于GMap.NET地图下载器的开发和研究

    基于GMap.NET地图下载器的开发和研究 软件下载地址:https://pan.baidu.com/s/1ay0aOm3fiZ35vlfD8kFYFw 1.地图浏览功能 可以浏览谷歌地图.百度.ar ...

  4. 基于gmap.net制作离线地图下载器

    网上已有大量文章介绍gamp.net和离线下载相关的文章了.我就不在介绍gmap相关的文章了,这里着重介绍一下下载相关原理.其实gmap.net本身已自带下载工能,只是离线图片下载到sqlit中,现将 ...

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

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

  6. 支持WEB、Android、IOS的地图解决方案

    转自原文 支持WEB.Android.IOS的地图解决方案 工具链 GIS工具集 OpenGeo Suite 包含PostGIS, GeoServer, GeoWebCache, OpenLayers ...

  7. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  8. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  9. 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)

    相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...

  10. 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)

    前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...

随机推荐

  1. Top100题(上)

    Top100(上) 散列 1. 两数之和 struct MyListNode { int val; int pos; struct MyListNode *next; }; // 散列表 typede ...

  2. Python不同数据结构的元素频率统计

    1.list的词频统计 这里利用Python字典的键值对来进行统计.逻辑就是,根据list的内容生成一个字典,把要统计的列表元素的值作为字典的key,而后给字典中对应的key进行赋值,赋值方法采用字典 ...

  3. 记录一个vscode无法ssh树莓派,但是mobaxterm可以ssh登录的问题

    一.为什么会遇到这个问题 帮别人开发一个树莓派小车的时候,买了一个新的树莓派3B,回来安装好桌面系统之后开启了ssh功能,便想开始使用vscode来ssh开发,省的后续一直要插着屏幕开发,很麻烦.但是 ...

  4. Swagger注解中带有“/”导致SwaggerUI显示异常

    日常开发中一直使用swagger作为接口文档工具使用,这次在使用过程中发现一个问题. 正常情况下显示如下图 代码配置如下图 Controller Model 如果在Swagger注解中使用" ...

  5. 100 款支持 .NET 多版本的强大 WPF 控件库

    前言 推荐一款集成了超过100款控件的流行 XAML 控件库,同时提供了一系列常用的 .NET 帮助类-CookPopularUI.它可以简化开发流程,让我们能够更加专注于核心业务逻辑的实现. 让我们 ...

  6. 3、oracle内存讲解

    oracle数据库实例(instance) 数据库打开以后,会生成一个内存结构和一堆进程 内存和进程:就是oracle的实例instance oracle数据库实例结构: 用户是通过连接实例来访问数据 ...

  7. 腾讯AICR : 智能化代码评审技术探索与应用实践(下)

  8. select2的搜索框不能输入内容

    select2的搜索框不能输入内容 原因:原来是模态对话框强制使自己处于焦点状态,导致select2的搜索框无法获取焦点所致. 解决办法:在初始化中重写模态对话框的enforceFocus函数 $.f ...

  9. Mongodb4.4安装与使用

    MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能 最丰富,最像关系数 ...

  10. Laravel环境搭建之HomeStead

    开发laravel,官方推荐使用HomeStead虚拟环境进行搭建. Linux: 1. 安装virtualbox(https://www.virtualbox.org/) 1)可以找到可供下载的镜像 ...