一 地图的加载与显示

关于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. 云原生周刊:OpenTofu 宣布正式发布 | 2023.1.15

    开源项目推荐 kubeaudit kubeaudit 是一个开源项目,旨在帮助用户对其 Kubernetes 集群进行常见安全控制的审计.该项目提供了工具和检查规则,可以帮助用户发现潜在的安全漏洞和配 ...

  2. KubeSphere 3.1.0 GA:混合多云走向边缘,让应用无处不在

    2021 年 4 月 29 日,KubeSphere 开源社区激动地向大家宣布,KubeSphere 3.1.0 正式发布!为了帮助企业最大化资源利用效率,KubeSphere 打造了一个以 Kube ...

  3. windows涉及所有协议及默认端口

    名称 协议 端口 说明 echo tcp/udp 7 echo服务 discard tcp/udp 9 用于连接测试的空服务 systat tcp/udp 11 链接端口系统状态 daytime tc ...

  4. MISC 高手进阶区 1-5

    1.reverseME 题目描述 无 附件 一个 .jpg 的图片 是一个flag字符串的图片镜像. reverse V-T If you reverse the order of a set of ...

  5. CodeQL学习笔记(1)-QL语法(逻辑连接词、量词、聚合词、谓词和类)

    最近在学习CodeQL,对于CodeQL就不介绍了,目前网上一搜一大把.本系列是学习CodeQL的个人学习笔记,根据个人知识库笔记修改整理而来的,分享出来共同学习.个人觉得QL的语法比较反人类,至少与 ...

  6. 3.12 Linux创建文件及修改文件时间戳(touch命令)

    既然知道了如何在 Linux 系统中创建目录,接下来你可能会想在这些目录中创建一些文件,可以使用 touch 命令. 需要注意的是,touch 命令不光可以用来创建文件(当指定操作文件不存在时,该命令 ...

  7. 推荐7款程序员常用的API管理工具

    前言 现如今API接口的编写与调试已成为开发人员不可或缺的技能,工欲善其事,必先利其器,选择一款优秀的API管理工具显得尤为重要.本文大姚给大家推荐7款程序员常用的API管理工具,大家可以根据自身和团 ...

  8. 一个基于 .NET 8.0 构建的简单、跨平台、模块化商城系统

    前言 今天给大家分享一个基于 .NET 8.0 构建的开源免费(MIT License).简单.跨平台.模块化的商城系统:Module Shop. 主要功能 销售:订单.物流. 内容:首页配置.评论. ...

  9. 【Azure 环境】从网络包中分析出TLS加密套件信息

    问题描述 在抓取到网络包之后,如何来获取TLS信息呢?比如使用的是是么加密套件呢? 因为在应用层面,获取的错误信息非常简单: An TLS 1.2 connection request was rec ...

  10. linux之Zip

    安装: apt-get) apt-get install zip yum) yum install -y unzip zip 语法: zip [选项] 压缩包名 源文件或源目录列表 注意,zip 压缩 ...