65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 MapWinGIS 和 C# 构建桌面 GIS 应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (66投票s)

2009年7月12日

CPOL

6分钟阅读

viewsIcon

332421

downloadIcon

22338

使用开源 MapWinGIS 和 C# 构建桌面 GIS 应用程序的皇家之路。

引言

地理信息系统是一种应用程序,它拥有一系列功能来捕获、存储、检索、维护和显示地理数据和信息。GIS 应用程序的开发旨在满足多种目的,从 GIS 数据探索等简单目的,到流域测绘等复杂目的。开发人员可以使用和在其应用程序中实现不同的商业库,例如 ESRI 的 ArcObject 和 ThinkGeo 的 Map Suite。不幸的是,这些库的许可证费用通常很高,这使得 GIS 应用程序的开发过程对于自由职业程序员和小型公司来说不可行。在本系列教程中,我将详细介绍如何使用开源 MapWinGIS 库和 C# 构建桌面 GIS 应用程序。MapWinGIS 是一个用于 GIS 开发的 ActiveX 控件,内置支持多种栅格和矢量格式。MapWinGIS.ocx 是 MapWindow GIS 的核心,MapWindow GIS 是著名的开源、多功能桌面 GIS 应用程序。阅读本教程的第一步是从 MapWindow GIS 开源项目网站获取 MapWinGIS.ocx,然后按照项目网站提供的安装程序将其安装到您的计算机上。

创建您的地图

准备工作

在本教程中,我使用的是 .NET Framework 3.5 和 Microsoft Visual Studio 2008 Professional Edition。实际上,您可以毫无问题地使用 Visual Studio Express Edition。我还使用了一组 ESRI shapefile 格式的 GIS 数据,我已将其作为压缩文件提供。我建议您下载此数据压缩文件,解压缩它,并将文件内容放置在一个独立的文件夹中。现在,您已准备好进入下一步。

创建项目并添加对 MapWinGIS 组件的引用

现在,启动您的 Visual Studio 并创建一个新的 Windows Forms 应用程序。指向“项目”菜单,然后单击“添加引用”。在“添加引用”对话框中,指向“COM”选项卡,然后从“组件名称”列表中选择“MapWinGIS 组件”,然后单击“确定”。

01.JPG

现在,您的项目中有一个新引用,您可以在“解决方案资源管理器”中的“引用”下显示其名称。

02.JPG

现在,我们将把地图控件添加到我们的工具箱中。地图控件是一个用作地理数据容器和交互式显示区域的控件。要将此控件添加到工具箱中,请指向工具箱中的“通用”选项卡并右键单击。从菜单中选择“选择项”。“选择工具箱项”对话框将出现。选择“COM 组件”选项卡,然后选择“地图控件”。要将其添加到工具箱,请单击“确定”。

03.JPG

现在,您可以在“通用”选项卡中看到地图控件图标。

04.JPG

是时候创建您的 GUI 了

现在,是时候构建您的界面了。从工具箱的“菜单和工具栏”选项卡中拖动一个 ToolStrip 控件并将其放到窗体上。向 ToolStrip 添加五个按钮,并将这些按钮命名为 toolCursortoolZoomExtenttoolZoomIntoolZoomOuttoolPan。您还可以为按钮分配有意义的标签和图像(您可以使用我项目资源中的图像)。从工具箱中拖动 Map 控件并将其放到窗体上。在“属性”窗口中,将 Map 控件的 Dock 属性设置为 Fill,并将 CursorMode 属性设置为 cmNone

以编程方式将 GIS 数据加载到应用程序中

现在,我们将为地图添加两个 ESRI Shapefile。ESRI Shapefile 或简称 Shapefile 是一种流行的地理空间矢量数据格式,用于地理信息系统软件。在 Form1_Load 事件中,添加以下代码:

//Add first layer to your map
int intHandler1; //integer index to handle the layer
//create a new instance for MapWinGIS.Shapefile
//MapWinGIS.Shapefile  is a data provider for ESRI Shapefile
MapWinGIS.Shapefile shapefile1 = new MapWinGIS.Shapefile();
//Define the data source for MapWinGIS.Shapefile instance
shapefile1.Open(@"D:\GISSampleData\base.shp", null );
//display the layer on the map
intHandler1 = axMap1.AddLayer(shapefile1, true);

