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

article/2025/10/25 0:20:25

目录

  • 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坐标”为例,实现坐标转换功能。


http://chatgpt.dhexx.cn/article/3P2OZsyf.shtml

相关文章

三维GIS/GIS开发学习路线、软件和数据、视频资源推荐

GIS开发学习资源合集来了!!一份前所未有,全网都没有这么详细的资源合集来了,从基础入门视频、实战项目、GIS开发数据合集、开发软件等,囊括了GIS开发学习所以内容。 一、GIS和WebGIS简介: 什么是GIS&#x…

WEB GIS 开发基础概念汇总

WEB GIS 开发基础概念汇总 文章目录 WEB GIS 开发基础概念汇总1.基础概念2.技术框架2.1 常见技术概念汇总2.2 思维导图(借用,感觉比较到位) 3.内网离线WEB GIS搭建思路4.感谢 1.基础概念 WEB GIS是指依托互联网建立的地理信息服务系统&#…

GIS开发中的JavaScript的应用

JavaScript简介 JavaScript是一种很常见的高级编程语言,它和Java计算机语言没有任何联系。 JavaScript主要用于开发Web端的用户界面,比如在Web和移动GIS应用程序中就会用到JavaScript;它主要目标是构建前端应用程序,这些应用程序…

最全GIS开发编程语言汇总及分类

最近总有很多人关心GIS开发语言的问题,这个确实很重要,毕竟学习一门编程语言需要花费不少时间和精力,找不到合适GIS的编程语言意味着浪费时间。 这里将这些内容做一个详细的对比,大家可以根据自己的需要进行参考。 编程语言的特…

三维gis开发

如何简单制作cesium能渲染的三维地图 目录 一、下载高程数据 二、下载卫星影像数据 三、高程数据切片 四、卫星影像切片 五、cesium里渲染加载 一、下载高程数据 网站:地理空间数据云 1、注册登录 2、高级检索 3、数据集选择GDEMV2数据 4、空间位置根据需要…

GIS开发零基础入门:地图操作(附代码)

示例功能 本示例在加载了天地图矢量图层以及其注记图层的基础上,添加了地图视图的放大、缩小、跳转以及复位功能。 示例实现 本示例需要使用 【include-openlayers-local.js】 开发库实现,然后通过 setZoom(zoom)方法设置地图的缩放等级,通过…

第一章第1节-什么是GIS开发

1. 什么是GIS 要了解GIS开发, 首先我们要知道什么是GIS GIS: Geographic Information System 地理信息系统 地理信息系统(GIS,Geographic Information System)是一门综合性学科 结合了地理学与地图学以及遥感和计算机科学 详细内容参考: …

GIS开发实战图谱

总结了GIS开发的技术栈,罗列了应该了解的内容。 算是比较大而全的了,分理论、规范、数据、算法、软件、后端、前端、方向8个专项。 不求短期内全部都会,但还是一个比较好的学习框架和实践索引,如果基础好的话,两三年…

js中的设计模式之适配器模式

Js中的适配器模式 定义 将一个对象的接口适配成用户所期待的接口。 详细描述 适配器模式就是将不同对象的方法适配成可以对接或者统一调用的方式。它也是包装器的一种。 在生活中也有很多类似的例子,比如有的手机没有3.5耳机插口,所以就需要增加一个…

JavaScript设计模式之状态模式

什么是状态模式? 状态模式是一种非同寻常的优秀模式,它也许是解决某些需求场景的最好方法。虽然状态模式并不是一种简单到一目了然的模式(它往往还会带来代码量的增加),但你一旦明白了状态模式的精髓,以后…

【JavaScript设计模式】观察者模式

观察者模式 文章目录 观察者模式🌰:理解观察者模式手写观察者模式必须先订阅再发布吗Vue数据双向绑定(响应式系统)的实现原理实现一个Event Bus/ Event Emitter在Vue中使用Event Bus来实现组件间的通讯 观察者模式与发布-订阅模式…

js设计模式

js设计模式 1.构造器函数 function Ema(name, age) {this.name nameconsole.log(this);//谁调用了this就指向谁this.sayfunction(){console.log(1)}}let ema1new Ema(zhangsna1)let ema2new Ema(李四1)console.log(ema1);//Ema obj {name:zhangsan1, Fun say}console.log(ema…

八大最常用的JavaScript设计模式

八大最常用的JavaScript设计模式 设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目…

JavaScript 设计模式之组合模式

引 我们知道地球和一些其他行星围绕着太阳旋转,也知道在一个原子中,有许多电子围绕着原子核旋转。我曾经想象,我们的太阳系也许是一个更大世界里的一个原子,地球只是围绕着太阳原子的一个电子。而我身上的每个原子又是一个星系&a…

JavaScript设计模式

JavaScript设计模式 设计模式:代码经验的总结,是可重用的用于解决软件设计中一般问题的方案。 设计模式都是面向对象的。 学习设计模式,有助于写出可复用和可维护性高的程序。 常用的12种设计模式: 工厂模式 单例模式 原型模…

JavaScript中常见的十五种设计模式

一、单例模式 二、策略模式 三、代理模式 四、迭代器模式 五、发布—订阅模式 六、命令模式 七、组合模式 八、模板方法模式 九、享元模式 十、职责链模式 十一、中介者模式 十二、装饰者模式 十三、状态模式 十四、适配器模式 十五、外观模式 一、单例模式 1. …

JS 常用的六种设计模式介绍

常用设计模式 前言 我们经常听到一句话,“写代码要有良好的封装,要高内聚,低耦合”。究竟怎样的代码才算得上是良好的代码。 什么是高内聚,低耦合? 即五大基本原则(SOLID)的简写 高层模块不…

git工具统计项目的代码行数

1、git 查看代码的项目总行数 (1)打开Git终端,进入项目的根目录 git log --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add,…

小技巧之统计代码行数

欢迎关注我的微信公众号“人小路远”哦,在这里我将会记录自己日常学习的点滴收获与大家分享,以后也可能会定期记录一下自己在外读博的所见所闻,希望大家喜欢,感谢支持! 搞了两个月,连搬带抄写出来的代码&a…

MAC代码下统计代码行数工具

作为一名程序员在很多的时候需要统计代码行数: 支持windows系统的代码行数统计方法以及软件很多,但是MAC系统的统计代码行数的真的不太多。 大家都知道用 wc -l 命令进行代码行数统计,但是它会将代码中的注释、空行所占用的文本行都统计在内…