最近刚拿到arcgis9.3,9.3确实比9.2好用多了
使用过程中,发现一些小问题:
(1)shape文件的字段名,不能超过五个汉字或10个字母和数字字符,否则生成shape出错,以下是判断汉字还是英文字的程序
InputStr = "汉"
If Asc(InputStr) < 0 Then
gbascii = AscB(StrConv(InputStr, vbFromUnicode))
'区位码在16区之后的为汉字
If gbascii - 160 > 15 Then
Print "是汉字"
Else
Print "是全角符号"
End If
Else
Print "是半角英文或数字"
End If
(2)在arcmap中编辑shape文件时,注意尽量用拷贝而不要用剪切,容易出错并造成混乱
(3)同一数据库的shape文件不能重名,即使它们用数据集(dataset)分开也不行
(4)项目中shape文件编辑完成后,要对shape进行拓扑检查,删除重复和编辑错误的要素
(5) 拷贝数据库下的要素集到母的要素集
Private Sub CopyOthers2First_Click()
Dim pOrigFeatWorkspace As IFeatureWorkspace
Dim pDestFeatWorkspace As IFeatureWorkspace
Dim pWSF As IWorkspaceFactory
Dim pWS As IWorkspace
Dim pEnumDataset As IEnumDataset
Dim pEnumDataset_FD As IEnumDataset
Dim pDataset_FD As IDataset
Dim pDataset As IDataset
Dim pDestFeatureClass As IFeatureClass
Set pWSF = New AccessWorkspaceFactory
'Open the origin and destination workspaces. *** Modify the pathnames appropriately.
Set pOrigFeatWorkspace = pWSF.OpenFromFile(".mdb", 0)
Set pDestFeatWorkspace = pWSF.OpenFromFile(".mdb", 0)
Set pDestFeatureClass = pDestFeatWorkspace.OpenFeatureClass("汇总")
Set pWS = pOrigFeatWorkspace
Set pEnumDataset = pWS.Datasets(esriDTAny)
pEnumDataset.Reset
Set pDataset = pEnumDataset.Next
Do Until pDataset Is Nothing
Select Case pDataset.Type
Case esriDTFeatureDataset
Set pEnumDataset_FD = pDataset.Subsets
Set pDataset_FD = pEnumDataset_FD.Next
Do Until pDataset_FD Is Nothing
If pDataset_FD.Type = esriDTFeatureClass Then
'MsgBox "Updating GUID's for " & pDataset_FD.Name
'Call SetGUID(pDataset_FD)
'复制要素
fw.WriteLine pDataset_FD.BrowseName
copyFeature2Dest pDataset_FD, pDestFeatureClass
fw.WriteLine " "
End If
Set pDataset_FD = pEnumDataset_FD.Next
Loop
Case esriDTFeatureClass, esriDTTable
'Call SetGUID(pDataset)
'MsgBox "Updating GUID's for " & pDataset.Name
'复制要素
fw.WriteLine pDataset.BrowseName
copyFeature2Dest pDataset, pDestFeatureClass
fw.WriteLine " "
End Select
Set pDataset = pEnumDataset.Next
Loop
MsgBox "完成."
End Sub
''拷贝要素到目的要素集
Private Function copyFeature2Dest(pSrcDataset As IDataset, pDestFeatureClass As IFeatureClass)
On Error Resume Next ' 改变错误处理的方式。
Dim pInputFCls As IFeatureClass
Set pInputFCls = pSrcDataset
' get the workspace and start editing
Dim pDataset As IDataset
Set pDataset = pDestFeatureClass
Dim pWorkspace As IWorkspace
Set pWorkspace = pDataset.Workspace
Dim pWorkspaceEdit As IWorkspaceEdit
Set pWorkspaceEdit = pWorkspace
pWorkspaceEdit.StartEditing True
pWorkspaceEdit.StartEditOperation
' open a cursor on the input feature class with the given query filter
Dim pFeatCursor As IFeatureCursor
Set pFeatCursor = pInputFCls.Search(Nothing, False)
' loop through the input features in the cursor, and insert
' them into the destination feature class. This is slow since we must use
' IFeature::Store to mimic an edit session.
Dim pFeat As IFeature
Dim pRow As IRow
Dim pFlds As IFields
Dim lSFld As Long
Dim i As Long
Set pRow = pFeatCursor.NextFeature
Do Until pRow Is Nothing
Set pFeat = pDestFeatureClass.CreateFeature
Set pFlds = pFeat.Fields
For i = 0 To pFlds.FieldCount - 1
lSFld = pRow.Fields.FindField(pFlds.field(i).Name)
If StrComp(pFlds.field(i).Name, "OBJECTID") <> 0 And StrComp(pFlds.field(i).Name, "Shape_Length") <> 0 _
And StrComp(pFlds.field(i).Name, "Shape_Area") <> 0 Then
If StrComp(pFlds.field(i).Name, "Shape") = 0 Then
pFeat.Value(i) = pRow.Value(lSFld)
Else
If lSFld <> -1 Then
pFeat.Value(i) = CStr(pRow.Value(lSFld))
End If
End If
Else
fw.WriteLine CStr(pRow.Value(lSFld))
End If
Next i
pFeat.Store
' get next row
Set pRow = pFeatCursor.NextFeature
Loop
pWorkspaceEdit.StopEditOperation
pWorkspaceEdit.StopEditing True
'out:
' If Err.Number <> 0 Then
' msg = "Error # " & str(Err.Number) & " was generated by " _
' & Err.Source & Chr(13) & Err.Description
' MsgBox msg, , "Error", Err.HelpFile, Err.HelpContext
' End If
End Function