
实习课程:《SuperMap Objects组件式开发》
| 姓 名: | |
| 学 号: | |
| 专 业: | 地理信息系统 |
| 班 级: | |
| 指导教师: |
2011年 12月 2日
一、实习目的
掌握利用SuperMap Objects + C#来开发GIS系统。
熟练应用SuperMap来操作地图,并对数据进行处理。掌握SuperMap Objects开发GIS系统的接口,方法。
通过课程设计进一步掌握了地理信息系统与应用课程的有关知识,掌握了GIS系统程序设计与开发课程的相关知识,掌握了进行系统定义、系统总体设计方法、系统详细设计、空间数据库设计方法,掌握了利用开发语言和GIS组件开发进行地理信息系统二次开发的能力,实现地理信息系统的基本功能和扩展功能,掌握面向对象进行程序设计的方法,并且可以建立空间数据库完成图形数据和属性数据的统一管理,将所学的内容加以综合,并且对GIS的二次开发有了整体的理解,真正实现从课本到实践的应用。
二、实习地点
国防科技大楼602
三、实习内容
C#是一种现代的面向对象语言。它使程序员快速便捷地创建基于Microsoft.NET平台的解决方案。利用 C# + SuperMap Objects进行二次开发,熟悉对GIS系统的二次开发。在此我实现的主要功能有:
1、空间操作功能、地图浏览功能和地图量算:
(1)在这里实现的功能主要有:打开工作空间、关闭工作空间、退出程序、点选、放大、缩小、平移、自由缩放、全幅显示和长度的量算、面积的量算、角度的量算。
(2)需要添加的控件有:SuperMap控件、SuperWorkspaceManager控件、SuperLegend控件和SuperWorkspace控件。
(3)主要使用的接口:
a、控件的关联和断开:
调用接口SuperMap.Connect()、SuperWkspMamager.Connect()、SuperLegend.Connct()实现上述控件的关联。
例:this.axSuperMap1.Connect(this.axSuperWorkspace1.CtlHandle); //关联SuperMap,SuperWorkspaceManager控件
b、打开工作空间:
调用接口SuperWorkspace.Open打开工作空间。
例:bool blnOpen = this.axSuperWorkspace1.Open(strOpenPath, "");//打开工作空间
c、关闭工作空间:
调用接口SuperWorkspace.Close关闭工作空间。
例:axSuperWorkspace1.Close();//关闭工作空间
d、打开数据源:
调用SoLayers.AddDataset()打开选中的数据集。
例:soLayer objLy = oaxSuperMap1.Layers.AddDataset(objDt, true);//添加指定数据集到地图窗口中
e、地图浏览操作:
通过设置SuperMap.Action的值将当前鼠标的操作状态设置为地图浏览操作。
例:点选功能的操作:
axSuperMap1.Action = SuperMapLib.seAction.scaSelect;
ControlState(seAction.scaSelect);//设置菜单项的状态
f、地图量算:
通过接口SuperMap.TrackingLayer获得跟踪对象;然后通过设置
SuperMap.Action的值将当前鼠标的操作状态为跟踪层上的绘制线;最后在绘制事件SuperMap.Tracking()中获得量算结果,并显示在状态栏中。
量算距离的程序:
soTrackingLayer objTLayer = axSuperMap1.TrackingLayer;//获得跟踪层对
axSuperMap1.Action = seAction.scaTrackPolyline; //设置当前鼠标状态为在内存中画折线
(4)准备的数据:
执行属性显示功能的结果
2、查询功能
(1)本章通过使用一幅美国行政区划图实现查找Missouri河、查询Missouri河穿过的州、查询Missouri河200公里以内的县、查询South Dakota州包含的州和关联查询South Dakota州的人口数的功能。本章是在上一功能的基础上开发的,且不需要添加特殊的控件,所以控件和上一功能的一样。
(2)准备的数据:
(3)主要使用的接口和操作:
a、查找Missouri河:
通过查询操作soDatasetVector.Query(),soRecordset.GetGeometry()获得查询到的对象soGeometry,调用soTrackingLayer.AddEvent()将查询到的对象添加到临时图层上显示。
例: soRecordset objRecordset =((soDatasetVector)axSuperMap.Layers
["RiversL@us"].Dataset).Query("RIVER_NAME = 'Missouri1'", true, null, "");//查询到Missouri河
soGeometry objGeo = objRecordset.GetGeometry();//获得几何对象
axSuperMap1.TrackingLayer .AddEvent(objGeo, null, "Missouri1");//显示
b、查询Missouri河穿过的州:
先用a的方法查出Missouri的几何对象,再调用空间查询soDatasetVector .QueryEx(),并调用soSelection .FromRecordset()将查询到的对象添加到选择集并高亮显示。
例:
soRecordset objRecordsetR=objDatasetVectorR.QueryEx(objGeo, seSpatialQueryMode.scsLineCross, "");//空间查询
axSuperMap1.selection .FromRecordset(objRecordsetR);//把带有几何对象的记录集转化为选择集
c、查询Missouri河200公里以内的县:
先用a的方法查出Missouri的几何对象,再执行距离查询 soDatasetVector. QueryByDistance(),调用soSelection .FromRecordset()将查询到的对象添加到选择集并高亮显示。
例:soRecordset objRecordsetR = objDatasetVectorR.QueryByDistance(objGeo, 200000, "");//距离查询
d、 查询South Dakota州包含的州:
实现的过程和步骤与“查询Missouri河穿过的州” 相同。
e、 关联查询South Dakota州的人口数:
新建soRelQueryTableInfo对象,设置被关联数据集的相关参数,新建soRelQueryTableInfos对象,添加一个或多个soRelQueryTableInfo对象,新建soQueryDef对象,设置查询方式、查询字段、查询条件,设置关联表信息soRelQueryTableInfos对象,通过soDatasetVector.QueryDef()函数查询符合条件的记录,得到记录集,通过记录集soRecordset .GetFieldValue()获得关联查询到的值。
例:soRelQueryTableInfos objRelTables = new soRelQueryTableInfos();//新建对象
soRelQueryTableInfo objRelTable = new soRelQueryTableInfo();//新建对象
soQueryDef objQueryDef = new soQueryDef(); //定义查询信息
soRecordset objRecordset = objDV.Query2(objQueryDef);//查询符合条件的记录
String strValue = objRecordset.GetFieldValue("POP").ToString();//获得关联查询到的值
查询Missouri河200公里以内的县的到的结果
3、缓冲区查询:
(1)本章通过用长春市区图和奥运火炬传递路线实现了创建在奥运火炬路线200米警戒范围的缓冲区,在缓冲区内获得派出所信息,并查询各有多少警力。最后将查询到的结果在跟踪图层上表现出来。本章是基于第二章的基础上开发来的,且不需要添加特殊的控件,所以控件和第二章一样。
(2)准备的数据:
(3)主要的接口和操作:
a、创建缓冲区:
调用接口soSpatialOperator.Buffer()获得缓冲区面对像。
b、缓冲区查询:
调用接口soDatasetVector.QueryEx(),根据缓冲区面对像对其他图层做控件查询,并对查询结果进行统计。
c、显示分析结果:
通过接口SuperMap1.TrackingLayer获得跟踪图层对象,然后将分析的结果添加到跟踪图层上。
四、实习心得体会
通过这次设计,我不但对组件式的GIS二次开发有了进一步的认识,也进一步熟悉了SuperMap Objects 与C#相结合的应用,提高了对c# 和SuperMap Objects的操作能力。以前的学习只是学习一些单项功能,这些课让我学会了如何灵活的使用和组合这些功能,从而得到一个新的作品。
这在课设过程中,我们体会到了地理信息系统在人们日常生活中发挥的广泛作用,增加了我们对自己所学专业的信心。同时,也增加了我们的理论知识储备,锻炼并提高了实践能力,相信这一定会在今后的学习工作中为我们提供很大的帮助。
附录:
缓冲区查询的主要代码:
创建缓冲区:
private void 创建缓冲区ToolStripMenuItem_Click(object sender, EventArgs e)
{
//获得几何对象
soGeometry objSelectGeo = axSuperMap1.selection.ToRecordset(true).GetGeometry();
for (int iRecordCount = 1; iRecordCount <= this.axSuperMap1.selection.ToRecordset(true).RecordCount; iRecordCount++)
{
//进行缓冲区分析
soGeoRegion objBufferRegion = ((soGeoLine)objSelectGeo).SpatialOperator.Buffer(200, 20);
//显示
soTextPart oTp = new soTextPartClass();
soGeoText oGt = new soGeoTextClass();
soTextStyle oTStyle = new soTextStyleClass();
oTp.Text = "200米警戒范围";
oTp.x = objBufferRegion.CentroidPoint.x;
oTp.y = objBufferRegion.CentroidPoint.y;
oGt.AddPart(oTp);
oTStyle.Align = seTextAlign.sctMiddleCenter;
oTStyle.FontHeight = 200;
oTStyle.Color = (uint)ColorTranslator.ToOle(Color.Red);
oTStyle.Bold = true;
oGt.TextStyle = oTStyle;
this.axSuperMap1.TrackingLayer.AddEvent((soGeometry)oGt, null, "");//将文本添加到跟踪层上显示
this.axSuperMap1.TrackingLayer.AddEvent((soGeometry)objBufferRegion, null, "");
}
axSuperMap1.Refresh();
}
缓冲区查询:
private void 缓冲区查询ToolStripMenuItem_Click(object sender, EventArgs e)
{
//设置点风格
soStyle objStyle = new soStyleClass();
objStyle.PenColor = (uint)ColorTranslator.ToOle(Color.Blue);
objStyle.PenWidth = 20;
objStyle.SymbolSize = 24;
objStyle.SymbolStyle = 66;
//查询单位图层
soLayer objLy = this.axSuperMap1.Layers["Government@changchun"];
//进行空间查询
soRecordset objRd = ((soDatasetVector)objLy.Dataset).QueryEx(this.axSuperMap1.TrackingLayer.get_Event(1).geometry, seSpatialQueryMode.scsContaining, "code=3");
//显示
for (int iRecordCount = 1; iRecordCount <= objRd.RecordCount; iRecordCount++)
{
soGeometry oGeo = objRd.GetGeometry();
soTextStyle oTStyl = new soTextStyleClass();//创建文本
oTStyl.FontHeight = 200;
oTStyl.Align = seTextAlign.sctBottomLeft;
soTextPart oTp = new soTextPartClass();创建文本子对象
oTp.Text = "警力:" + objRd.GetFieldValue("Power").ToString() + "人";
soGeoPoint oGp = (soGeoPoint)oGeo;生成二维点对象
oTp.x = oGp.x;
oTp.y = oGp.y;
soGeoText oGt = new soGeoTextClass();创建注记对象
oGt.AddPart(oTp);
oGt.TextStyle = oTStyl;
this.axSuperMap1.TrackingLayer.AddEvent(oGeo,objStyle,"");//跟踪层添加点对象
this.axSuperMap1.TrackingLayer.AddEvent((soGeometry)oGt, null, "");//跟踪层添加文本
objRd.MoveNext();
this.axSuperMap1.TrackingLayer.Refresh();
}
}
创建缓冲区得到的结果
缓冲区查询得到的结果
