GIS二次开发实验报告.docx
- 文档编号:14822397
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:92
- 大小:1.52MB
GIS二次开发实验报告.docx
《GIS二次开发实验报告.docx》由会员分享,可在线阅读,更多相关《GIS二次开发实验报告.docx(92页珍藏版)》请在冰点文库上搜索。
GIS二次开发实验报告
试验一系统界面布局
1、实验目的和要求
1.熟悉VisualBasic和MapObject程序的基本操作
2.设置GIS二次开发的界面,要求具有菜单栏、工具栏、图例控件、主窗体、鹰眼以及状态栏。
2、实验内容
1.利用VisualBasic和MapObject完成界面设计
2.在设计的界面上一次添加菜单栏、工具栏、图例控件、主体窗、鹰眼及状态栏。
3、实验步骤
1、VB界面的打开和空间的添加
打开VB6.0软件,选择标准EXE工程窗口如下
添加MapObject2.4插件
2、主窗体界面的添加
点击mapObjece控件在工程窗口中选定一定范围,作为现实窗口如下
3、菜单栏的添加
利用快捷键Ctrl+E,调出菜单编辑器,如下
在表题中输入“文件”,名称中输入“mnuOpenShpFile”点击确定即可获得一个文件菜单,如下所示
同样的方法输入“打开Shp文件”点击一个向右的箭头,使得输入的“打开Shp文件”作为“文件”菜单的子菜单
按照同样的方法添加自己需要的主菜单。
4、工具栏的添加
利用toolbar控件和imagelist控件完成菜单栏的设置
用Toolbar在工具栏添加工具按钮如下
在imagelist中添加图片
在工具按钮中点击按钮属性,在图像列表中进行图片的链接,如下
最后的工具如下
5、图层控件的添加
添加MapObjecLegendControl控件,利用该空间在主视窗口最左侧添加图例
在格式菜单下选择顶部对齐选项,调整去高度和宽度,最后的图例如下
6、状态栏的添加
利用StatuBar控件在Form底部添加状态栏,调整图例窗口和主视窗口的间距最后的结果如下
7、鹰眼的添加
在图例窗口下新创建一个Map窗口,宽度和图例一致,高度适度调整,最后整个界面设计就完成了
8、最后的系统界面布局如下:
实验二文件主菜单下功能的实现
1、文件添加功能的实现
1.打开单个SHP文件功能的实现
代码如下:
PrivateSub打开Shp文件_Click(IndexAsInteger)
'第一步,定义一个新的MO对象组的DataConnection对象
DimdConnAsNewMapObjects2.DataConnection
'第二步,定义一个新的MO对象组的MapLayer对象
DimshpLayerAsNewMapObjects2.MapLayer
DimfilenameAsString
'设置对话框过滤器
comdlgOpenShp.Filter="ESRIShape文件(*.shp)|*.shp"
'对话框显示为打开类型的对话框
comdlgOpenShp.ShowOpen
'如果打开文件名的长度为0,则终止这个过程
IfLen(comdlgOpenShp.filename)=0ThenExitSub
'设置DataConnection对象的方法Connection连接到当前目录
dConn.Database=CurDir'App.path
IfNotdConn.ConnectThenExitSub
'MsgBoxdConn.Connect
'得到从对话框返回的文件名
filename=Left(comdlgOpenShp.FileTitle,Len(comdlgOpenShp.FileTitle)-4)
'设置图层的数据集
SetshpLayer.GeoDataset=dConn.FindGeoDataset(filename)
'增加新图层
Map1.Layers.AddshpLayer
结果如下:
最后把美国SHP文件加载进来如下所示
2.打开多个shp文件功能的实现:
代码如下:
DimworkDirAsString
DimdbconAsNewMapObjects2.DataConnection
DimfullPathAsString
DimfilenameAsString
DimcurlyrAsNewMapObjects2.MapLayer
cdlgOpenShp.Filter="ESRIshapefile(*.shp)|*.shp|CADfile(*.dwg)|*.dwg"
cdlgOpenShp.Flags=&H200Or&H1000Or&H80000
cdlgOpenShp.Flags=cdlOFNAllowMultiselectOrcdlOFNExplorer
cdlgOpenShp.ShowOpen
fullPath=cdlgOpenShp.filename
Dims()AsString
DimiAsInteger
DimjAsInteger
s=Split(fullPath,Chr$(0))'Chr$(0)是一个空位字符,表示字符串的结束
workDir=s(0)
IfworkDir<>""Then
dbcon.Database=workDir
EndIf
IffullPath<>""Then
j=UBound(s)
Fori=1Toj
Ifs(i)<>""Then
curlyr.GeoDataset=dbcon.FindGeoDataset(s(i))
MainMap.Layers.Addcurlyr
BirdEye.Layers.Addcurlyr
Setcurlyr=Nothing
Else
MsgBox"找不到文件",vbCritical
EndIf
Next
Else
MsgBox"找不到文件",vbCritical
EndIf
最后结果如下:
可以看见所有的图层都被选中,点击打开即可。
实验三图层主菜单下功能的实现
1、放大:
’对全局变量赋值为1
iFlag=1
’鼠标的现实为放大图标
MainMap.MousePointer=moZoomIn
2、缩小:
’对全局变量赋值为2
iFlag=2
’鼠标的现实为缩小图标
MainMap.MousePointer=moZoomOut
3、平移:
’对全局变量赋值为3
iFlag=3
’鼠标的现实为移动图标
MainMap.MousePointer=moPan
4、全视图:
’对全局变量赋值为4
iFlag=4
’鼠标的现实为还原图标
MainMap.MousePointer=moArrow
在MoeseDown下触发事件,代码如下:
IfiFlag=1Then
'定义一个临时变量tmpExtent
DimtmpExtentAsMapObjects2.Rectangle
'把鼠标范围赋值给临时变量empExtent
SettmpExtent=MainMap.TrackRectangle
'把临时变量的范围赋值为地图主视窗
SetMainMap.Extent=tmpExtent
EndIf
IfiFlage=2Then
'地图范围赋给一个变量R
Setr=MainMap.Extent
'r的指缩小1.5倍
r.ScaleRectangle1.5
'把缩小的窗口范围赋值为主视窗
MainMap.Extent=r
EndIf
IfiFlag=3Then
'进行移动操作
MainMap.Pan
EndIf
IfiFlag=4Then
'把整个范围赋值给当前主视窗
SetMainMap.Extent=MainMap.FullExtent
EndIf
最后的结果如下
缩小、平移、全视图操作不方便截图,就不显示其结果
5、获取当前图层功能的实现
代码如下:
PrivateSubmnuLayerGetCurrentLayerIndex_Click()
'定义index为整型
DimindexAsInteger
'将图例中的活动图层赋值于index
index=LayerControl.getActiveLayer
Ifindex<>-1Then
MsgBox"当前图层名称为:
"&MainMap.Layers(index).Name&vbCrLf&vbCrLf&"当前图层索引为:
"&index,vbInformation,"当前图层信息"
Else
MsgBox"没有当前活动图层",vbCritical,"警告"
EndIf
EndSub
结果如下所示:
6、获取图层数目功能的实现
代码如下:
PrivateSubmnuLayerGetLayerNumber_Click()
MsgBox"图层数为:
"&MainMap.Layers.Count
EndSub
结果如下:
7、删除当前图层功能的实现
代码如下:
PrivateSubmnuLayerDeleteCurLayer_Click()
'定义index为整型
DimindexAsInteger
'将图例中的活动图层赋值于index
index=LayerControl.getActiveLayer
'在MainMap中删除所选的活动图层
MainMap.Layers.Removeindex
'重新加载图例
LayerControl.LoadLegend
'在BirdEye中删除所选的活动图层
BirdEye.Layers.Removeindex
EndSub
结果如下:
选中STATES图层,进行删除当前图层操作
8、删除全部图层功能的实现
代码如下:
PrivateSubmnuLayerDeleteAllLayer_Click()
'清除MainMap所有图层
MainMap.Layers.Clear
'清除所有图例
LayerControl.RemoveAll
'清除鹰眼所有图层
BirdEye.Layers.Clear
EndSub
结果如下
实验四地图控制器、鹰眼、状态栏功能的实现
1、地图控制器功能的实现:
代码如下:
'将主体窗上的图层容器设置为图例的地图数据
LayerControl.setMapSourceMainMap
'加载图例
LayerControl.LoadLegendTrue
实现的效果如下
2、鹰眼功能的实现
2.1绘制红色边框
代码如下:
PrivateSubBirdEye_AfterTrackingLayerDraw(ByValhdcAsstdole.OLE_HANDLE)
'定义一个sym的矩形变量
DimsymAsNewSymbol
'变量的边框颜色为红色
sym.OutlineColor=moRed
'变量的尺寸大小为2
sym.Size=2
'该矩形变量的填充颜色为无色
sym.Style=moTransparentFill
'该矩形范围为整个鹰眼的范围
BirdEye.DrawShapeMainMap.Extent,sym
运行结果如下:
2.2实现MouseDown,代码如下:
PrivateSubBirdEye_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
DimpAsPoint
’把当前鼠标在鹰眼中的坐标赋值给变量P
Setp=BirdEye.ToMapPoint(x,y)
’如果该点在主视图窗口的范围内
IfMainMap.Extent.IsPointIn(p)Then
’就把当前的窗口范围赋值给g_feedback变量
Setg_feedback=NewDragFeedback
g_feedback.DragStartMainMap.Extent,BirdEye,x,y
2.3实现MouseMove,代码如下
IfNotg_feedbackIsNothingThen
g_feedback.DragMovex,y
EndIf
2.4实现MouseUp,代码如下:
IfNotg_feedbackIsNothingThen
MainMap.Extent=g_feedback.DragFinish(x,y)
Setg_feedback=Nothing
EndIf
最后的结果如下:
3、状态栏功能的实现
代码如下:
PrivateSubForm_Load()
StatusBar1.Panels
(1).Text="GIS二次开发实验系统"
StatusBar1.Panels
(2).Text="2010级地信一班_10260123_何顺兵"
结果如下:
实验五绘图主菜单下功能的实现
1、画点功能的实现,代码如下:
PrivateSubmnuDrawPoint_Click()
iFlag=5
MainMap.MousePointer=moCross
EndSub
PrivateSubMainMap_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfiFlag=5Then
DimPointAsNewMapObjects2.Point
SetPoint=MainMap.ToMapPoint(x,y)
DimevPointAsNewMapObjects2.GeoEvent
SetevPoint=MainMap.TrackingLayer.AddEvent(Point,0)
EndIf
结果如下:
2、画线功能的实现,代码如下:
PrivateSubmnuDrawLine_Click()
iFlag=6
MainMap.MousePointer=moCross
EndSub
PrivateSubMainMap_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfiFlag=6Then
DimlineAsNewMapObjects2.line
Setline=MainMap.TrackLine
DimevLineAsNewMapObjects2.GeoEvent
SetevLine=MainMap.TrackingLayer.AddEvent(line,0)
EndIf
结果如下:
3、画多边形功能的实现,代码如下:
PrivateSubmnuDrawPolygon_Click()
iFlag=7
MainMap.MousePointer=moCross
EndSub
PrivateSubMainMap_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfiFlag=7Then
DimPolygonAsNewMapObjects2.Polygon
SetPolygon=MainMap.TrackPolygon
DimevPolygonAsNewMapObjects2.GeoEvent
SetevPolygon=MainMap.TrackingLayer.AddEvent(Polygon,0)
EndIf
结果如下:
4、画圆功能的实现,代码如下:
PrivateSubmnuDrawEllips_Click()
iFlag=9
MainMap.MousePointer=moCross
EndSub
PrivateSubMainMap_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
IfiFlag=9Then
DimEllipseAsNewMapObjects2.Ellipse
SetEllipse=MainMap.TrackCircle
DimevEllipseAsNewMapObjects2.GeoEvent
SetevEllipse=MainMap.TrackingLayer.AddEvent(Ellipse,0)
EndIf
结果如下:
5、添加文本功能的实现
代码如下:
PrivateSubmnuDrawAddText_Click()
iFlag=10
MainMap.MousePointer=moCross
EndSub
IfiFlag=10Then
DimstrGraphicTxtAsString
DimpositionGraphicTxtAsMapObjects2.Point
strGraphicTxt=InputBox("请输入文本","添加文本")
SetpositionGraphicTxt=MainMap.ToMapPoint(x,y)
collGtextStrings.AddstrGraphicTxt
collGtextPoints.AddpositionGraphicTxt
MainMap.Refresh
EndIf
PrivateSubMainMap_AfterTrackingLayerDraw(ByValhdcAsstdole.OLE_HANDLE)
'***************添加绘制文本信息*******************
DimiAsLong
IfcollGtextStrings.count>0Then
Fori=1TocollGtextStrings.count
MainMap.DrawTextcollGtextStrings(i),collGtextPoints(i),symGtext
Next
EndIf
MainMap.Refresh
EndSub
最后的结果如下:
6、工具栏功能的实现
加载图层的代码如下:
PrivateSubToolAddLayer_ButtonClick(IndexAsInteger,ByValButtonAsComctlLib.Button)
'选择Button的关键字作为索引
SelectCaseButton.Key
'选择的AaaLayer作为关键字
Case"AddLayer"
'调用主菜单下打开SHP文件的功能
CallmnuFileOpenSingleShp_Click
EndSelect
EndSub
其他button功能的实现的跟这个类似。
实验六视图菜单下功能的实现
1、比例尺窗口功能的实现
首先新建一个比例尺From,并改名为freScaleCbr,结果如下:
在该Form添加一个Frame如下:
在改Frame上添加一个比例尺空间,并改名为MapScaleBar,结果如下:
代码如下:
PrivateSubRefreshScale()
frmScaleBar.MapScaleBar.MapExtent.MaxX=frmMain.MainMap.Extent.Right
frmScaleBar.MapScaleBar.MapExtent.MinX=frmMain.MainMap.Extent.Left
frmScaleBar.MapScaleBar.MapExtent.MaxY=frmMain.MainMap.Extent.Bottom
rmScaleBar.MapScaleBar.MapExtent.MinY=frmMain.MainMap.Extent.Top
frmScaleBar.MapScaleBar.PageExtent.MinX=frmMain.MainMap.LeftScreen.TwipsPerPixelX
frmScaleBar.MapScaleBar.PageExtent.MinY=frmMain.MainMap.Top/Screen.TwipsPerPixelYfrmScaleBar.MapScaleBar.PageExtent.MaxX=(frmMain.MainMap.Left+frmMain.MainMap.Width)/Screen.TwipsPerPixelXfrmScaleBar.MapScaleBar.PageExtent.MaxY=(frmMain.MainMap.Top+frmMain.MainMap.Height)/Screen.TwipsPerPixelY
frmScaleBar.MapScaleBar.Refresh
EndSub
PrivateSubmnuViewScaleBar_Click()
CallRefreshScale
frmScaleBar.Show
EndSub
最后结果如下:
二、地图背景色功能的实现
首先构造如下布局的窗体:
背景颜色出的代码如下:
PrivateSubTextBackColor_Click()
'显示颜色
comDlgBackColor.ShowColor
'把选择的颜色赋值给选择颜色文本框的背景色
TextBackColor.BackColor=comDlgBackColor.Color
EndSub
结果如下:
首先运行MainMapBackColor,如下
点击背景颜色,选择颜色:
点击确定:
确定和取消的代码如下
确定:
PrivateSubBackcod1_Click()
frmMain.MainMap.BackColor=comDlgBackColor.Color
frmMain.BirdEye.BackColor=comDlgBackColor.Color
UnloadMainMapBackColor
EndSub
取消:
PrivateSubBackComm2_Click()
UnloadM
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GIS 二次开发 实验 报告