目录

  • 1.概述
    • 1.1 项目背景
    • 1.2 传送门
  • 2.技术选型:GMap.NET
  • 3.底图功能实现
    • 2.1 方式一:在线地图(以高德为例)
    • 2.2 greatmaps生成底图(瓦片地图)
  • 3.搭建主程序,实现几个最基本功能
    • 3.1 定位到具体坐标
    • 3.2 双击添加标记点marker
    • 3.3 绘制多边形
    • 3.4 搜索地址
    • 3.5 坐标转换:CGCS2000 to WGS84

1.概述

1.1 项目背景

因为工作内容调整,以后可能要开发GIS类产品,为了摸索一下GIS开发的有关知识,于是开发了一个GIS类程序小框架,在这里做一下学习笔记。

1.2 传送门

从零开始搭建一个GIS开发小框架(二)——扩展功能:绘制多边形
从零开始搭建一个GIS开发小框架(三)——扩展功能:搜索地址名称
从零开始搭建一个GIS开发小框架(四)——扩展功能:CGCS2000坐标转换到WGS84
从零开始搭建一个GIS开发小框架(五)——GMap.Net组件WPF版本使用体验
从零开始搭建一个GIS开发小框架(六)——GMap.Net组件WPF版本地块单元基本操作一套
从零开始搭建一个GIS开发小框架(七)——GMap.Net组件WPF版本加载POI性能测试
从零开始搭建一个GIS开发小框架(八)——GMap.Net组件WPF版本资源目录树效果
从零开始搭建一个GIS开发小框架(九)——GMap.Net组件WPF版本进度条效果

凑满这些功能,煎饼果子一套就齐全了,实乃居家旅行,论文私活,必备良药。

2.技术选型:GMap.NET


GMap.NET是什么?

来看看它的官方说明:GMap.NET is great and Powerful, Free, cross platform, open source .NET control. Enable use routing, geocoding, directions and maps from Coogle, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac, Yendux, Mapy.cz, Maps.lt, iKarte.lv, NearMap, OviMap, CloudMade, WikiMapia, MapQuest in Windows Forms & Presentation, supports caching and runs on windows mobile!

GMap.NET是一个强大、免费、跨平台、开源的.NET控件,它在Windows Forms 和WPF环境中可以基于Http协议加载各个公司的地图,例如:Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等地图,主要原理是通过解析各个公司的地图服务的URL,传入相应的参数得到对应的切片底图(Tiled map),并可以实现寻找路径、地理编码以及地图展示功能,并支持缓存和运行在Mobile环境中。

3.底图功能实现

2.1 方式一:在线地图(以高德为例)

高德在线地图显示效果:

高德地图的GMapProvider类的实现:

