gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:3589回复:17

[分享]DBA的VB+AO的开发总结zz

楼主#
更多 发布于:2005-06-01 17:48
<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>
喜欢0 评分0
GIS麦田守望者,期待与您交流。
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
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>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
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>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
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>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
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>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
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>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
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>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
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>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
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
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
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>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部