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

一 地图的加载与显示

关于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级时候,就出现了误差,但误差也就在几米:

六 中国行政区域边界

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

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

PS:现在手上有全国的各个省、市、县区的行政边界。

七 地图下载与缓存

GMap会自动在本地缓存一些访问过的地图,默认是不删除的,所以当访问的地图区域越多时,本地的地图缓存也就越大。

当然你也可以手动下载地图到本地数据库(支持SQLite、MySQL、MsSQL、PostgreSQL),如下所示:

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

八 离线方案

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

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

 

联系方式:站内信,QQ:599965176

 

 参考:

https://greatmaps.codeplex.com/

 

作者:阿凡卢

出处:http://www.cnblogs.com/luxiaoxun/

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

http://www.cnblogs.com/luxiaoxun/p/3802559.html

时间: 2024-11-02 00:27:13

基于GMap.Net的地图解决方案的相关文章

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

离线地图解决方案,除了买地图数据,使用专业的ArcGIS来做外,也可以使用GMap.Net来做. 关于GMap的开发教程,可以看我以前的文章:基于GMap.Net的地图解决方案 使用了GMap一年了,也有了一些积累,开发了一个可以下载ArcGIS.百度.谷歌.高德.腾讯SOSO.天地图.Here等地图的地图下载器. 百度和google地图加载显示如下: 百度普通地图: 百度混合地图: 谷歌普通地图: 谷歌混合地图: 从目前的情况来看,百度的普通的地图数据是更新最快的,但是有些小地方没有卫星地图,

英特尔:基于开放标准的云解决方案

本文讲的是英特尔:基于开放标准的云解决方案,目前,数字化浪潮正在席卷整个世界,企业数据呈现激增之势,在这种背景下,云计算成为管理日益增长的 IT 服务需求的关键战略.云计算为传统的静态数据中心模式提供了一种动态的替代方案.它提供了具有超强可伸缩性的计算资源和在线存储,使企业能够迅速.有效地开发和启动产品和服务,并分配资源来满足要求. 自动化.互通.客户感知 为了帮助企业充分利用这种模式,英特尔制定了一个未来的云计算愿景.英特尔的云愿景完全可被视为一个构建理想云计算平台的具体行动纲领,或是方向明晰

基于CloudStack的旅行社电子商务解决方案

基于CloudStack的旅行社电子商务解决方案 龙斌 周晴伦 对国内旅行社开展电子商务面临的问题进行分析,提出一种基于开源云平台的旅行社电子商务创新模式.该模式并不是云计算加电子商务的简单叠加,而是在成熟度最高的开源云平台CloudStack的基础上,设计出能对异构云平台进行整合的整合开发云,进而构建出旅行社电子商务公共服务平台,实现对平台内外的旅行社上游产品资源以及下游的客户信息的整合,旅行社可以根据自身的需求选择不同的商业模式,从而获取到高质量.低成本的电子商务服务,达到改进整个旅游产业运

基于云计算的呼叫中心解决方案的16个优势

呼入的客户电话是企业业务成功的关键,因此企业需要充分利用每一个电话的互动机会.幸运的是,如今的呼叫中心解决方案可以提供先进的技术,有助于提高客户体验.虽然传统的基于硬件的系统可能是复杂和昂贵的,企业还有另一个选择,就是采用基于云计算的呼叫中心解决方案. 基于云计算的呼叫中心旨在降低成本,增加高级功能,提升代理性能并改善客户服务.各种类型和规模的企业及其客户将受益于广泛的工具和服务.以下列表突出显示了托管呼叫中心解决方案的16个优势: 1.调整需求.通过基于云计算的呼叫中心,可以利用为用户实现新功

Tine 2.0 Maischa(2011/05)Build 1基于Web的群件解决方案

Tine 是一个基于Web的群件解决方案,侧重于实用性和正确性.为了实现这些目标,该项目采用的可用性专家和涵盖了大部分的代码单元测试.Tine 2.0包含支持联系人,任务,http://www.aliyun.com/zixun/aggregation/8856.html">客户关系管理,网络电话集成, timetracker ,以及灵活的权限管理系统. 此次更新重点在在于提供整合第三方应用,增强可用性和管理功能. Tine 2.0 Maischa (2011/05) Build 1更新日志

几种常见的基于Lucene的开源搜索解决方案对比

一  直接使用 Lucene  ( http://lucene.apache.org ) 说明:Lucene 是一个 JAVA 搜索类库,它本身并不是一个完整的解决方案,需要额外的开发工作 优点:成熟的解决方案,有很多的成功案例.apache 顶级项目,正在持续快速的进步.庞大而活跃的开发社区,大量的开发人员.它只是一个类库,有足够的定制和优化空间:经过简单定制,就可以满足绝大部分常见的需求:经过优化,可以支持 10亿+ 量级的搜索. 缺点:需要额外的开发工作.所有的扩展,分布式,可靠性等都需要

基于NFV的虚拟化WiFi解决方案出炉

伴随软件定义网络(Software-defined networking,SDN)和网络功能虚拟化(Network Function Virtualization,NFV)等新技术应用的逐步深化,为全球通信服务提供商(CSP)在网络领域的进一步创新带来了新的拓展平台. 近日,Intracom Telecom表示其最新的基于NFV的Wi-Fi解决方案已经出炉,该解决方案旨在有效帮助CSP能够按需部署虚拟化接入服务,最大限度的减少服务投放市场的时间,以及降低他们的前期投资. 据悉,该解决方案是完全符

基于Android实现百度地图定位过程详解_Android

一.问题描述 LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位.地图.导航等,首先我们看如何基于百度地图实现定位功能 二.配置环境 1.注册密钥:地址http://developer.baidu.com/map/ 2.下载定位SDK,并导入SDK如图所示:   三.编写MyApplication类 编写MyApplication类,为了使用方便我们可以将实现定位的方法封装的Application组件中 封装下列方法 1.  获取定位信息

基于Android实现百度地图定位过程详解

一.问题描述 LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位.地图.导航等,首先我们看如何基于百度地图实现定位功能 二.配置环境 1.注册密钥:地址http://developer.baidu.com/map/ 2.下载定位SDK,并导入SDK如图所示: 三.编写MyApplication类 编写MyApplication类,为了使用方便我们可以将实现定位的方法封装的Application组件中 封装下列方法 1.  获取定位信息--