GIS二次开发实验系统需求分析报告
一、背景
随着全球化、网络化和知识经济的蓬勃发展,地理信息系统的理论和技术方法也得到了飞速发展,其已被广泛用于环境整治、城市管理等多个领域。所以对于地理信息系统软件的需求也日益扩大,这些地理信息系统软件的功能包括对于地图的简单浏览、数据查询、修改、专题地图的制作、空间分析等。任何系统的开发都是为了满足用户的需求,如何开发一个令用户满意的系统,对用户需求的分析显得无比重要,所以就需要进行基本的开发尝试,熟悉地理信息系统的基础功能。
二、开发软件和插件介绍
2.1 VB软件的概述:VB是Visual Basic的简称,本次系统开发实验是在VB平台上实现的。它能够很比较容易的实现各种数据库的链接,能够嵌套其他的如MO的控件,快速的实现GIS基本功能。
2.2 MO的概述:MO是MapObjects的简称,它包括一个OLE控件(OCX)叫做Map(Map control)和一组(三十多个)OLE对象(objects)。它适用于工业标准程序环境。如VB6.0,Delphi2.0,PowerBuilder,MS Access等。。
通过MO可以实现以下的甚至更多的功能:
l 显示一张多个Layer地图(道路,河流,边界)。
l 放大,缩小,漫游。
l 生成图形元素,如点、线、圆、多边形。
l 说明注记
l 识别地图上被选中的元素。
l 通过线,方框,区域,多边形,圆拾取物体。
l 拾取某参照物特定范围内的物体。
l 通过SQL描述来选择物体。
l 对选取物体进行基本统计。
l 对所选地图元素的属性进行更新,查询。
l 绘制专题图。
l 标注地图元素。
l 从航片或卫星图片上截取图像。
l 动态显示实时或系列时间组数据。
三、系统设计目标
本次系统设计主要是以熟悉并实现GIS系统的基本功能为主,同时还重点的实现一种空间分析:最短路径分析。
具体详细的设计目标:
1、该系统能够实现图的放大、缩小、平移、全视图等操作,从而使用户能够快速的大致理解当前图的内容。
2、该系统能够实现基本的属性查询,从而使用户能够精确的定位其感兴趣的目标
3、该系统能够快速的查询最短路径,并能够以精确的数字信息和详细的文字信息呈现出来
四、需求分析
4.1 功能需求
通过对用户的需求调查,收集数据,并对数据进行处理,为整个系统设计做好前期准备
1.用户可以通过系统根据类的关键字查询相关的属性信息,如根据区县的名称可获取其在图上的具体位置
2.用户需要该系统提供最短路径分析并获取最短路径的距离、经过的地方等。
3.系统的稳定性,系统具有一定的容错纠错的能力
4.整个系统界面布局美观大方,各功能模块分布合理
5.运行效率,系统具有较好的运行效率。
6.系统操作简单、用户可以轻易的学会使用方法
4.2 数据来源
本次系统开发设计的数据是利用网络下载的重庆范围内的影像数据,通过对需要的类别进行矢量跟踪来获取,同时也使用VB软件只带的一些实例数据。
五、功能模块设计
本系统是以SHP数据为基础,用户不仅可以利用本系统的基本功能快速浏览数据,还可以通过属性查询,获取自己感兴趣区域的集体位置及其他属性。整个系统的功能划分为9大功能模块,如下:
其中每个功能模块下的子功能模块如下
文件功能模块:能够实现单个SHO文件、多个SHP文件的添加、可到处为JPG格式图片、退出本系统。
视图功能模块:比例尺窗口、地图前景色、地图背景色。
图层功能模块:放大、多小、平移、全视图、获取当前图层、获取图层数、删除当前图层、删除所有图层。
数据库功能模块:显示当前图层的属性表。
绘图功能模块:实现画点、画线、画矩形、画多边形、画圆、文本添加。
查询功能模块:点击查询、按属性查询。
测量功能模块:自定义线路长度计算、自定义多边形周长计算、自定义多边形面积机计算。
专题地图功能模块:字段渲染专题图、分级渲染专题图、点值渲染专题图、图表渲染专题图、标注渲染专题图、事件渲染专题图 、组渲染专题图。
空间分析功能模块:最短路径查询。
六、各功能模块具体实现
在VB平台上加载MO插件,对每一个单独的功能模块进行具体的编码设计,然后把所有的功能模块组建起来,进行测试,修改问题,完善BUG。
第二篇:GIS二次开发试验报告
GIS二次开发程序设计实习报告
实验课程:GIS二次开发程序设计
实验名称:设计程序完成图像基本操作
班级: 地信101
学号: 1022062011
姓名: 汪翔
实验日期: 20## 年 4 月 5 日
GIS二次开发程序设计实习报告..................................................... 1
一.选题名称.................................................................................... 3
二.研究现状.................................................................................... 3
三.研究思路与方法........................................................................ 3
四.编程与实现................................................................................ 4
Arcmap下实现.................................................................................. 4
vb代码................................................................................................4
实现结果..........................................................................................12
VS下实现.........................................................................................13
C#代码..............................................................................................14
五.结果与分析.............................................................................. 21
一.选题名称
本次GIS二次程序设计实习中我所研究的是空间信息量算分析中的延伸率分析。
二.研究现状
GIS的发展引领着空间分析也在迅速的走向成熟,因为空间分析作为GIS的核心技术,同时也是区别于其它信息系统的主要特征,能够根据地理对象的位置和形态特征等采用相关分析模型对其进行综合性的分析、预测乃至决策和支持。本文针对空间分析在城市发展建设中的作用以及具体内容进行了探讨研究。
我所研究的延伸率是反应城市空间离散程度的一个重要指标,它的计算公式为:延伸率=L/L’
L为区域最长轴的长度,L’为区域最短轴的长度
三.研究思路与方法
当把城市当作单个面状目标看待时,可以直接使用面状目标的形状系数,如延伸率,形状比,紧凑度,圆形率等。这些指标计算较简单,反应一个抽象的形状。当把城市看成是面状目标的几何,可以使用放射状指数,标准面积指数等较为复杂的指标来计算。反应了城市内部的具体联系。根据这些指标,可以为政府决策,商业运行,旅游开发等一系列经济文化活动带来较为科学的评价指标和行为指导。在本次实习中,我所研究的方向是利用延伸率来研究城市的空间。
延伸率反应城市空间的带状延伸程度,带状延伸越明显则城市延伸率越大,反应城市的离散程度越大。
四.编程与实现
本次实习中主要利用的平台有ArcMap 以及Visual Studio,用于实现的语言有C#及VB,我在老师的指导和查阅书籍的情况下,分别用两种语言实现延伸率的量算,现将结果展示如下:
1)在ArcMap下利用VB进行实现:
1.创建一个UI按钮控件,重命名为延伸率,打开代码编辑窗口。
2.编写代码如下:
Private Sub UIButtonControl1_Click()
Dim pDoc As IMxDocument
Dim pMap As IMap
Dim pGraphic As IGraphicsContainer
Dim pLayer As ILayer
Dim pFeatLyr As IFeatureLayer
Dim pFeatCls As IFeatureClass
Dim pFeatCur As IFeatureCursor
Dim pFeat As IFeature
Dim pFld As IField
Dim pFldEdit As IFieldEdit
Dim iFldID As Integer
Dim pPlg As IPolygon
Dim pColl As New Collection
Dim dMinW As Double
Dim dMaxW As Double
Set pDoc = ThisDocument
Set pMap = pDoc.FocusMap
Set pLayer = pDoc.SelectedLayer
Set pGraphic = pMap
If pLayer Is Nothing Then
MsgBox "没有选中图层"
End If
If Not TypeOf pLayer Is IFeatureLayer Then
Exit Sub
End If
Set pFeatLyr = pLayer
Set pFeatCls = pFeatLyr.FeatureClass
iFldID = pFeatCls.FindField("shapeR")
If iFldID = -1 Then
Set pFld = New Field
Set pFldEdit = pFld
With pFldEdit
.Name = "shapeR"
.Type = esriFieldTypeDouble
.Precision = 6
.Scale = 2
End With
pFeatCls.AddField pFld
End If
iFldID = pFeatCls.FindField("shapeR")
Set pFeatCur = pFeatCls.Update(Nothing, False)
Set pFeat = pFeatCur.NextFeature
If pFeat Is Nothing Then
Exit Sub
End If
Do While Not pFeat Is Nothing
Set pPlg = pFeat.Shape
Set pColl = MaxDiameter(pPlg)
dMaxW = CalLength(pColl)
dMinW = MinWidth(pPlg, pColl)
shpR = dMaxW / dMinW
pFeat.Value(iFldID) = shpR
pFeatCur.UpdateFeature pFeat
Set pFeat = pFeatCur.NextFeature
Loop
If MsgBox("计算结束,是否显示属性表?", vbYesNo) = vbYes Then
Dim pTableWin As ITableWindow2
Dim pTableWinExit As ITableWindow
Set pTableWin = New TableWindow
Set pTableWinExit = pTableWin.FindViaLayer(pFeatLyr)
If pTableWinExit Is Nothing Then
Set pTableWin.Layer = pFeatLyr
pTableWin.TableSelectionAction = esriDrawFeatures
pTableWin.ShowSelected = False
pTableWin.ShowAliasNamesInColumnHeadings = True
Set pTableWin.Application = Application
Else
Set pTableWin = pTableWinExit
MsgBox "dddddddddd"
End If
If Not pTableWin.IsVisible Then
pTableWin.Show True
End If
End If
End Sub
Function MinWidth(ByVal aPlg As IPolygon, ByVal aCol As Collection) As Double
Dim aMin As Double
Dim pPntColl As IPointCollection
Set pPntColl = aPlg
Dim min As Double
Dim max As Double
Dim x1 As Double
Dim y1 As Double
Dim x2 As Double
Dim y2 As Double
Dim p1 As Double
Dim p2 As Double
Set p1 = aCol.Item(1)
Set p2 = aCol.Item(2)
x1 = p1.X
y1 = p1.Y
x2 = p2.X
y2 = p2.Y
Dim A As Double
Dim B As Double
Dim C As Double
A = y2 - y1
B = x1 - x2
C = x1 * (y2 - y1) + y1 * (x2 - x1)
Dim ICount As Long
ICount = pPntColl.PointCount
Dim pPnt As IPoint
For i = 0 To ICount - 1
Set pPnt = pPntColl.Point(i)
X = pPnt.X
Y = pPnt.Y
dis = (A * X + B * Y + C) / (A * A + B * B) ^ 0.5
If max = 0 Then
max = dis
ElseIf max < dis Then
max = dis
End If
If min = 0 Then
min = dis
ElseIf min > dis Then
min = dis
End If
Next
MinWidth = Abs(min - max)
End Function
Function MaxDiameter(ByVal plg As IPolygon) As Collection
Dim dMax As Double
Dim pPntColl As IPointCollection
Dim pPnt1 As IPoint
Dim pPnt2 As IPoint
Dim pLin As ILine
Dim dis As Double
Dim pM1 As IPoint
Dim pM2 As IPoint
Set pPntColl = plg
Dim ICount As Long
ICount = pPntColl.PointCount
For i = 0 To ICount - 1
Set pPnt1 = pPntColl.Point(i)
For j = i + 1 To ICount - 1
Set pPnt2 = pPntColl.Point(j)
Set pLin = New Line
pLin.PutCoords pPnt1, pPnt2
dis = pLin.Length
If dMax = 0 Then
dMax = dis
Set pM1 = pPnt1
Set pM1 = pPnt2
ElseIf dMax < dis Then
dMax = dis
Set pM1 = pPnt1
Set pM1 = pPnt2
End If
Next
Next
Dim aCol As New Collection
aCol.Add pM1
aCol.Add pM2
Set MaxDiameter = aCol
End Function
Function CalLength(ByVal aCol As Collection) As Double
Dim pLin As ILine
Set pLin = New Line
Dim p1 As IPoint
Dim p2 As IPoint
Set p1 = aCol.Item(1)
Set p2 = aCol.Item(2)
pLin.PutCoords p1, p2
CalLength = pLin.Length
End Function
3.经过调试 其结果显示如下:
2)根据在ArcMap中利用VB的程序设计结果,我在VS中利用C#从新编写代码,其步骤如下:
1.新建项目—>ArcGis下选择Extending ArcOpjects中的Class Library(命名为yanshenlv)—>选择DeskTop ArcMap下的Esri.ArcGis.SystemUI.—>删除Class1.cs,添加一个新建项—>选择Extending ArcOpjects中的Base Command(命名为yanshenlv)—>在接下来的对话框里面选择MapControl or PageLaYouControl Command
2以上基本准备工作已完成,进入程序的编写阶段,参照vb 代码。首先添加引用:
ESRI.ArcGIS.ArcMapUI;
ESRI.ArcGIS.Carto;
ESRI.ArcGIS.Framework;
ESRI.ArcGIS.Geodatabase;
ESRI.ArcGIS.Geometry;
System.Windows.Forms;
System.Collections;
所编写的代码如下:
ArcMap.Application.CurrentTool=null;
IApplicationpApp=ArcMap.Application;
IMxDocumentpDoc=pApp.DocumentasIMxDocument;
IMappMap=pDoc.FocusMap;
ILayerpLayer=pDoc.SelectedLayerasILayer;
IGraphicsContainerpGraphic=pMapasIGraphicsContainer;
if (pLayer==null)
{
MessageBox.Show("当前图层为空");
return;
}
if (!(pLayerisIFeatureLayer))
{
MessageBox.Show("当前图层不是多边形图层");
return;
}
{
IFeatureLayerpFeatLyr=pLayerasIFeatureLayer;
IFeatureClasspFeatCls=pFeatLyr.FeatureClass;
if (pFeatCls.ShapeType==esriGeometryType.esriGeometryPolygon)
{
intiFldID=pFeatCls.FindField("延伸率");
if (iFldID<0)
{
IFieldpFld=CreateFld("延伸率", esriFieldType.esriFieldTypeDouble, 14, 10, 6);
pFeatCls.AddField(pFld);
FldID=pFeatCls.FindField("延伸率");
IFeatureCursorpFeatCur=pFeatCls.Update(null, false);
IFeaturepFeat=pFeatCur.NextFeature();
while (pFeat!=null)
{
IPolygonpPlg=pFeat.ShapeasIPolygon;
ArrayListpColl=MaxDiameter(pPlg);
doubledMaxW=CaclLength(pColl);
doubledMinW=MinWidth(pPlg, pColl);
doubleJiSuan= (dMaxW/dMinW);
pFeat.set_Value(iFldID, JiSuan);
pFeatCur.UpdateFeature(pFeat);
pFeat=pFeatCur.NextFeature();
}
}
}
else
{
MessageBox.Show("当前文?档选中的图层不是矢量图层");
return;
}
MessageBox.Show("计算结束,打开属性表看看有没有数据");
}
}
publicIFieldCreateFld(stringname, esriFieldTypetype, intiLen, intiPrecision, intiScale)
{
IFieldpFld=newFieldClass();
IFieldEdit2pFldEdit= (IFieldEdit2)pFld;
pFldEdit.Name_2=name;
pFldEdit.Type_2=type;
pFldEdit.Length_2=iLen;
pFldEdit.Precision_2=iPrecision;
pFldEdit.Scale_2=iScale;
returnpFld;
}
publicArrayListMaxDiameter(IPolygon plg)
{
doubledMax=0;
doubledis;
IPointpPnt1;
IPointpPnt2;
IPointPM1=newPoint();
IPointPM2=newPoint();
IPointCollectionpPntColl=plgasIPointCollection;
longiCount=pPntColl.PointCount;
for (inti=0; i<iCount; i++)
{
pPnt1=pPntColl.get_Point(i);
for (intj=i+1; j<iCount; j++)
{
pPnt2=pPntColl.get_Point(j);
ILinepLin=newLine();
pLin.PutCoords(pPnt1, pPnt2);
dis=pLin.Length;
if (dMax==0)
{
dMax=dis;
PM1=pPnt1;
PM2=pPnt2;
}
else
{
dMax=dis;
PM1=pPnt1;
PM2=pPnt2;
}
}
}
ArrayListaCol=newArrayList();
aCol.Add(PM1);
aCol.Add(PM2);
returnaCol;
}
publicdoubleMinWidth(IPolygonaPlg, ArrayListaCol)
{
IPointp1=aCol[0] asIPoint;
IPointp2=aCol[1] asIPoint;
doubledis;
doublex1=p1.X;
doublex2=p2.X;
doubley1=p1.Y;
doubley2=p2.Y;
doubleA=y2-y1;
doubleB=x1-x2;
doubleX=0;
doubleY=0;
doubleC= (x1* (y2-y1) + (x2-x1) *y1);
doublemax=0;
doublemin=0;
IPointpPnt=newPoint();
IPointCollectionpPntColl=aPlgasIPointCollection;
longiCount=pPntColl.PointCount;
inti;
for (i=0; i<=iCount; i++)
{
pPnt=pPntColl.get_Point(i);
X=pPnt.X;
Y=pPnt.Y;
dis=Math.Sqrt((A*X+B*Y+C) / (A*A+B*B));
if (max==0)
{
max=dis;
}
else
{
max=dis;
}
if (min==0)
{
min=dis;
}
else
{
min=dis;
}
}
returnMath.Abs(min-max);
}
publicdoubleCaclLength(ArrayListaCol)
{
ILinepLin=newLine();
IPointp1=aCol[0] asIPoint;
IPointp2=aCol[1] asIPoint;
pLin.PutCoords(p1, p2);
returnpLin.Length;
}
3.调试程序,生产解决方案:
如图所示,解决方案生成成功
4.将生成成功的解决方案导入到一个建好的WindowsFormApplication 的Form1.cs设计窗口中(在toolbar属性的Item里面加载)这样我们就在系统中添加了一个用于计算图形延伸率的小控件。
五.结果与分析
这次的实习中所计算的延伸率是众多图形量算方法的其中一个,它在分析城市的离散性方面有着自己的作用。但是对于一个城市的形状评价不能单单从某一个方面来判断。对于一个城市形状的分析必须是城市建立在众多综合指标以及一些较复杂的指数上的。所以我们应该实现数据的共享,集成多种形状分析计算的功能,建立一个较为系统的形状分析计算的集合。而VS恰恰为我们提供了这样的平台,同时在学习过程中不断完善该系统的功能,实现对城市更为客观的分析。