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

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

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiangcns

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值