目录

  • 添加GMap引用
  • 下载GMap demo
  • 尝试一个测试程序
  • 下载离线地图
  • 使用离线模式读取地图
  • 加载高德地图
  • 获取WMTS
  • 坐标系转化
  • GMap常用地图操作
  • 自建地图服务器

添加GMap引用

下载GMap demo

包含GMap源码以及地图下载器(用于生成GMDB格式离线地图文件)
下载地址:https://archive.codeplex.com/?p=greatmaps
PS:部分网络下载速度较慢,稍后提供下载链接。

尝试一个测试程序

新建用户控件继承GMapControl
重新生成解决方案,拖控件。


只需要几行代码就可以加载谷歌地图

下载离线地图

适合内网环境,程序拷贝到另外的设备也可以直接使用,方便部署;后面还会给出自建地图服务器的方法,以便更高要求的开发需要。

打开官方的demo,运行Demo.WinfowsForms.exe下载地图;低配电脑打开较慢,请耐心等待。

选择谷歌中国地图;右键拖拽,滚轮放大缩小;

按住alt,鼠标左键框选需要下载的地图

右侧点击cache->prefretch selected area;
确认是否截取Zoom级别12的地图;点击是。

一般截取到16或17就够用了;不需要截取的zoom点击否;
prefetch完毕后点击Export导出gmdb文件,也就是离线地图。

使用离线模式读取地图

修改我们的代码

运行程序,可以看到未下载的地图区域是无法显示的,而下载的地图区域已经成功从本地读取了缓存。

加载高德地图

打开GMap源码,可以看到已经有很多MapProvider;可是没有高德,百度等国内地图的Provider;需要我们自己实现MapProvider。

查看源码,看不懂怎么办?没有关系,依葫芦画瓢;首先创建一个AMapProviderBase继承GMapProvider

然后创建AMapProvider继承AMapProviderBase
我们可以观察到这些Provider的实现类都很类似,最大的区别就是UrlFormat不一样;
这个UrlFormat代表什么?

我们复制一个UrlFormat到浏览器看一看:
static readonly string UrlFormat = “http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer/tile/{0}/{1}/{2}”;
观察代码发现{0},{1},{2}分包表示zoom,Y坐标和X坐标;
于是我们修改一下URL:
http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer/tile/1/1/2

这不就是我们要找的瓦片地图吗?

对没错!这个URL就是地图提供商提供的WMTS接口!也就是地图瓦片服务。如果我们拿到了WMTS接口,就意味着我们可以通过GMap访问市面上大部分地图服务器。

这里提供高德的WMTS接口,修改style可以调用不同的地图样式。(在网路上找了很多,这个版本的WMTS貌似是最新的,不过好像没有只显示路名的简图)

完成AMapProvider的编写后,打开GMapProviders类,新增一个高德地图的实例

运行一下,可以看到已经有了高德地图的选项。

下面就可以尽情下载高德地图了

应用程序使用离线地图也需要修改MapProvider

获取WMTS

有了WMTS接口就可以加载任意的地图

捷泰地图暗黑版

捷泰地图暖色版
注意部分地图提供商的服务需要注册申请key

坐标系转化

注意地图使用的坐标系,不同坐标系经纬度会有偏移:

名称 解释
WGS84 地心坐标系,国际通用坐标系
GCJ02 国测局坐标(火星坐标系),WGS84加密后的坐标系;GoogleChina地图、高德地图等国内地图使用
BD09 百度坐标系,GCJ02再次加密后的坐标系

网路上可以搜索到坐标原理以及不同坐标转换的工具类,在此不再赘述。

GMap常用地图操作

GMap地图控件结构:
底图

图层1→markers、routes…

