欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap FreeTalk
   您现在位于: 首页技术专栏ArcGIS应用与开发ArcGIS其它 → 正文
利用ArcSDE C API读取ArcSDE Raster数据1
07-10-24 16:33:39 作者:Avlee 出处:
本文包括访问ArcSDE Raster数据的三个应用,代码只是片段抽取,但是已经包括了该功能的所有代码。

1、获取ArcSDE中Raster数据列表

undefined undefined undefined undefined struct  SdeRasterTableInfo
{
    
char  TableName[SE_QUALIFIED_TABLE_NAME];
    
char  RasterColumnName[SE_MAX_COLUMN_LEN];
};


undefined undefined undefined undefined bool  GetSdeRasterCatalog(SE_CONNECTION pConnection, std::vector < SdeRasterTableInfo > &rasterTables)
{
    SE_RASCOLINFO 
* pRasterColumnList  =   0 ;
    
if  (SE_rastercolumn_get_info_list(pConnection,  & pRasterColumnList,  & lRasterColumnCount)  !=  SE_SUCCESS)
        
return   false ;

    
for  ( int  i  =   0 ; i  <  lRasterColumnCount; i ++ )
    {
        
long  privileges  =   0 ;
        
if  (SE_rascolinfo_get_access (pRasterColumnList[i],  & privileges)  !=  SE_SUCCESS)
            
continue ;

        
if  ( ! (privileges  &  SE_SELECT_PRIVILEGE))
            
continue ;

        SdeRasterTableInfo rasterTableInfo;

        
//  Get the raster table name and column name.
         if  (SE_rascolinfo_get_raster_column (pRasterColumnList[i],
            rasterTableInfo.TableName, rasterTableInfo.RasterColumnName) 
!=  SE_SUCCESS)
            
continue ;
        
        rasterTables.push_back(rasterTableInfo);
    }

    SE_rastercolumn_free_info_list (lRasterColumnCount, pRasterColumnList);
    
    
return   true ;
}


2、获取指定Raster数据的元数据

undefined undefined undefined undefined struct  SdeRasterSpec
{
    
long    ImageWidth;
    
long    ImageHeight;
    
    
double  OriginX;
    
double  OriginY;
    
    
double  MinX;
    
double  MinY;
    
double  MaxX;
    
double  MaxY;
};


