实验指导书GeoDataBase2.docx
- 文档编号:7039702
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:25
- 大小:20.19KB
实验指导书GeoDataBase2.docx
《实验指导书GeoDataBase2.docx》由会员分享,可在线阅读,更多相关《实验指导书GeoDataBase2.docx(25页珍藏版)》请在冰豆网上搜索。
实验指导书GeoDataBase2
1GeoDataBase
1.1如何建立文件连接(Join/Link)
本例实现的是如何将地图中的一个FeatureLayer的属性表与另一个数据文件建立连接。
●要点
首先需要定义两个ITable接口对象,分别用来获得地图中的属性表和需要连接的数据文件,再通过IMemoryRelationshipClassFactory.Open方法将两个ITable接口对象根据某个关键字段建立连接,
最后使用IDisplayRelationshipClass.DisplayRelationshipClass方法将显示该连接
主要用到IMemoryRelationshipClassFactory接口,IRelationshipClass接口和IDisplayRelationshipClass接口。
●程序说明
函数Join是将当前激活的地图中名称为sLayerName的图层和路径为sFilePath、文件名为sFileName的文件按字段名为sFieldName的字段进行连接。
●代码
PrivateFunctionJoin(ByValsLayerNameAsString,ByValsFilePathAsString,_
ByValsFileNameAsString,ByValsFieldNameAsString)AsBoolean
DimpMxDocumentAsIMxDocument
DimpMapAsIMap
DimpWorkspaceFactoryAsIWorkspaceFactory
DimpWorkspaceAsIWorkspace
DimpFeatureWorkspaceAsIFeatureWorkspace
DimpFeatureLayerAsIFeatureLayer
DimpFeatureClassAsIFeatureClass
DimpPrimaryTableAsITable
DimpForeignTableAsITable
DimpDisplayTableAsIDisplayTable
DimpMemoryRelationshipCFAsIMemoryRelationshipClassFactory
DimpRelationshipClassAsIRelationshipClass
DimpDisplayRelationshipCAsIDisplayRelationshipClass
DimnNumberAsInteger
DimsForeignFileAsString
OnErrorGoToErrorHandler:
Join=False
sForeignFile=Dir(sFilePath&"\"&sFileName)
If(sForeignFile="")Then
MsgBox"TheForeignFileisnotexist."
ExitFunction
EndIf
SetpWorkspaceFactory=NewShapefileWorkspaceFactory
SetpWorkspace=pWorkspaceFactory.OpenFromFile(sFilePath,0)
SetpFeatureWorkspace=pWorkspace
SetpForeignTable=pFeatureWorkspace.OpenTable(sFileName)
SetpMxDocument=ThisDocument
SetpMap=pMxDocument.FocusMap
FornNumber=0TopMap.LayerCount-1
IfpMap.Layer(nNumber).Name=sLayerNameThen
SetpFeatureLayer=pMap.Layer(nNumber)
ExitFor
EndIf
Next
IfpFeatureLayerIsNothingThen
MsgBox"NoLayer'sNameis"&sLayerName
ExitFunction
EndIf
SetpDisplayTable=pFeatureLayer
SetpFeatureClass=pDisplayTable.DisplayTable
SetpPrimaryTable=pFeatureClass
SetpMemoryRelationshipCF=NewMemoryRelationshipClassFactory
SetpRelationshipClass=pMemoryRelationshipCF.Open("TabletoLayer",pPrimaryTable,sFieldName,_
pForeignTable,sFieldName,"forward","backward",esriRelCardinalityOneToOne)
SetpDisplayRelationshipC=pFeatureLayer
pDisplayRelationshipC.DisplayRelationshipClasspRelationshipClass,esriLeftOuterJoin
Join=True
ExitFunction
ErrorHandler:
MsgBoxErr.Description
EndFunction
PrivateSubUIButtonControl1_Click()
DimpVBProjectAsVBProject
OnErrorGoToErrorHandler:
SetpVBProject=ThisDocument.VBProject
Join"WorldCountries",pVBProject.FileName&"\..\..\..\.."&"\data","Continents.dbf","FID"
ExitSub
ErrorHandler:
MsgBoxErr.Description
EndSub
1.2如何浏览纪录(属性查询)
本例实现的是如何按照给定的查询要求,找出满足要求的记录。
●要点
创建IQueryFilter接口对象,设置IQueryFilter.WhereClause属性为属性查询条件,使用IFeatureClass.Search方法进行查询,返回ICursor接口对象
主要用到了IFeatureClass接口、IFeature接口、IFeatureCursor接口和IQueryFilter接口。
●程序说明
函数SelectFeatures在当前激活的Map的第一个图层中查出"FID<2"的所有记录。
●代码
PrivateSubSelectFeatures()
DimpMxDocumentAsIMxDocument
DimpMapAsIMap
DimpFeatureLayerAsIFeatureLayer
DimpFeatureClassAsIFeatureClass
DimpFeatureAsIFeature
DimpFeatureCursorAsIFeatureCursor
DimpQueryFilterAsIqueryFilter
OnErrorGoToErrorHandler:
SetpMxDocument=ThisDocument
SetpMap=pMxDocument.FocusMap
If(pMap.LayerCount=0)Then
MsgBox("缺少数据")
ExitSub
EndIf
SetpFeatureLayer=pMap.Layer(0)
SetpFeatureClass=pFeatureLayer.FeatureClass
SetpQueryFilter=NewQueryFilter
pQueryFilter.WhereClause="FID<2"
SetpFeatureCursor=pFeatureClass.Search(pQueryFilter,False)
SetpFeature=pFeatureCursor.NextFeature
DoWhileNotpFeatureIsNothing
'MoreOperations
SetpFeature=pFeatureCursor.NextFeature
Loop
ExitSub
ErrorHandler:
MsgBoxErr.Description
EndSub
PrivateSubUIButtonControl1_Click()
OnErrorGoToErrorHandler:
SelectFeatures
ExitSub
ErrorHandler:
MsgBoxErr.Description
EndSub
1.3如何编辑记录
本例实现的是如何修改FeatureClass中某条记录(Feature)的值。
●要点
通过IFeatureClass.Update方法获得可修改记录的IFeatureCursor接口对象,使用IFeatureCursor.NextFeature方法获得Ifeatur接口对象,修改其属性值,通过IFeatureCursor.UpdateFeature方法提交IFeature修改内容。
主要用到IFeatureCursor接口
●程序说明
函数OpenFeatureClass获得当前激活的Map中第一层的IFeatureClass接口对象。
函数EditFeature修改pFeatureClass中第一条记录的第七个字段的值。
●代码
PrivateFunctionEditFeature(pFeatureClassAsIFeatureClass)AsBoolean
DimpFeatureAsIFeature
DimpFeatureCursorAsIFeatureCursor
OnErrorGoToErrorHandler:
EditFeature=False
If(pFeatureClassIsNothing)Then
ExitFunction
EndIf
SetpFeatureCursor=pFeatureClass.Update(Nothing,False)
SetpFeature=pFeatureCursor.NextFeature
If(NotpFeatureIsNothing)Then
pFeature.Value(6)="NewPlace"
pFeatureCursor.UpdateFeaturepFeature
MsgBox("修改成功")
EditFeature=True
Else
MsgBox("修改失败")
EndIf
ExitFunction
ErrorHandler:
MsgBoxErr.Description
EndFunction
PrivateFunctionOpenFeatureClass()AsIFeatureClass
DimpMxDocumentAsIMxDocument
DimpMapAsIMap
DimpFeatureLayerAsIFeatureLayer
DimpFeatureClassAsIFeatureClass
OnErrorGoToErrorHandler:
SetOpenFeatureClass=Nothing
SetpMxDocument=ThisDocument
SetpMap=pMxDocument.FocusMap
If(pMap.LayerCount=0)Then
MsgBox("缺少数据")
ExitFunction
EndIf
SetpFeatureLayer=pMap.Layer(0)
SetpFeatureClass=pFeatureLayer.FeatureClass
SetOpenFeatureClass=pFeatureClass
ExitFunction
ErrorHandler:
MsgBoxErr.Description
EndFunction
PrivateSubUIButtonControl1_Click()
OnErrorGoToErrorHandler:
DimpFeatureClassAsIFeatureClass
SetpFeatureClass=OpenFeatureClass()
EditFeaturepFeatureClass
ExitSub
ErrorHandler:
MsgBoxErr.Description
EndSub
1.5如何增加记录
本例要实现的是如何在FeatureClass中新增一条记录(Feature)。
●要点
通过IFeatureClass.Insert方法获得可插入记录的游标IFeatureCursor,然后使用IFeatureClass.CreateFeatureBuff方法获得IFeatureBuffer接口实例,使用IFeatureCursor.InsertFeature方法插入记录。
主要用到IFeatureCursor接口。
●程序说明
函数OpenFeatureClass获得当前激活的Map中第一层的IFeatureClass接口对象。
函数InsertFeature在pFeatureClass中添加一条记录。
●代码
PrivateFunctionInsertFeature(pFeatureClassAsIFeatureClass)AsBoolean
DimpFeatureCursorAsIFeatureCursor
DimpFeatureBufferAsIFeatureBuffer
DimnFeatureNumberAsInteger
OnErrorGoToErrorHandler:
InsertFeature=False
If(pFeatureClassIsNothing)Then
ExitFunction
EndIf
SetpFeatureCursor=pFeatureClass.Insert(True)
SetpFeatureBuffer=pFeatureClass.CreateFeatureBuffer
nFeatureNumber=-1
pFeatureBuffer.Value(6)="InsertLand"
nFeatureNumber=pFeatureCursor.InsertFeature(pFeatureBuffer)
If(nFeatureNumber<>-1)Then
MsgBox("添加了第"&nFeatureNumber&"条记录")
InsertFeature=True
Else
MsgBox("添加失败")
InsertFeature=False
EndIf
ExitFunction
ErrorHandler:
MsgBoxErr.Description
EndFunction
PrivateFunctionOpenFeatureClass()AsIFeatureClass
DimpMxDocumentAsIMxDocument
DimpMapAsIMap
DimpFeatureLayerAsIFeatureLayer
DimpFeatureClassAsIFeatureClass
OnErrorGoToErrorHandler:
SetOpenFeatureClass=Nothing
SetpMxDocument=ThisDocument
SetpMap=pMxDocument.FocusMap
If(pMap.LayerCount=0)Then
MsgBox("缺少数据")
ExitFunction
EndIf
SetpFeatureLayer=pMap.Layer(0)
SetpFeatureClass=pFeatureLayer.FeatureClass
SetOpenFeatureClass=pFeatureClass
ExitFunction
ErrorHandler:
MsgBoxErr.Description
EndFunction
PrivateSubUIButtonControl1_Click()
OnErrorGoToErrorHandler:
DimpFeatureClassAsIFeatureClass
SetpFeatureClass=OpenFeatureClass()
InsertFeaturepFeatureClass
ExitSub
ErrorHandler:
MsgBoxErr.Description
EndSub
1.6如何删除记录
本例要实现的是如何在FeatureClass中删除一条记录(Feature)。
●要点
获得游标IFeatureCursor,然后定义IFeature接口对象,并获得要删除的记录,最后使用IFeature.Delete方法删除记录。
主要用到IFeature接口和IFeatureCursor接口。
●程序说明
函数OpenFeatureClass获得当前激活的Map中第一层的IFeatureClass接口对象。
函数DeleteFeature删除PLACENAME字段值为”InsertLand”的所有记录。
●代码
PrivateSubDeleteFeature(pFeatureClassAsIFeatureClass)
DimpFeatureAsIFeature
DimpFeatureCursorAsIFeatureCursor
DimpQueryFilterAsIQueryFilter
DimnFeatureNumberAsInteger
OnErrorGoToErrorHandler:
If(pFeatureClassIsNothing)Then
ExitSub
EndIf
SetpQueryFilter=NewQueryFilter
pQueryFilter.WhereClause="PLACENAME='InsertLand'"
SetpFeatureCursor=pFeatureClass.Search(pQueryFilter,False)
SetpFeature=pFeatureCursor.NextFeature
nFeatureNumber=0
DoWhileNotpFeatureIsNothing
pFeature.Delete
nFeatureNumber=nFeatureNumber+1
SetpFeature=pFeatureCursor.NextFeature
Loop
MsgBox("Delete "&nFeatureNumber&" Features")
ExitSub
ErrorHandler:
MsgBoxErr.Description
EndSub
PrivateFunctionOpenFeatureClass()AsIFeatureClass
DimpMxDocumentAsIMxDocument
DimpMapAsIMap
DimpFeatureLayerAsIFeatureLayer
DimpFeatureClassAsIFeatureClass
OnErrorGoToErrorHandler:
SetOpenFeatureClass=Nothing
SetpMxDocument=ThisDocument
SetpMap=pMxDocument.FocusMap
If(pMap.LayerCount=0)Then
MsgBox("缺少数据")
ExitFunction
EndIf
SetpFeatureLayer=pMap.Layer(0)
SetpFeatureClass=pFeatureLayer.FeatureClass
SetOpenFeatureClass=pFeatureClass
ExitFunction
ErrorHandler:
MsgBoxErr.Description
EndFunction
PrivateSubUIButtonControl1_Click()
OnErrorGoToErrorHandler:
DimpFeatureClassAsIFeatureClass
SetpFeatureClass=OpenFeatureClass()
DeleteFeaturepFeatureClass
ExitSub
ErrorHandler:
MsgBoxErr.Description
EndSub
1.7如何纪录排序(ITableSort)
本例要实现的是如何将一个FeatureClass中的数据按某字段的值进行排序。
●要点
定义ITableSort接口对象,并用TableSort类实现之,设置排序所用到的字段、排序方式(升序或降序)以及排序的数据源,然后使用ITableSort.Sort方法进行排序。
主要用到ITableSort接口。
●程序说明
函数OpenFeatureClass获得当前激活的Map中第一层的IFeatureClass接口对象。
函数SortFeatures按照pFeatureClass的第五个字段值对pFeatureClass的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 指导书 GeoDataBase2