图层2→markers、routes…

         //图层GMapOverlay bgLayer = new GMapOverlay("bgLayer");mapControl1.Overlays.Add(bgLayer);mapControl1.Overlays.Remove(bgLayer);//markerBitmap markerGreen = Image.FromFile("path") as Bitmap;PointLatLng point = new PointLatLng(32.261551, 118.339794);GMapMarker marker = new GMarkerGoogle(point, markerGreen);//tooltipMarkerTooltipMode mode = MarkerTooltipMode.Always;//标注一直显示Brush tooltipBackColor = new SolidBrush(Color.Transparent);marker.ToolTip = new GMapToolTip(marker);marker.ToolTipMode = mode;marker.ToolTipText = "xx路与xx路";//tooltip样式marker.ToolTip.Font = new Font("微软雅黑", 11);marker.ToolTip.Fill = tooltipBackColor;marker.ToolTip.Foreground = Brushes.Gray;marker.ToolTip.Stroke.Brush = tooltipBackColor;marker.ToolTip.Offset = new System.Drawing.Point(marker.Offset.X - (int)((float)marker.ToolTipText.Length / 2) * 15, marker.Offset.Y + 28);//marker加到图层bgLayer.Markers.Add(marker);//marker点击事件mapControl1.OnMarkerClick += new MarkerClick(Marker_Click_Event);//Route线路List<PointLatLng> points = new List<PointLatLng>();GMapRoute r = new GMapRoute(points, null);bgLayer.Routes.Add(r);

自定义Marker,实现图标实时切换,图标闪烁等功能

 public class GMapMarkerImage : GMapMarker{private Image image;public Image Image{get{return image;}set{image = value;if (image != null){this.Size = new Size(image.Width, image.Height);}}}public Pen Pen{get;set;}public Pen OutPen{get;set;}public GMapMarkerImage(PointLatLng point, Image image) : base(point){Size = new Size(image.Width, image.Height);Offset = new Point(-Size.Width / 2, -Size.Height / 2);this.image = image;Pen = null;OutPen = null;}public override void OnRender(Graphics g){if (image == null){return;}Rectangle rect = new Rectangle(LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height);Rectangle rectBlink = new Rectangle(LocalPosition.X-3, LocalPosition.Y -3, Size.Width+5, Size.Height+5);g.DrawImage(image, rect);if (Pen != null){g.DrawRectangle(Pen, rect);}if (OutPen != null){g.DrawEllipse(OutPen, rectBlink);}}public void UpdateImage(Image image){this.image = image;}public override void Dispose(){if (Pen != null){Pen.Dispose();Pen = null;}if (OutPen != null){OutPen.Dispose();OutPen = null;}base.Dispose();}}
//切换图片
marker.UpdateImage(bitmapGreen);
//闪烁 用定时器刷新
if (marker.OutPen == null)
{marker.OutPen = new Pen(Brushes.DeepSkyBlue, 5);
}
else
{marker.OutPen.Dispose();marker.OutPen = null;
}

可以实现的效果

自建地图服务器

通过自建地图服务器,可以实现自定义地图边界,手动绘制新增道路,随意调整地图样式,去除不必要的标注等功能。

GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。GeoServer是社区开源项目,可以直接通过社区网站下载。

WEB开发可以通过OpenLayers访问地图服务器。OpenLayers 是一个专为Web GIS 客户端开发提供的JavaScript 类库包,用于实现标准格式发布的地图数据访问。可以在 Web 上创建交互式地图,显示从任何来源加载的地图图块、矢量数据和标记。

安装GeoServer(需要JDK)

浏览器输入http://localhost:8089/geoserver/web/进入管理页面

GeoServer支持多种格式的地图,可以从网路上下载或购买。
推荐地图编辑软件:ArcMap、MapInfo


发布图层

自定义地图样式


WMTS服务

地图预览,比第三方地图服务器简洁了很多,多余的区域不显示,没有杂乱的标注和图标,可以充分个性化。

WMS接口

WMTS接口
“http://{your ip&port}/geoserver/gwc/service/wmts?layer={your mapName}&tilematrixset=EPSG:4326&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/png&TileMatrix=EPSG:4326:{zoom}&TileCol={X}&TileRow={Y}”;

程序展示

