第一部分 基于DotSpatial的桌面GIS开发系列实验
实验1-1 地理数据加载与地图浏览
DotSpatial以控件方式提供地理数据的加载、展示和分析功能。 DotSpatial是开源软件,组件核心为 DotSpatial.Controls.dll动态链接库,特点是代码完全开放,类库可供其他程序直接调用。使用者可以从其官网上下载源代码供个人修改研发。
(1)实验目的:通过地理数据加载与地图浏览实习,熟悉在.NET环境和 Visual Studio平台下搭建和运行 DotSpatial类库,初步了解开源桌面 GIS的二次开发模式,初步认识 DotSpatial类库的基本组织架构,初步掌握 DotSpatial主要控件的功能和特性,并使用 DotSpatial类库加载矢量和栅格数据的方法,实现对地图视图的基本浏览操作。
(2)相关实验: GIS专业实验设备与环境配置中的“ GIS应用开发环境”和“ GIS应用开发资源”。
(3)实验数据:本教材系列实验数据。
(4)实验环境: Visual Studio2010、DotSpatial 1.7库、.NET Framework 4.0框架、C#编程语言。
(5)实验内容:通过在 Visual Studio下加载 DotSpatial类库,添加 DotSpatial控件,初步熟悉利用 DotSpatial进行二次开发的环境搭建过程和控件的简单操作;通过在 Visual Studio下使用 Map控件和代码编写一个窗体应用程序实现加载矢量和栅格数据的功能;通过在 Visual Studio下使用 Map控件和代码编写一个窗体应用程序实现对地图的放大、缩小、漫游、居中等基本视图操作功能。
1.环境初识
启动 Visual Studio2010,依次选择“文件”→“新建”→“项目”,弹出“新建项目”对话框,如图1-1-1所示。选择 Visual C#项目模板,再选择项目类型为 Windows窗体应用程序,输入项目名称并选择项目位置,点击“确定”按钮后,则成功新建一个 WinFrom窗体程序,并自动生成一个名为 From1的窗体。
图1-1-1 新建窗体应用程序界面
在窗体设计界面的工具箱上右击空白处,选择“添加选项卡”并命名为“DotSpatial”,鼠标右击 DotSpatial选项卡,选择“选择项”,则弹出“选择工具箱项”对话框。选择“.NET Framework组件”,如图1-1-2所示,点击“浏览”按钮,在弹出的对话框中找到本地的 DotSpatial.Controls.dll文件(其打包了一系列 GIS桌面开发所需的基本控件),如图1-1-3所示,点击“确定”后工具箱中出现常用的 DotSpatial相关控件。
图1-1-2 工具箱加载 DotSpatial控件界面
图1-1-3 本地 DotSpatial.Controls.dll文件界面
右击解决方案资源管理器中的项目名称,选择添加引用,从“浏览”中找到本地的4个文件,如图1-1-4所示,点击“确定”后,工程引用中出现了添加的 DotSpatial库。
设置好后,右击解决方案中的项目名称,选择属性,如图1-1-5所示,在属性窗体中选择目标框架为“.NET Framework 4”版本后,将配置完成 DotSpatial的开发环境。
图1-1-4 添加 DotSpatial库引用界面
图1-1-5 项目属性界面
自主练习:创建新工程,配置完成 DotSpatial的开发环境。
2.地理数据加载
DotSpatial可加载矢量和栅格数据:矢量数据支持 ERSI公司的 shp格式,而栅格数据支持 bgd、tif、jpg、bmp等多种格式。DotSpatial自带 Legend控件,不需要编写烦琐的代码程序就能实现基本的图层管理功能。程序设计时可拖拽 Legend控件到主窗体上,并将 Map控件属性中的 Legend属性设置为 Legend1即可。但通常利用代码方式进行程序开发,本实验将全部使用代码编写。
将工具箱中的 Map控件拖拽到主窗体中,再拖拽两个 Button按钮到主窗体中,分别命名为“btnLoad”和“btnClear”,按钮文本为“添加图层”和“删除图层”。分别双击“添加图层”和“删除图层”按钮,并在按钮的事件中编写相应的代码。
DotSpatial提供了如下加载不同类型数据的方法:
map1.AddLayer();//加载单个矢量或栅格图层
map1.AddLayers();//加载多个矢量或栅格图层
map1.AddFeatureLayer();//加载单个矢量图层
map1.AddRasterLayer();//加载单个栅格图层
map1.AddFeatureLayers();//加载多个矢量图层
map1.AddRasterLayers();//加载多个栅格图层
map1.AddImageLayer();//加载单个位图图层
map1.AddImageLayers(); //加载多个位图图层
map1.ClearLayers();//删除所有图层
本实验代码如下:
using DotSpatial.Controls;
//加载矢量或栅格数据
private void btnLoad_Click(object sender, EventArgs e)
{
map1.AddLayer();
}
//删除所有图层
private void btnClear_Click(object sender, EventArgs e)
{
map1.ClearLayers();
}
点击 Visual Studio的启动调试项,运行程序,出现程序主界面,点击“添加图层”按钮,在弹出的选择文件对话框中分别选择本地 shp和 tif格式的数据,矢量数据和栅格数据添加分别如图1-1-6和图1-1-7所示。 Map控件中将分别显示矢量和栅格图层。点击“删除图层”按钮将删除界面的所有图层。
自主练习:完善按钮的事件中对应的添加地图数据的相应代码,实现添加矢量数据、栅格数据。
3.地图浏览
图层视图操作只需调用 DotSpatial已经封装好的方法即可,如放大、缩小、漫游、居中、选择等功能。
图1-1-6 添加矢量数据界面
图1-1-7 添加栅格数据界面
拖拽4个 Button按钮到主窗体中,分别命名为“ btnZoomIn”“btnZoomOut”“btnPan”“btnExtent”,按钮文本分别为“放大”“缩小”“漫游”“居中”。分别双击各个按钮,并在按钮的事件中编写相应的代码。
实验代码如下:
using DotSpatial.Controls;
//放大地图
private void btnZoomIn_Click(object sender, EventArgs e)
{
map1.FunctionMode = FunctionMode.ZoomIn;
}
//缩小地图
private void btnZoomOut_Click(object sender, EventArgs e)
{
map1.FunctionMode = FunctionMode.ZoomOut;
}
//漫游地图
private void btnPan_Click(object sender, EventArgs e)
{
map1.FunctionMode = FunctionMode.Pan;
}
//居中显示地图
private void btnExtent_Click(object sender, EventArgs e)
{
map1.ZoomToMaxExtent();
}
运行程序,加载地图,点击“放大”按钮,在界面上选中要放大的区域后松开鼠标,该区域将按比例放大;而点击“漫游”按钮,则可拖动鼠标实现地图平移。点击其他按钮执行操作可出现相应结果。放大、居中、漫游等代码运行效果如图1-1-8~图1-1-10所示。
图1-1-8 放大地图界面
图1-1-9 居中显示地图界面
图1-1-10 漫游地图界面
自主练习:完善各按钮的事件中对应的地图浏览的相应代码,实现数据的放大、缩小、漫游、全图显示。
实验1-2地理要素查询与检索
DotSpatial的 Map控件中,已集成好图形查询功能,点击地图区域即可弹出属性对话框,但通常需要在属性表窗体上进行属性值修改。本节实验主要完成地理要素查询检索功能的开发。
(1)实验目的:通过地理要素查询与检索实验,进一步了解 DotSpatial主要控件的功能和特性,初步掌握使用 DotSpatial类库从空间图形查询属性和从属性查询检索图形信息的方法。
(2)相关实验:实验1-1地理数据加载与地图浏览。
(3)实验数据:本教材系列实验数据。
(4)实验环境: Visual Studio2010、DotSpatial 1.7库、.NET Framework 4.0框架、C#编程语言。
(5)实验内容:通过在 Visual Studio下使用 Map控件和代码编写一个窗体应用程序,实现由点选和框选图形查询空间数据属性的功能;通过在 Visual Studio下使用 Map控件和代码编写一个窗体应用程序,实现根据属性条件查询图形和检索空间数据的功能。
1.由空间图形查询属性
本节实验要求编写代码实现图形选择、弹出属性表窗体功能。
弹框显示要素信息代码为
this.map1.FunctionMode = FunctionMode.Info;
1)选择图斑事件编辑
按照本章实验1-1的步骤添加 Map控件和加载、删除、放大、缩小图层的 Button按钮并编写好相应代码。拖拽一个 Button按钮到主窗体中,命名为“ btnSelect”,按钮文本为“选择图斑”,在按钮的事件中编写相应的代码。右击主窗体,在属性事件中双击 Form1_Load编写窗体初始化代码,修改加载图层按钮中的方法并绑定到 Map控件中的 Load事件下。
实验代码如下:
using DotSpatial.Controls;
//定义当前选择图层
IMapFeatureLayer currentLayer = null;
//定义选择图斑方法
MapFunctionSelect selectFunction = null;
//窗体初始化
private void Form1_Load(object sender, EventArgs e)
{
selectFunction1= new MapFunctionSelect(this.map1);
this.map1.MapFunctions.Add(selectFunction);
this.map1.ProjectionModeReproject = ActionMod
展开