LONG GetSdeRasterSpec(SE_CONNECTION pConnection, 
    
const   string &  tableName,  const   string &  rasterColumn,  const   string &  where
    SdeRasterSpec 
& rasterSpec)
{
    
//  Get raster column info.
    SE_RASCOLINFO rasColInfo  =   0 ;
    LONG rc 
=  SE_rascolinfo_create( & rasColInfo);
    
if  (rc  !=  SE_SUCCESS)
        
return  rc;

    LONG rasterColumnId 
=   0 ;

    
do
    
{
        rc 
=  SE_rastercolumn_get_info_by_name(pConnection, tableName.c_str(), rasterColumn.c_str(), rasColInfo);
        
if  (rc  !=  SE_SUCCESS)
            
break ;

        
//  Get raster column ID.
        rc  =  SE_rascolinfo_get_id(rasColInfo,  & rasterColumnId);
        
if  (rc  !=  SE_SUCCESS)
            
break ;
    }

    
while ( 0 );

    SE_rascolinfo_free(rasColInfo);

    
if  (rc  !=  SE_SUCCESS)
        
return  rc;

    
//  Get raster ID.
    LONG rasterId  =   - 1 ;
    rc 
=  FetchRasterID(pConnection, tableName, rasterColumn, where,  & rasterId);
    
if  (rasterId  ==   - 1 )
        
return  rc;

    
//  Get raster info.
    SE_RASTERINFO rasterInfo  =   0 ;
    rc 
=  SE_rasterinfo_create( & rasterInfo);
    
if  (rc  !=  SE_SUCCESS)
        
return  rc;

    rc 
=  SE_raster_get_info_by_id(pConnection, rasterColumnId, rasterId, rasterInfo);
    
if  (rc  !=  SE_SUCCESS)
    
{
        SE_rasterinfo_free(rasterInfo);
        
return  rc;
    }


    
//  Get raster band info list.
    SE_RASBANDINFO  * rasterBands  =   0 ;
    LONG bandCount 
=   0 ;
    rc 
=  SE_raster_get_bands(pConnection, rasterInfo,  & rasterBands,  & bandCount);
    
if  (rc  !=  SE_SUCCESS)
    
{
        SE_rasterinfo_free (rasterInfo);
        
return  rc;
    }


    SE_rasterinfo_free(rasterInfo);

    
//  Get the raster band size and origin.
    LFLOAT bandOriginX  =   0.0 , bandOriginY  =   0.0 ;
    LONG bandWidth 
=   0 , bandHeight  =   0 ;
    SE_ENVELOPE rasterEnv;
    
if  (bandCount  >   0 )
    
{
        rc 
=  SE_rasbandinfo_get_tile_origin(rasterBands[ 0 ],  & rasterSpec.OriginX,  & rasterSpec.OriginY);

        
if  (rc  ==  SE_SUCCESS)
            rc 
=  SE_rasbandinfo_get_band_size (rasterBands[ 0 ],  & rasterSpec.ImageWidth,  & rasterSpec.ImageHeight);

        
if  (rc  ==  SE_SUCCESS)
            rc 
=  SE_rasbandinfo_get_extent (rasterBands[ 0 ],  & rasterEnv);
    }


    SE_rasterband_free_info_list(bandCount, rasterBands);

    
if  (rc  ==  SE_SUCCESS)
    
{
        rasterSpec.MinX 
=  rasterEvn.minx;
        rasterSpec.MinY 
=  rasterEvn.miny;
        rasterSpec.MaxX 
=  rasterEvn.maxx;
        rasterSpec.MaxY 
=  rasterEvn.maxy;
    }


    
return  rc;
}


LONG FetchRasterID (SE_CONNECTION pConnection, 
const   string &  tableName, 
    
const   string &  rasterColumn,  const   string &  where, LONG  * rasterId) 
{
    
* rasterId  =   - 1 ;

    SE_STREAM stream 
=   0 ;
    LONG rc 
=  SE_stream_create (pConnection,  & stream);
    
if  (rc  !=  SE_SUCCESS)
        
return  rc;

    
//  Set up SQL statement.
    CHAR sqlstmt[ 128 ];
    
if  (where.empty())
        sprintf (sqlstmt,
" SELECT %s FROM %s " , rasterColumn.c_str(), tableName.c_str());
    
else
        sprintf (sqlstmt,
" SELECT %s FROM %s WHERE %s " , rasterColumn.c_str(), tableName.c_str(), where.c_str());

    
do
    
{
        rc 
=  SE_stream_prepare_sql (stream, sqlstmt);
        
if  (rc  !=  SE_SUCCESS)
            
break ;

        
//  Bind the rasterId variable to receive the output of the stream.
        SHORT raster_ind =  SE_IS_NULL_VALUE;
        rc 
=  SE_stream_bind_output_column (stream,  1 , ( void   * )rasterId,  & raster_ind);
        
if  (rc  !=  SE_SUCCESS)
            
break ;

        
//  Execute the query.
        rc  =  SE_stream_execute (stream);
        
if  (rc  !=  SE_SUCCESS)
            
break ;

        
//  Fetch the result from the cursor.
        rc  =  SE_stream_fetch (stream);
        
if  (rc  ==  SE_SUCCESS  ||  rc  ==  SE_FINISHED) 
        
{
            
//  If the query sets the indicator to NULL.
             if  (raster_ind  ==  SE_IS_NULL_VALUE) 
                
* rasterId  =   - 1 ;
        }

    }

    
while ( 0 );

    SE_stream_free (stream);

    
return  rc;
}
9 7 3 1 2 3 4 5 4 8 :

(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  

    关于我们友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
     
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.
     

                   滇ICP备05006901号