当前位置: 首页 > 工具软件 > DotSpatial > 使用案例 >

DotSpatial入门

孟浩然
2023-12-01

一、DotSpatial是什么

DotSpatial是一个基于.Net Framework 4.0 版本编写的一个地理信息系统(GIS)库,以UserControl的形式提供地图控件。它可帮助开发人员把空间数据、空间分析的功能加入到他们的应用程序中,还可以帮助开发人员把地理信息系统功能扩展到社区。目前Dans Ames是DotSpatial的项目经理。

DotSpatial可以帮助您:

在WinForm或者ASP.NET中打开地图
打开用Shapefile格式存储的矢量图以及栅格、位图等形式表示的地图
渲染符号,不重叠的标签
简单的坐标系统转换,包括大地坐标系与投影坐标系之间的转换,内置支持北京54、西安80、国家CGCS2000等等投影坐标系
操作和显示属性数据
科学分析
读取GPS数据
官方提供的源代码目前还不能:

地图绘图系统绘制除点、线、多边形以外的几何图形,包括椭圆形、扇形、弧形
以谷歌的900913坐标系为代表的WebMecator系列投影坐标系与其它坐标系之间的互相转换
多次空间测量,圆形、扇形等多种图形的面积测量
DotSpatial绘图消息外部单独刷新某一个图层,不支持异步加载地图数据后展示

二、准备工作

1、开发工具
开发WinForm程序当然得VisualStudio
2、地图控件库
下载DotSpatial库进行引用或者源代码进行编译。DotSpatial的下载地址是:http://dotspatial.codeplex.com/,现在迁移到了GItHub上https://github.com/DotSpatial/DotSpatial

不过Winform程序嘛,直接引用-右键-Nuget包管理,下载对应模块就好了。不过nuget包,同样版本的,有时候在工具栏里不显示(手动黑人问号?),原因未知。

3、数据
进行地图控件开发当然得要必须的GIS数据。找了CSDN上别人提供的一个数据集。下载链接如下:http://download.csdn.net/detail/caoshiying/9602626

Demo

贴一个我的Demo,试验的时候可能有点小bug没有做修改。。。故仅供参考

功能包括
* 1、添加图层、图层清空
* 2、平移、放大、缩小、全图
* 3、坐标定位
* 4、以鼠标点为中心点重绘
* 5、shp转bmp
* 6、屏幕坐标转地理坐标

using DotSpatial.Controls;
using DotSpatial.Data;
using DotSpatial.Projections;
using DotSpatial.Symbology;
using DotSpatial.Topology;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows.Forms;


namespace DotSpatialTest
{
    public partial class Form1 : Form
    {
        private Map mapCtrl = null;
        private Label coordLabelCtrl = null;

        public Form1()
        {
            InitMapControl();
            InitCoordinateLabel();
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            Controls.Add(mapCtrl);
            coordLabelCtrl.Top = mapCtrl.Height - coordLabelCtrl.Height;
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            mapCtrl.Size = this.Size;
            if (mapCtrl.Layers.SelectedLayer != null)
            {

            }
            coordLabelCtrl.Top = mapCtrl.Height - coordLabelCtrl.Height;
        }

        private void InitMapControl()
        {
            mapCtrl = new Map()
            {
                Name = "mapCtrl",
                Dock = DockStyle.Fill
            };

            mapCtrl.GeoMouseMove += mapCtrl_GeoMouseMove;
            mapCtrl.MouseClick += mapCtrl_GeoMouseClick;
        }

        private void InitCoordinateLabel()
        {
            coordLabelCtrl = new Label()
            {
                Name = "coordLabelCtrl",
                Text = "X:00.0000,Y:00.0000",
                Width = 200,
                BackColor = Color.Transparent
            };
            mapCtrl.Controls.Add(coordLabelCtrl);
        }

        void mapCtrl_GeoMouseMove(object sender, GeoMouseArgs e)
        {
            string locStr = "X:" + e.GeographicLocation.X.ToString("F6");
            locStr += "Y:" + e.GeographicLocation.Y.ToString("F6");
            coordLabelCtrl.Text = locStr;
        }

        void mapCtrl_GeoMouseClick(object sender,MouseEventArgs e)
        {
            if (mapCtrl.FunctionMode == FunctionMode.None)
            {
                GeoMouseArgs args = new GeoMouseArgs(e, mapCtrl); //屏幕坐标到地图坐标转换
                var _startPoint = e.Location;//屏幕起始点坐标
                var _geoStartPoint = args.GeographicLocation;//地图起始点坐标

                var curViewExtent = mapCtrl.ViewExtents;
                var curCenter = curViewExtent.Center;

                mapCtrl.ViewExtents.SetCenter(_geoStartPoint);
                mapCtrl.Refresh();
            }
        }

        private void btnPan_Click(object sender, EventArgs e)
        {
            mapCtrl.FunctionMode = FunctionMode.Pan;
        }

        private void btnZoomIn_Click(object sender, EventArgs e)
        {
            mapCtrl.FunctionMode = FunctionMode.ZoomIn;
        }

        private void btnZoomOut_Click(object sender, EventArgs e)
        {
            //窗口缩放后,可能需要先zoom in,然后才能zoom out
            mapCtrl.FunctionMode = FunctionMode.ZoomOut;
        }

        private void btnMapNone_Click(object sender, EventArgs e)
        {
            var aa = mapCtrl.FunctionMode;
            mapCtrl.FunctionMode = FunctionMode.None;
        }

        private void ZoomToCoordinates()
        {
            var xx = mapCtrl.ViewExtents;
        }

        private void btnZoom2Coordinates_Click(object sender, EventArgs e)
        {
            ZoomToCoordinatesDialog xxx = new ZoomToCoordinatesDialog(mapCtrl);
            xxx.ShowDialog();
        }

        private void btnAddLayer_Click(object sender, EventArgs e)
        {
            var shp = Shapefile.OpenFile("Shapefiles\\tttbou2_4l.shp");
            shp.Projection = KnownCoordinateSystems.Geographic.World.WGS1984;
            var layer = mapCtrl.Layers.Add(shp) as MapLineLayer;
            layer.Symbolizer = new DotSpatial.Symbology.LineSymbolizer(Color.FromArgb(0x33, 0x33, 0x33), 1);
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            mapCtrl.ClearLayers();
        }

        private void btnZoom2MaxExtent_Click(object sender, EventArgs e)
        {
            mapCtrl.ZoomToMaxExtent();
            mapCtrl.Refresh();
        }

        private void btnCenterAt_Click(object sender, EventArgs e)
        {

        }

        private void btnBmp_Click(object sender, EventArgs e)
        {
            var test=mapCtrl.SnapShot();
            test.Save("Shapefiles\\test0.bmp");
        }

        private void btnTest_Click(object sender, EventArgs e)
        {

        }
    }
}
 类似资料: