本文包括访问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;
}
(本文已被浏览 次) | | |