|
阅读:3589回复:17
[分享]DBA的VB+AO的开发总结zz
<P>看到这个写得不错,所以转过来大家看看,大家可以讨论下,也可以解决大家在开发中的一些难题。</P>
<P>项目结构是DB管理工具把文本倒入Oracle数据库,然后上层开发读库显示。用户操作过程中选择产生的中间结果也都要求DB提供临时表,显示的部分Join该临时表用于显示,临时表的删除是夜间批处理。 </P> <br> <P>VB+AO的开发是现学现用,希望能让将来的同志节约点时间。</P> <P><B>创建到Oracle的连接</B> <P><BR>"******************************************************************<BR>"Function: SDEConnect will create the connection to SDE Database<BR>"Input : Server , Instance, User, Password<BR>"Output : IFeatureWorkspace struction<BR>"******************************************************************<BR>Public Function SDEConnect(ByVal server As String, _<BR> ByVal instance As String, _<BR> ByVal user As String, _<BR> ByVal password As String) As IFeatureWorkspace<BR> <BR>On Error GoTo Error_h<BR> "Create ArcSDE Connection<BR> Dim pPropertyset As IPropertySet<BR> Set pPropertyset = New PropertySet<BR> <BR> "Set SDE DB Connect info here<BR> With pPropertyset<BR> .SetProperty "SERVER", server<BR> .SetProperty "INSTANCE", instance<BR> .SetProperty "USER", user<BR> .SetProperty "PASSWORD", password<BR> .SetProperty "VERSION", "SDE.DEFAULT"<BR> End With<BR> "Open WorkSpace<BR> Dim pWorkspaceFactory As IWorkspaceFactory<BR> Set pWorkspaceFactory = New SdeWorkspaceFactory<BR> Dim pFWS As IFeatureWorkspace<BR> Set pFWS = pWorkspaceFactory.Open(pPropertyset, 0)<BR> "CleanUp<BR> Set pPropertyset = Nothing<BR> Set pWorkspaceFactory = Nothing<BR> Set SDEConnect = pFWS<BR> Exit Function<BR>Error_h:<BR> Set pPropertyset = Nothing<BR> Set pWorkspaceFactory = Nothing<BR> MsgBox "SDEConnect()"<BR>End Function </P> |
|
|
|
1楼#
发布于:2005-06-01 17:48
这个函数创建一个全是点的FeatureClass,包含有属性项ADDRESS_ID.<BR>其中的数据是从输入文件里面的纬度,经度计算来的,这个表的空间信息<BR>就是我下面说没有搞明白的ISpatialReference的设置是参看了另外一个<BR>全域地图的参数照样复制的。这样,后来向这个FeatureClass里面添加的点<BR>就能够和全域地图完全吻合,如果不做的话,在ZoomIn的时候,出错<BR>Spatial Index Not Found
<br> <P>Public Function SDECreatePointFeatureClass( _<BR> ByVal strFeatureName As String, _<BR> ByRef pFWS As IFeatureWorkspace) As Boolean</P> <P> "Create Table construction<BR> Dim pFields As IFields<BR> Dim pFieldsEdit As IFieldsEdit<BR> Set pFields = New esriCore.Fields<BR> Set pFieldsEdit = pFields<BR> Dim pField As IField<BR> Dim pFieldEdit As IFieldEdit<BR> <BR>On Error GoTo Error_h<BR> "这个列必须写在最前面<BR> Set pField = New esriCore.Field<BR> Set pFieldEdit = pField<BR> With pFieldEdit<BR> .Name = "OBJECTID"<BR> .Type = esriFieldTypeOID<BR> End With<BR> pFieldsEdit.AddField pField<BR> Set pField = Nothing<BR> <BR> "Create Shape Field<BR> Dim pSpatRefFact As ISpatialReferenceFactory2<BR> Set pSpatRefFact = New SpatialReferenceEnvironment</P> <P> Dim pGeographicCoordinateSystem As IGeographicCoordinateSystem<BR> Set pGeographicCoordinateSystem = pSpatRefFact.CreateGeographicCoordinateSystem(104111)<BR> "这一段是我一直未能弄明白的地方,涉及一些地理方面的知识<BR> "但是不这样做的话,生成的FeatureClass中的点的位置离正确相去甚远<BR> pGeographicCoordinateSystem.SetDomain -10000, 11474.83645, -10000, 11474.83645<BR> pGeographicCoordinateSystem.SetFalseOriginAndUnits -10000, -10000, 100000<BR> pGeographicCoordinateSystem.SetMDomain 0, 2147483645<BR> pGeographicCoordinateSystem.SetMFalseOriginAndUnits 0, 1<BR> pGeographicCoordinateSystem.SetZDomain 0, 2147483645<BR> pGeographicCoordinateSystem.SetZFalseOriginAndUnits 0, 1<BR> <BR> Dim pGeoDef As IGeometryDef<BR> Dim pGeoDefEdit As IGeometryDefEdit<BR> Set pGeoDef = New GeometryDef<BR> Set pGeoDefEdit = pGeoDef<BR> With pGeoDefEdit<BR> .GeometryType = esriGeometryPoint<BR> .GridCount = 1<BR> .GridSize(0) = 1000<BR> Set .SpatialReference = pGeographicCoordinateSystem<BR> End With<BR> <BR> Set pField = New esriCore.Field<BR> Set pFieldEdit = pField<BR> With pFieldEdit<BR> .Name = "Shape"<BR> .Type = esriFieldTypeGeometry<BR> Set .GeometryDef = pGeoDef<BR> End With<BR> pFieldsEdit.AddField pField<BR> Set pSpatRefFact = Nothing<BR> Set pGeoDef = Nothing<BR> Set pField = Nothing<BR> <BR> "Add on a ADDRESS_ID<BR> Set pField = New esriCore.Field<BR> Set pFieldEdit = pField<BR> With pFieldEdit<BR> .Name = "ADDRESS_ID"<BR> .Type = esriFieldTypeSmallInteger<BR> End With<BR> pFieldsEdit.AddField pField<BR> Set pField = Nothing<BR> <BR> "Add on IDO<BR> Set pField = New esriCore.Field<BR> Set pFieldEdit = pField<BR> With pFieldEdit<BR> .Name = "IDO"<BR> .Type = esriFieldTypeDouble<BR> End With<BR> pFieldsEdit.AddField pField<BR> Set pField = Nothing<BR> <BR> "Add on KEIDO<BR> Set pField = New esriCore.Field<BR> Set pFieldEdit = pField<BR> With pFieldEdit<BR> .Name = "KEIDO"<BR> .Type = esriFieldTypeDouble<BR> End With<BR> pFieldsEdit.AddField pField<BR> Set pField = Nothing<BR> <BR> "Create Feature<BR> Dim pFeatClass As IFeatureClass<BR> Set pFeatClass = pFWS.CreateFeatureClass(strFeatureName, pFields, Nothing, _<BR> Nothing, esriFTSimple, "Shape", "")<BR> <BR> "Clean Up<BR> SDECreatePointFeatureClass = True<BR> Exit Function<BR>Error_h:<BR> MsgLogOut MeName, "SDECreatePointFeatureClass()", True<BR>End Function </P> |
|
|
|
2楼#
发布于:2005-06-01 17:48
这个函数创建一个全是Polygon的表,包含一个属性ADDRESS_ID。这个表的功能是做ADDRESS 查询,得到一个住址,从省级表(省的Polygon),市级表,地县级表中读取该住址对应的Polygon,然后将该Polygon放到这个自己创建的Polygon表里面。这里也是有一个SpatialReference的问题,如果省级表,市级表,地县级表的GridSize不同,那么就要选择最大的那个SpatialReference作为这个表的SpatialReference。否则插入Polygon的时候报错 "Lienstring or poly boundary is self-intersecting",个人感觉是不同的Polygon边境线的点的个数不同,用GridSize大的可以装小的Polygon,但是反过来就要出错。
<br> <P>Public Function SDECreatePolygonFeatureClass( _<BR> ByVal strFeatureName As String, _<BR> ByRef pFWS As IFeatureWorkspace, _<BR> ByVal strSrcFCName As String, _<BR> ByRef pSrcFWS As IFeatureWorkspace) As IFeatureClass</P> <P>On Error GoTo Error_h<BR> " Create Table construction<BR> Dim pFields As IFields<BR> Dim pFieldsEdit As IFieldsEdit<BR> Set pFields = New esriCore.Fields<BR> Set pFieldsEdit = pFields<BR> <BR> Dim pField As IField<BR> Dim pFieldEdit As IFieldEdit</P> <P> " Geometry Field must be the first field<BR> Set pField = New esriCore.Field<BR> Set pFieldEdit = pField<BR> With pFieldEdit<BR> .Name = "OBJECTID"<BR> .Type = esriFieldTypeOID<BR> End With<BR> pFieldsEdit.AddField pField<BR> Set pField = Nothing<BR> <BR> " Create Shape Field<BR> Dim pFeatSrc As IFeatureClass<BR> Set pFeatSrc = pSrcFWS.OpenFeatureClass(strSrcFCName)<BR> <BR> Dim pFeatSrcFields As IFields<BR> Set pFeatSrcFields = pFeatSrc.Fields<BR> <BR> Dim pGeoField As IField<BR> Set pGeoField = pFeatSrcFields.Field(pFeatSrcFields.FindFieldByAliasName("SHAPE"))<BR> <BR> Dim pGeoDef As IGeometryDef<BR> Set pGeoDef = pGeoField.GeometryDef<BR> <BR> Dim pGeoDefEdit As IGeometryDefEdit<BR> Set pGeoDefEdit = pGeoDef<BR> With pGeoDefEdit<BR> Set .SpatialReference = pGeoField.GeometryDef.SpatialReference<BR> End With<BR> <BR> Set pField = New esriCore.Field<BR> Set pFieldEdit = pField<BR> With pFieldEdit<BR> .Name = "SHAPE"<BR> .Type = esriFieldTypeGeometry<BR> Set .GeometryDef = pGeoDef<BR> End With<BR> pFieldsEdit.AddField pField<BR> Set pGeoDef = Nothing<BR> Set pField = Nothing<BR> <BR> "Add on a ADDRESS_ID<BR> Set pField = New esriCore.Field<BR> Set pFieldEdit = pField<BR> With pFieldEdit<BR> .Name = "AREA_POLYGON_ID"<BR> .Type = esriFieldTypeInteger<BR> End With<BR> pFieldsEdit.AddField pField<BR> Set pField = Nothing<BR> <BR> "Create Feature<BR> Dim pFeatClass As IFeatureClass<BR> Set pFeatClass = pFWS.CreateFeatureClass(strFeatureName, pFields, Nothing, _<BR> Nothing, esriFTSimple, "Shape", "")<BR> Exit Function<BR>Error_h:<BR> MsgLogOut MeName, "SDECreatePolygonFeatureClass()", False<BR>End Function<BR></P> |
|
|
|
3楼#
发布于:2005-06-01 17:48
入口参数,FeatureClass名,经度,纬度,WorkSpace
<br> <P>Public Function SDEUpSertPoint(ByVal strFeatName As String, _<BR> ByVal ido As Double, ByVal Keido As Double, _<BR> ByRef pFWS As IFeatureWorkspace) As Long<BR> Dim strErrMsg As String<BR> Dim pQFilt As IQueryFilter<BR> Dim wk_SQL As String<BR> Dim objDynaset As OraDynaset<BR> Dim dIdo As Double<BR> Dim dKeido As Double<BR> Dim lAddress_ID As Long</P> <P>On Error GoTo Error_h<BR> " Get the New Address_ID<BR> wk_SQL = "Select SEQ_POINT.NEXTVAL ADDRESS_ID from dual"<BR> Set objDynaset = ODatabase.CreateDynaset(wk_SQL, ORADYN_READONLY)<BR> lAddress_ID = objDynaset("ADDRESS_ID")<BR> <BR> "Open FeatureClass<BR> Dim pFeatClass As IFeatureClass<BR> Set pFeatClass = pFWS.OpenFeatureClass(strFeatName)<BR> <BR> Set pQFilt = New QueryFilter<BR> pQFilt.WhereClause = "ADDRESS_ID=" ; lAddress_ID<BR> <BR> Dim pFeatureCursor As IFeatureCursor<BR> Set pFeatureCursor = pFeatClass.Search(pQFilt, False)<BR> <BR> Dim pFeat As IFeature<BR> Set pFeat = pFeatureCursor.NextFeature<BR> If Not pFeat Is Nothing Then pFeat.Shape.SetEmpty<BR> <BR> Dim pPoint As esriCore.IPoint<BR> Set pPoint = New Point<BR> pPoint.PutCoords keido, ido<BR> Set pFeat = pFeatClass.CreateFeature<BR> pFeat.Value(1) = lAddress_ID<BR> pFeat.Value(2) = ido<BR> pFeat.Value(3) = Keido<BR> Set pFeat.Shape = pPoint<BR> pFeat.Store<BR> <BR> "CleanUp<BR> Set pFeat = Nothing<BR> Set pPoint = Nothing<BR> Set pQFilt = Nothing<BR> SDEUpSertPoint = lAddress_ID<BR> Exit Function<BR>Error_h:<BR> Set pFeat = Nothing<BR> Set pPoint = Nothing<BR> Set pQFilt = Nothing<BR> MsgLogOut MeName, "SDEUpSertPoint()", True<BR>End Function </P> |
|
|
|
4楼#
发布于:2005-06-01 17:48
Public Function SDEUpSertPolygon( _<BR> ByVal pFeatClsNmDst As String, _<BR> ByVal pFeatClsNmSrc As String, _<BR> ByVal strSQl As String, _<BR> ByRef pFWS As IFeatureWorkspace) As Long
<br> <P> Dim strErrMsg As String<BR> Dim wk_SQL As String<BR> Dim objDynaset As OraDynaset<BR> Dim lAddress_ID As Long</P> <P>On Error GoTo Error_h<BR> " Get Address ID<BR> wk_SQL = "Select SEQ_POINT.NEXTVAL AREA_POLYGON_ID from dual"<BR> Set objDynaset = ODatabase.CreateDynaset(wk_SQL, ORADYN_READONLY)<BR> lAddress_ID = objDynaset("AREA_POLYGON_ID")</P> <P> "Read Source Polygon Data<BR> Dim pFeatClsSrc As IFeatureClass<BR> Set pFeatClsSrc = pFWS.OpenFeatureClass(pFeatClsNmSrc)</P> <P> Dim pQFilt As IQueryFilter<BR> Set pQFilt = New QueryFilter<BR> pQFilt.WhereClause = strSQl</P> <P> Dim pFeatSrcCursor As IFeatureCursor<BR> Set pFeatSrcCursor = pFeatClsSrc.Search(pQFilt, False)</P> <P> Dim pFeatSrc As IFeature<BR> Set pFeatSrc = pFeatSrcCursor.NextFeature<BR> If pFeatSrc Is Nothing Then Exit Function</P> <P> "Set Destination Polygon Data<BR> Dim pFeatClsDst As IFeatureClass<BR> Set pFeatClsDst = pFWS.OpenFeatureClass(pFeatClsNmDst)</P> <P> Dim pFeatDst As IFeature<BR> Set pFeatDst = pFeatClsDst.CreateFeature</P> <P> Dim i As Long<BR> i = pFeatDst.Fields.FindFieldByAliasName("AREA_POLYGON_ID")<BR> pFeatDst.Value(i) = lAddress_ID</P> <P> " DO for Multi-Part Feature<BR> Dim geometryColl As IGeometryCollection<BR> Set geometryColl = pFeatSrc.Shape<BR> " 因为市级表,地县级表,以及省级表都是从全国的FeatureClass中<BR> Dissolved而来,因此Polygon不是单纯的了,包含有一串相连的Polygon?我看好像是这么回事。<BR> If geometryColl.GeometryCount = 1 Then<BR> Set pFeatDst.Shape = pFeatSrc.Shape<BR> Else<BR> Set pFeatDst.Shape = geometryColl<BR> End If</P> <P> pFeatDst.Store</P> <P> "Clean Up<BR> Set pFeatDst = Nothing<BR> Set pFeatSrc = Nothing<BR> SDEUpSertPolygon = lAddress_ID<BR> Exit Function<BR>Error_h:<BR> MsgLogOut MeName, "SDEUpSertPolygon()", True, strErrMsg<BR>End Function<BR></P> |
|
|
|
5楼#
发布于:2005-06-01 17:49
Public Function SDEFeatureExist(ByVal strFCName As String, _<BR> ByRef pFWS As IWorkspace) As Boolean
<br> <P> Dim pDSName As IDatasetName<BR> Dim pEnumDSName As IEnumDatasetName<BR>On Error GoTo Error_h<BR> Set pEnumDSName = pFWS.DatasetNames(esriDTFeatureClass)<BR> Set pDSName = pEnumDSName.Next</P> <P> While Not pDSName Is Nothing<BR> If pDSName.Name = "BIO." ; strFCName Then<BR> SDEFeatureExist = True<BR> Exit Function<BR> End If<BR> Set pDSName = pEnumDSName.Next<BR> Wend<BR> SDEFeatureExist = False<BR> Exit Function<BR>Error_h:<BR> MsgLogOut MeName, "SDEFeatureExist", False<BR>End Function </P> |
|
|
|
6楼#
发布于:2005-06-01 17:49
FCLoader <BR>用这个关键字在Help里面搜索一下,有个例子可以直接拿来用。
<br> <P>入口,源FeatureClass, 源InpropertySet, 目标/目标<BR>Public Function FCLoader(sInName As String, _<BR> pInPropertySet As IPropertySet, _<BR> pOutPropertySet As IPropertySet, _<BR> sOutName As String) As Boolean<BR> <BR>On Error GoTo Error_h:<BR> <BR> " Set up for input workspace which is from a ShapeFile<BR> Dim pInWorkspaceName As IWorkspaceName<BR> Set pInWorkspaceName = New WorkspaceName<BR> pInWorkspaceName.ConnectionProperties = pInPropertySet<BR> pInWorkspaceName.WorkspaceFactoryProgID = "esriCore.ShapefileWorkspaceFactory.1"</P> <P> " Set in dataset and table names.<BR> Dim pInFCName As IFeatureClassName<BR> Set pInFCName = New FeatureClassName<BR> Dim pInDatasetName As IDatasetName<BR> Set pInDatasetName = pInFCName<BR> pInDatasetName.Name = sInName<BR> Set pInDatasetName.WorkspaceName = pInWorkspaceName<BR> <BR> " Setup output workspace which is to SDE database.<BR> Dim pOutWorkspaceName As IWorkspaceName<BR> Set pOutWorkspaceName = New WorkspaceName<BR> pOutWorkspaceName.ConnectionProperties = pOutPropertySet<BR> pOutWorkspaceName.WorkspaceFactoryProgID = "esriCore.SDEWorkspaceFactory.1"<BR> <BR> " Set out dataset and table names.<BR> Dim pOutDatasetName As IDatasetName<BR> Dim pOutFCName As IFeatureClassName<BR> Set pOutFCName = New FeatureClassName<BR> Set pOutDatasetName = pOutFCName<BR> pOutDatasetName.Name = sOutName<BR> Set pOutDatasetName.WorkspaceName = pOutWorkspaceName</P> <P> " Open input Featureclass to get field definitions.<BR> Dim pName As IName<BR> Dim pInFC As IFeatureClass<BR> Set pName = pInFCName<BR> Set pInFC = pName.Open<BR> <BR> " Validate the field names.<BR> Dim pOutFCFields As IFields<BR> Dim pInFCFields As IFields<BR> Dim pFieldCheck As IFieldChecker<BR> Dim i As Long<BR> <BR> Set pInFCFields = pInFC.Fields<BR> Set pFieldCheck = New FieldChecker<BR> pFieldCheck.Validate pInFCFields, Nothing, pOutFCFields<BR> Set pFieldCheck = Nothing<BR> <BR> " +++ Loop through the output fields to find the geometry field<BR> Dim pGeoField As IField<BR> For i = 0 To pOutFCFields.FieldCount<BR> If pOutFCFields.Field(i).Type = esriFieldTypeGeometry Then<BR> Set pGeoField = pOutFCFields.Field(i)<BR> Exit For<BR> End If<BR> Next i<BR> <BR> " +++ Get the geometry field"s geometry defenition<BR> Dim pOutFCGeoDef As IGeometryDef<BR> Set pOutFCGeoDef = pGeoField.GeometryDef<BR> <BR> " +++ Give the geometry definition a spatial index grid count and grid size<BR> Dim pOutFCGeoDefEdit As IGeometryDefEdit<BR> Set pOutFCGeoDefEdit = pOutFCGeoDef<BR> pOutFCGeoDefEdit.GridCount = 1<BR> pOutFCGeoDefEdit.GridSize(0) = DefaultIndexGrid(pInFC)<BR> Set pOutFCGeoDefEdit.SpatialReference = pGeoField.GeometryDef.SpatialReference<BR> <BR> " Load the table.<BR> Dim pFCToFC As IFeatureDataConverter<BR> Set pFCToFC = New FeatureDataConverter<BR> <BR> Dim pEnumErrors As IEnumInvalidObject<BR> Set pEnumErrors = pFCToFC.ConvertFeatureClass( _<BR> pInFCName, Nothing, Nothing, pOutFCName, _<BR> pOutFCGeoDef, pOutFCFields, "", 1000, 0)<BR> <BR> "Catch the Error<BR> Dim pErrInfo As IInvalidObjectInfo<BR> Set pErrInfo = pEnumErrors.Next</P> <P> Dim strErrMsg As String<BR> Do Until pErrInfo Is Nothing<BR> strErrMsg = strErrMsg ; pErrInfo.ErrorDescription ; ":" ; pErrInfo.InvalidObjectID<BR> Debug.Print pErrInfo.ErrorDescription ; ":" ; pErrInfo.InvalidObjectID<BR> Set pErrInfo = pEnumErrors.Next<BR> Loop<BR> pEnumErrors.Reset<BR> <BR> "Clean Up<BR> Set pInWorkspaceName = Nothing<BR> Set pInFCName = Nothing<BR> Set pOutWorkspaceName = Nothing<BR> Set pOutFCName = Nothing<BR> Set pFCToFC = Nothing<BR> <BR> FCLoader = True<BR> Exit Function<BR>Error_h:<BR> Set pInWorkspaceName = Nothing<BR> Set pInFCName = Nothing<BR> Set pOutWorkspaceName = Nothing<BR> Set pOutFCName = Nothing<BR> Set pFCToFC = Nothing<BR> MsgLogOut MeName, "FCLoader()", True, strErrMsg<BR>End Function </P> |
|
|
|
7楼#
发布于:2005-06-01 17:49
这是一个彻底的例子,请找个关键字在Help里面找到它吧
<br> <P>Public Function RSLoader(ByVal sDir As String, ByVal sInput As String, _<BR> ByVal sServer As String, ByVal sInstance As String, _<BR> ByVal sUser As String, ByVal sPasswd As String, _<BR> ByVal sSDERaster As String) As Boolean<BR> <BR> Dim pSDEConn As IRasterSdeConnection<BR> Dim pSDEStorage As IRasterSdeStorage<BR> Dim pSDEOp As IRasterSdeServerOperation<BR> Dim pRasterWsFact As IWorkspaceFactory<BR> Dim pRasterWs As IRasterWorkspace<BR> Dim pGeoDs As IGeoDataset<BR> <BR>On Error GoTo Error_h<BR> " Initialize RasterSDELoader<BR> Set pSDEConn = New RasterSdeLoader<BR> pSDEConn.ServerName = sServer<BR> pSDEConn.instance = sInstance<BR> pSDEConn.UserName = sUser<BR> pSDEConn.password = sPasswd<BR> pSDEConn.InputRasterName = sDir ; "\" ; sInput<BR> pSDEConn.SdeRasterName = sSDERaster<BR> <BR> " Set storage parameters<BR> Set pSDEStorage = pSDEConn<BR> " Get spatialreference<BR> Set pRasterWsFact = New RasterWorkspaceFactory<BR> Set pRasterWs = pRasterWsFact.OpenFromFile(sDir, 0)<BR> Set pGeoDs = pRasterWs.OpenRasterDataset(sInput)<BR> " Set spatialreference<BR> Set pSDEStorage.SpatialReference = pGeoDs.SpatialReference<BR> " Set compression<BR> pSDEStorage.CompressionType = esriRasterSdeCompressionTypeRunLength<BR> " Set tilesize<BR> pSDEStorage.TileHeight = 128<BR> pSDEStorage.TileWidth = 128<BR> " Pyramids option<BR> pSDEStorage.PyramidOption = esriRasterSdePyramidBuildWithFirstLevel<BR> pSDEStorage.PyramidResampleType = RSP_BilinearInterpolation<BR> <BR> " Start loading<BR> Set pSDEOp = pSDEConn<BR> pSDEOp.Create<BR> " Calculate stats<BR> pSDEOp.ComputeStatistics<BR> <BR> " Cleanup<BR> Set pSDEConn = Nothing<BR> Set pSDEStorage = Nothing<BR> Set pSDEOp = Nothing<BR> Set pRasterWsFact = Nothing<BR> Set pRasterWs = Nothing<BR> Set pGeoDs = Nothing<BR> RSLoader = True<BR> Exit Function<BR>Error_h:<BR> Set pSDEConn = Nothing<BR> Set pSDEStorage = Nothing<BR> Set pSDEOp = Nothing<BR> Set pRasterWsFact = Nothing<BR> Set pRasterWs = Nothing<BR> Set pGeoDs = Nothing<BR> MsgLogOut MeName, "RSLoader", False<BR>End Function<BR></P> |
|
|
|
8楼#
发布于:2005-06-01 17:49
纯粹的一边读取,一边写入,速度一般,不算很慢。<BR>Public Function SDECopyFeature(ByVal strFeatureName As String, _<BR> ByRef pFWS As IFeatureWorkspace, _<BR> ByVal strMDBName As String, _<BR> ByVal FeatureType As Integer) As Long<BR>On Error GoTo Error_h<BR> " Connect to MDB<BR> Dim pWorkspaceFactory As IWorkspaceFactory<BR> Set pWorkspaceFactory = New AccessWorkspaceFactory<BR> <BR> Dim pAccessWorkSpace As IFeatureWorkspace<BR> Set pAccessWorkSpace = pWorkspaceFactory.OpenFromFile(strMDBName, 0)<BR> <BR> Dim pSDEFeatureClass As IFeatureClass<BR> Set pSDEFeatureClass = pFWS.OpenFeatureClass(strFeatureName)<BR> <BR> If FeatureType = 0 Then " Point<BR> SDECreatePointFeatureClass strFeatureName, pAccessWorkSpace<BR> Else " Polygon<BR> SDECreatePolygonFeatureClass strFeatureName, pAccessWorkSpace, strFeatureName, pFWS<BR> End If<BR> <BR> Dim pFeatureCursor As IFeatureCursor<BR> Set pFeatureCursor = pSDEFeatureClass.Search(Nothing, False)<BR> <BR> Dim pAccessFeatureClass As IFeatureClass<BR> Set pAccessFeatureClass = pAccessWorkSpace.OpenFeatureClass(strFeatureName)<BR> <BR> Dim pSDEFeat As IFeature<BR> Set pSDEFeat = pFeatureCursor.NextFeature<BR> <BR> Dim pAccessFeat As IFeature<BR> Dim pos As Long<BR> Dim count As Long<BR> Dim i As Long<BR> While Not pSDEFeat Is Nothing<BR> Set pAccessFeat = pAccessFeatureClass.CreateFeature<BR> For i = 0 To pSDEFeat.Fields.FieldCount - 1<BR> If pSDEFeat.Fields.Field(i).Type <> esriFieldTypeGeometry And _<BR> pSDEFeat.Fields.Field(i).Type <> esriFieldTypeOID Then<BR> pos = pAccessFeat.Fields.FindFieldByAliasName(pSDEFeat.Fields.Field(i).Name)<BR> If pos <> -1 Then pAccessFeat.Value(pos) = pSDEFeat.Value(i)<BR> End If<BR> Next i<BR> Set pAccessFeat.Shape = pSDEFeat.Shape<BR> count = count + 1<BR>" Debug.Print Count<BR> pAccessFeat.Store<BR> Set pSDEFeat = pFeatureCursor.NextFeature<BR> Wend<BR> <BR> Set pSDEFeat = Nothing<BR> SDECopyFeature = count<BR> Exit Function<BR>Error_h:<BR> MsgLogOut MeName, "SDECopyFeature()", True<BR>End Function
|
|
|
|
9楼#
发布于:2005-06-01 17:50
就是纯粹的数据表文件<BR>Private Function CopyTable(pSrcWorkSpace As IFeatureWorkspace, _<BR> pDstWorkSpace As IFeatureWorkspace, _<BR> strTableName As String) As Boolean<BR>On Error GoTo Error_h<BR> " Open Source Table<BR> Dim pDBFTable As ITable<BR> Set pDBFTable = pSrcWorkSpace.OpenTable(strTableName)<BR> <BR> Dim pDBFFields As IFields<BR> Set pDBFFields = pDBFTable.Fields<BR> " Open Destination Table<BR> Dim pSDETable As ITable<BR> If SDEFeatureExist(strTableName, pDstWorkSpace) Then<BR> Set pSDETable = pDstWorkSpace.OpenTable(strTableName)<BR> Else<BR> " If doesn"t exist , Create a New One<BR> Set pSDETable = pDstWorkSpace.CreateTable(strTableName, pDBFFields, Nothing, Nothing, "")<BR> End If<BR> " Select All rows from Source<BR> Dim pDBFCursor As ICursor<BR> Set pDBFCursor = pDBFTable.Search(Nothing, True)<BR> <BR> Dim pDBFRow As IRow<BR> Set pDBFRow = pDBFCursor.NextRow<BR> " Prepare Insert Cursor for Destination Table<BR> Dim pSDERow As IRow<BR> Dim pSDECursor As ICursor<BR> Set pSDECursor = pSDETable.Insert(False)<BR> " Copy Rows<BR> Dim i As Long<BR> Do Until pDBFRow Is Nothing<BR> Set pSDERow = pSDETable.CreateRow<BR> For i = 0 To pDBFFields.FieldCount - 1<BR> If Not pDBFFields.Field(i).Type = esriFieldTypeOID Then _<BR> pSDERow.value(i) = pDBFRow.value(i)<BR> Next i<BR> pSDECursor.InsertRow pSDERow<BR> Set pDBFRow = pDBFCursor.NextRow<BR> Loop<BR> CopyTable = True<BR> Exit Function<BR>Error_h:<BR> MsgLogOut Me.Name, "CopyTable", False, strTableName<BR>End Function<BR>
|
|
|
上一页
下一页