using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.Projections;
using System;namespace GMap
{public abstract class GaodeMapProviderBase : GMapProvider//, GeocodingProvider{private string ClientKey = "这个Key在高德开发平台可以免费申请";public GaodeMapProviderBase(){MaxZoom = null;RefererUrl = "http://www.amap.com/";Copyright = string.Format("©{0} Corporation, ©{0} 高德地图, ©{0}", DateTime.Today.Year);}public override PureProjection Projection{get{return MercatorProjection.Instance;}}private GMapProvider[] overlays;public override GMapProvider[] Overlays{get{if (overlays == null){overlays = new GMapProvider[] { this };}return overlays;}}}public class GaodeMapProvider : GaodeMapProviderBase{public static readonly GaodeMapProvider Instance;private readonly Guid id = new Guid("608748FC-5FDD-4d3a-9027-356F24A755E5");public override Guid Id{get{return id;}}private readonly string name = "GaoDe";public override string Name{get{return name;}}static GaodeMapProvider(){Instance = new GaodeMapProvider();}public override PureImage GetTileImage(GPoint pos, int zoom){string url = MakeTileImageUrl(pos, zoom, LanguageStr);return GetTileImageUsingHttp(url);}private 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;}private 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}";}}

主程序里的GMap.Net控件通过load方法调用地图资源

private void load()
{MainMap.MapProvider = GaodeMapProvider.Instance;       //高德//MainMap.MapProvider = BaiduMapProvider.Instance;  //百度MainMap.CacheLocation = @"D:\GisMap";MainMap.Manager.Mode = AccessMode.ServerAndCache;MainMap.MinZoom = 8;                                                     //最小比例MainMap.MaxZoom = 18;                                                    //最大比例MainMap.Zoom = 13;                                                       //当前比例MainMap.ShowCenter = false;                                              //不显示中心十字点MainMap.DragButton = MouseButtons.Left;//高德35.014532, 110.998649//百度66.286011,21.677210 坐标有问题MainMap.Position = new PointLatLng(30.594479, 114.304233);   //lat是纬度,lng是经度  武汉MainMap.Overlays.Add(overlay);                              //将图层添加到地图MainMap.Overlays.Add(polygonAuxiliaryLinelay);  //将图层添加到地图//MainMap.HelperLineOption = HelperLineOptions.ShowAlways;this.lbZoomStatus.Text = MainMap.Zoom.ToString();
}

2.2 greatmaps生成底图(瓦片地图)

用地图下载器(用于生成GMDB格式离线地图文件)greatmaps虽然下载到源码,但是编译运行报错,我用他自带的bin目录下的exe运行打开下载器。

type选OpenCycleMap,mode选ServerAndCache

按住alt,鼠标左键框选需要下载的地图,进行地图下载,点击Prefetch selected area按钮。我选择是下载到18或者20,速度有点慢,慢慢等。

下载完毕后导出:

导出后得到gmdb文件:

主程序里的GMap.Net控件通过load方法调用地图资源

string mapPath = System.Windows.Forms.Application.StartupPath + "\\Gmdb\\DataExp15to18.gmdb";//地图路径
GMaps.Instance.ImportFromGMDB(mapPath);//如果使用内部包,直接不要前面这两句
MainMap.Manager.Mode = AccessMode.ServerAndCache;
MainMap.MapProvider = GMapProviders.OpenCycleMap;
MainMap.MinZoom = 4;      //最小比例
MainMap.MaxZoom = 18;     //最大比例
MainMap.Zoom = 10;        //当前比例
MainMap.ShowCenter = false;//不显示中心十字标记
this.MainMap.DragButton = System.Windows.Forms.MouseButtons.Left;//左键拖拽地图
MainMap.MouseWheelZoomType = MouseWheelZoomType.MousePositionAndCenter;//鼠标缩放模式
MainMap.Position = new PointLatLng(30.594479, 114.304233);//地图中心坐标,(纬度,经度)
MainMap.Overlays.Add(overlay);                  //将图层添加到地图
MainMap.Overlays.Add(polygonAuxiliaryLinelay);  //将图层添加到地图

瓦片地图显示效果:

3.搭建主程序,实现几个最基本功能


几个基本功能的实现代码:

3.1 定位到具体坐标

MainMap.Zoom = 17;
MainMap.Position = new PointLatLng(30.595772, 114.299644);   //lng是经度,lat是纬度

3.2 双击添加标记点marker

PointLatLng p = this.MainMap.FromLocalToLatLng(e.X, e.Y);  //将鼠标点击点坐标转换为经纬度坐标//创建标记,并设置位置及样式
GMapMarker marker = new GMarkerGoogle(new PointLatLng(p.Lat, p.Lng), GMarkerGoogleType.blue_pushpin);marker.ToolTipMode = MarkerTooltipMode.OnMouseOver;
marker.ToolTipText = "标记的显示文字";
marker.Tag = string.Format("{0},{1}", p.Lat, p.Lng);//将标记添加到图层
overlay.Markers.Add(marker);

以下功能请转到传送门章节:

3.3 绘制多边形

这个功能是后续会较多使用的功能,有价值的地理数据很多是以区域的形式体现,多边形是最基本的绘制区域的工具。

3.4 搜索地址

这个功能是GIS项目最基本的功能,根据模糊地址寻找精确坐标。

3.5 坐标转换:CGCS2000 to WGS84

以“国家CGCS2000坐标转换为WGS84坐标”为例,实现坐标转换功能。

从零开始搭建一个GIS开发小框架(一)——基本框架相关推荐

  1. 从零开始搭建一个GIS开发小框架(七)——GMap.Net组件WPF版本加载POI性能测试

    目录 1.概述 2.工作内容和步骤: 3.测试结果 4.视频演示 5.总结 6.结束和致谢 1.概述 GIS项目中除了多边形那一套功能,另一个应用最广泛的场景就是POI数据的分析挖掘.今天就给大家演示 ...

  2. 从零开始搭建一个GIS开发小框架(五)——GMap.Net组件WPF版本使用体验

    目录 1.试用情况介绍 2.规划功能 3.Demo实现效果演示 4.传送门(其它后续添加的内容) 5.多边形绘制和注册鼠标事件的代码讲解 1.试用情况介绍 现在windows平台的开发越来越流行WPF ...

  3. 从零开始搭建一个vue项目 -- vue-cli/cooking-cli(一)

    从零开始搭建一个vue项目 -- vue-cli/cooking-cli(一) 1.vue-cli搭建一个可靠成熟的项目 1.介绍 vue-cli 我是去年六月份接触的vue1.0,当时还是个菜逼,当 ...

  4. 从零开始搭建一个react项目

    Nav logo 120 发现 关注 消息 4 搜索 从零开始搭建一个react项目 96 瘦人假噜噜 2017.04.23 23:29* 字数 6330 阅读 32892评论 31喜欢 36 项目地 ...

  5. python写一个游戏多少代码-使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym, ...

  6. github项目怎么运行_利用 GitHub 从零开始搭建一个博客

    "NightTeam",一个值得加星标的公众号. 趁着周末,搭建了一下 NightTeam 的官方博客和官方主页,耗时数个小时,两个站点终于完工了. 由于 NightTeam 的域 ...

  7. 利用 GitHub 从零开始搭建一个博客

    "NightTeam",一个值得加星标的公众号. 趁着周末,搭建了一下 NightTeam 的官方博客和官方主页,耗时数个小时,两个站点终于完工了. 由于 NightTeam 的域 ...

  8. 如何利用 GitHub 从零开始搭建一个博客

    趁着周末,搭建了一下 NightTeam 的官方博客和官方主页,耗时数个小时,两个站点终于完工了. 由于 NightTeam 的域名是 nightteam.cn,所以这里官方博客使用了二级域名 blo ...

  9. 50行python游戏代码_使用50行Python代码从零开始实现一个AI平衡小游戏

    使用50行Python代码从零开始实现一个AI平衡小游戏 发布时间:2020-10-23 09:26:14 来源:脚本之家 阅读:74 集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何 ...

最新文章

  1. 【Live555】live555源码详解(二):BasicHashTable、DelayQueue、HandlerSet
  2. 教你如何保养iphone电池
  3. iOS App的几种多视图介绍
  4. Android ViewPager2 真的香么?
  5. Hadoop视频教程6折 低达4.5折
  6. 国产主可控的嵌入式仿真测试软件SkyEye与可信编译器L2C的核心翻译介绍
  7. js获取本月或指定月份的最后一天
  8. PostgreSQL与MySQL的日期类型DATE/date的格式区别
  9. linux在线聊天报告,EChat: Linux下基于命令行的在线聊天系统
  10. 【云周刊】第145期:2017天猫双11总交易额1682亿,背后阿里绝密50+技术揭秘!
  11. opencv 创建调色板
  12. vs2010+open244的永久性配置
  13. 221. Maximal Square
  14. 神舟战神调节风扇热键_神舟HASEE笔记本电脑开机进入BIOS的方法与bios设置图解(F2)...
  15. java工程师优秀简历模板,这原因我服了
  16. RISCV toolchain编译工具链搭建
  17. 四、spring源码解读初始化
  18. 遇见错误:ValueError: Classification metrics can‘t handle a mix of binary and continuous targets
  19. 自助建站的优缺点总结
  20. CCF A类会议或期刊----多视图,多模态近两年论文

热门文章

  1. 磁盘空间不足怎么办,如何处理分配磁盘的空间?
  2. 饿了么饱腹之路:一个都不能少?
  3. STM32与PN532构建NFC近场通信指南(一):NFC及相关知识准备
  4. 遭遇骚扰、殴打,GrapheneOS 得力干将宣布离职+退网!
  5. Apollo学习(六):自定义Meta Server地址定位逻辑
  6. UI设计素材资源网站推荐
  7. Centos系统服务器怎么查看端口是否开放?
  8. EasyCVR打造基于人工智能和增强现实技术的智能运检系统“AR巡检”
  9. cdr怎么转换成psd转换为位图标准_CorelDRAW中矢量图形如何转换为位图-cdr矢量图是怎样转换成位图的_好特教程...
  10. 九度:1013开门人