C# .NET winform地图开发GMap离线地图在线地图自建地图服务器相关推荐

  1. 地图开发技术报告(百度地图)

    地图开发技术报告 文章目录 地图开发技术报告 需求描述 目前了解信息 技术筹备方案--百度地图api 基本介绍 主要功能 基础demo 1. 地图展示 2. 站点路线显示 技术评价 结论 结论 需求描 ...

  2. 关于google地图api3的离线和在线开发(画带箭头的直线,指定范围,搜索,计算距离)

    最近因为开发的需要,要做一个离线的google地图.并且能够加载google地图的一些特效.例如:地图的标记,计算距离,获取标记的经纬度,画带有箭头的直线,获取指定范围的数据等等.在这里我总结了很多开 ...

  3. 离线地图开发--BigeMap(离线地图服务器构建,支持百度、谷歌、高德等地图)

    前言: 目前高德地图以及百度谷歌等地图对Web端离线功能支持不太友好(甚至没有离线地图功能),这致使我们在进行内网服务器使用的地图开发时非常的不便利,因此在进行离线地图开发时我们通常选择引入第三方地图 ...

  4. 【web百度离线地图开发】原生实现百度地图离线版速览

    需求如下,在基于在线地图的基础上展现离线地图 //在线用以下插件展示"vue-baidu-map": "^0.21.22", vue中展示离线地图 第一步:把配 ...

  5. [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题

        最近做android百度地图,但是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--只显示网格而没有显示地图,网络 ...

  6. vue高德地图开发,使用天地图卫星地图瓦片,解决不生效问题

    高德地图开发文档多,api更多,但是卫星地图不全:天地图是政企地图,恰好相反.项目中结合二者来开发,踩了很多坑,在此记录. 项目是vue2框架,过去有一段时间,只记录下关键代码,有三种使用方式,建议先 ...

  7. 高德地图开发(一、引入地图)

    vue调用高德地图(一.引入高德地图) 1.原生js使用 1.1.引入js 1.2.设置地图容器 1.3.设置地图初始位置 项目可能要用到3D地图,而百度地图不支持,因此开始了解高德地图,为了以后方便 ...

  8. Java ME引路蜂地图开发示例:第一个地图应用

    下面的代码显示中国南京地图 //------------------------------------------------------------------------------ // CO ...

  9. qt linux地图控件,Qt编写地图综合应用6-百度在线地图

    一.前言 百度在线地图的应用老早就做过,后面经过不断的完善才到今天的这个程序,除了基本的可以载入地图并设置一些相关的属性以外,还增加了各种js函数直接异步加载数据比如动态添加点.矩形.圆形.行政区划等 ...

最新文章

  1. 干货 :数据可视化的10个关键术语
  2. centos + php+ unixodbc + FreeTDS 配置
  3. python调包侠_拒绝调包侠,不需要高级算法和数据结构技巧
  4. goland 创建工程(go mod)singo
  5. C++ 标准库类型 vector
  6. Java并发编程—ThreadLocal底层原理
  7. Cisco 胖AP和瘦AP的区别
  8. xampp浏览php出现乱码,dvwa+xampp搭建显示乱码的问题及解决方案
  9. java复习题_java习题-(static)
  10. es6解构--简化代码
  11. OTSU大津法对图像二值化
  12. 94. autoload
  13. 给妹子讲python_给妹子讲python-S01E01好用的列表
  14. 关于数据库、数据仓库、数据湖、数据中台概念和区别
  15. 一个简单的C语言程序是怎么来的呢?
  16. python 音频数据归一化
  17. 大学物理 复习指导、公式推导精简过程、结论归纳 第二章 牛顿定律
  18. 组合泛化太难?试试解析式学习,100%准确率!
  19. 国产手游开源引擎Beyond Engine简介 [附视频]
  20. 分享同城小程序怎么做_同城跑腿小程序开发基本功能

热门文章

  1. 测试开发工程师必读经典好书清单,抽奖赠书送福利!
  2. 抖音运营全攻略(思维导图)
  3. AutoCAD .Net 遍历组
  4. python分隔符是干啥_python文件路径分隔符的详细分析
  5. 终极移动应用营销教程:App海外营销策略连载(1)
  6. python个人所得税怎么写分录_请问计提个人所得税如何做会计分录
  7. ...世界最著名的50大美景...
  8. 七年级计算机第十四课编排表格,浙教版 信息技术七年级上 第十四课 编辑数据表 教案设计.doc...
  9. 学习编程学历重要吗?
  10. Supervisor 为服务创建守护进程