//Add second layer
int intHandler2;
MapWinGIS.Shapefile shapefile2 = new MapWinGIS.Shapefile();
shapefile2.Open(@"D:\GISSampleData\nile.shp", null);
intHandler2 = axMap1.AddLayer(shapefile2, true);

在第一行中,我们创建了一个整数变量 (intHandler1)。在第二行中,我们为 MapWinGIS.Shapefile 类创建了一个实例 (shapefile1)。MapWinGIS.Shapefile 是表示真实世界地理特征的几何实体的容器。在第三行中,定义了新对象 (shapefile1) 的数据源。此数据源是一个 ESRI Shapefile。此数据源以多边形形式显示埃及。在第四行中,我们已将此新对象添加到地图控件 (axMap1) 并使其可见。函数 AddLayer 用于向地图控件添加地理图层并返回一个整数表示图层句柄。第 4 到 8 行将第二个 Shapefile 添加到地图控件并使其可见。现在是时候运行您的第一个 GIS 应用程序了;在键盘上按 F5 以在地图控件中显示埃及地图。

05.JPG

更改您的要素符号

为地图中包含的不同地理要素自定义不同的符号是 GIS 开发人员最重要的任务之一。在本课程中,我将介绍自定义要素符号最简单的方法。实际上,MapWinGIS 提供了许多高级方法来符号化 GIS 数据,我将在高级课程中讨论。现在,在 Form1_Load 事件中的上一个代码之后添加以下代码:

//Set Filling color of the ploygon shapefile
axMap1.set_ShapeLayerFillColor(intHandler1,
    (UInt32)(System.Drawing.ColorTranslator.ToOle 
            (System.Drawing.Color.SaddleBrown)));
//Set the line color
axMap1 .set_ShapeLayerLineColor (intHandler2 ,
    (UInt32)(System.Drawing.ColorTranslator.ToOle
            (System.Drawing.Color.Yellow)));
//Set the line width
axMap1.set_ShapeLayerLineWidth(intHandler2,5);

在第一行中,我们使用 Map 控件 (axMap1) 的 set_ShapeLayerFillColor 方法。此方法使用图层句柄 (intHandler1) 和 UInt32 格式的颜色来设置定义图层的填充颜色。Map 控件提供了许多其他有用的方法来自定义图层符号,例如 set_ShapeLayerFillStipple,它定义图层的填充类型,以及 set_ShapeLayerFillTransparency,它定义图层的透明度级别。在第二行中,使用了另一种方法。此方法 - set_ShapeLayerLineColor - 使用图层句柄和 UInt32 格式的颜色定义线几何图层的线颜色。在第三行中,我使用了 set_ShapeLayerLineWidth 方法,使用此图层句柄和表示线宽的 float 数字来定义线几何图层的宽度。运行您的应用程序,看看它现在如何显示您的地图。

06.JPG

为您的地图添加一些操作

当然,您希望为地图添加一些令人惊叹的操作,例如放大、缩小和平移。使用 MapWinGIS 添加此类操作是一项非常简单的任务。Map 控件的 CursorMode 属性以易于使用的方式提供了这些任务;您必须将所需的模式分配给此属性,以便直接在地图中使用它。在以下代码中,我将通过工具栏中每个按钮的 Click 事件来操作 CursorMode 属性。

private void toolCursor_Click(object sender, EventArgs e)
{
    axMap1.CursorMode = MapWinGIS.tkCursorMode.cmNone;
}

private void toolZoomIn_Click(object sender, EventArgs e)
{
    axMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomIn;
}

private void toolZoomOut_Click(object sender, EventArgs e)
{
    axMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomOut;
}

private void toolPan_Click(object sender, EventArgs e)     
{
    axMap1.CursorMode = MapWinGIS.tkCursorMode.cmPan;
}

要将地图设置为最大地图范围,您将使用 Map 控件的 ZoomToMaxExtents 方法。只需使用 Click 事件调用此方法,如下所示,即可在最大范围内显示您的地图:

private void toolZoomExtent_Click(object sender, EventArgs e)
{
    axMap1.ZoomToMaxExtents();
}

是时候测试这些新功能了;运行您的应用程序,并检查每个按钮。

结论

MapWinGIS 是创建 GIS 桌面应用程序最简单的方法。上述功能展示了 GIS 程序员所需的主要任务。本系列的未来课程将探讨 MapWinGIS 的许多有用和高级功能。

历史

  • 第一版:2009 年 7 月 12 日。
© . All rights reserved.