ArcSDE空間數據庫查詢
基本步驟:1、連接一個數據庫
2、定義一個查詢
3、執行這個查詢
4、迭代獲取查詢結果記錄
5、獲取每條記錄中的各個記錄項的數值
6、關閉查詢
7、取消與數據庫的連接
下面舉例:
1、屬性查詢:從剛建立的表Factories中查詢出工人數小于100的所有記錄,返回的字段包括“工廠名稱”,“工廠面積”,“工廠人數”三個字段。
SE_CONNECTION Connection;
SE_STREAM Stream;
SE_SQL_CONSTRUCT *sqlc;
SE_ERROR Connect_error;
LONG rc,population;
SHORT num_cols;
LFLOAT area;
CHAR *server,*instance,*database,*user,*passwd;
CHAR **attrs,*name;
//連接ArcSDE數據庫
rc=SE_connection_create(server,instance,database,user,passwd,&Connect_error,&Connection);
//為查詢定義一個數據流
rc=SE_stream_create(Connection,&Stream);
//為一個SE_SQL_CONSTRUCT結構體分配空間
rc=SE_sql_construct_alloc(1,&sqlc);
//定義查詢方式、內容、范圍
sqlc->where=malloc(20);
sqlc->num_tables=1;
strcpy(sqlc->tables[0],"factories");
strcpy(sqlc->where,"工廠人數<100");
//定義要返回的字段的個數和名稱
num_cols=3;
attrs=(CHAR**)malloc(num_cols*sizeof(CHAR*));
attrs[0]="工廠名稱";
attrs[1]="工廠面積";
attrs[2]="工廠人數";
//使用前面定義好的查詢結構體來定義數據流查詢
rc=SE_stream_query(Stream,num_cols,attrs,sqlc);
rc=SE_stream_execute(Stream);
//在結果集中進行循環
while(rc==SE_SUCCESS)
{
rc=SE_stream_fetch(Stream);
if(rc==SE_SUCCESS)
{
rc=SE_stream_get_string(Stream,1,name);
rc=SE_stream_get_double(Stream,2,&area);
rc=SE_stream_get_integer(Stream,3,&population);
//。。。。下面就可以對name,area,population進行操作了
}
}
//釋放數據流
rc=SE_stream_free(Stream);
free(attrs);
//釋放前面給SE_SQL_CONSTRUCT結構體開辟的空間
free(sqlc->where);
SE_sql_construct_free(sqlc);
//斷開與ArcSDE的數據庫連接
SE_connection_free(Connection);
2、空間查詢:下面要在factoris表中檢索出所有落在一個以點(X,Y)為圓心,10km為半徑的圓形范圍內的所有記錄。
SE_SHAPE Shape;
SE_POINT Point;
SE_FILTER Filter;
LFLOAT radius;
LONG max_points;
//創建一個以指定的點(X,Y)為圓心,10公里為半徑的圓,它作為空間約束條件
//假定數據庫中的坐標單位是米
Point.x=X;
Point.y=Y;
radius=10000.0;
//假設已經調用SE_shape_create函數創建了Shape
rc=SE_shape_generate_circle(Point,radius,max_points,Shape);
//定義空間過濾器
strcpy(Filter.table,"factories");
strcpy(Filter.column,"工廠邊界");
Filter.filter.shape=Shape;
//定義查詢所依據的空間關系,SE_AI表示選取所有與Shape相交的空間目標
Filter.method=SM_AI;
Filter.truth=TRUE;
Filter.filter_type=SE_SHAPE_FILTER;
//用前面定義的空間約束來定義當前的數據流操作
rc=SE_stream_get_spatial_constraints(Stream,SE_SPATIAL_FIRST,FALSE,1,&Filter);
//下面就可以在結構集中進行循環
3、下面是用MO從ArcSDE數據庫中調出數據過程:
(1)、連接數據庫
(2)、在庫中選擇需要的數據
(3)、將所選擇的數據作為MO的一個圖層加入到當前視圖中進行顯示
下面是一個例子:
CMap1 map;
LPCTSTR server;
LPCTSTR user, password, db, color;
//連接數據庫
CMoDataConnection conn;
If(!conn.CreateDispatch(TEXT("MapObjects2.DataConnection"))
Throw "不能創建MapObjects的連接對象";
conn.SetServer(server);
conn.SetUser(user);
conn.SetPassword(password);
conn.SetDatabase(db);
If(!conn.Connect())
Throw "連接道路數據庫失??!";
//設置要調出顯示的道路數據,這里我們假定選擇庫中道路數據列表的第一個數據
CMoGeoDatasets sets;
VARIANT va;
VariantInit(&va);
Va.vt=VT_I4;
va.lVal=0;//設置為第一個數據
sets=conn.GetGeoDatasets();
CMoGeoDataset getDataset=sets.Item(va);
//將選擇的道路數據添加到Map控件的圖層列表中
CMoLayers layers(map.GetLayers());
CMoMapLayer layer;
If(!layer.CreateDispatch(TEXT(MapObjects2.MapLayer")))
Throw "不能創建MapObjects圖層";
layer.SetDataset(geoDataset);
If(color!=-1)
{
CMoSymbol layerSymbol(layer.GetSymbol());
layerSymbol.SetColor(color);
}
//將選擇的道路數據添加到Map控件的圖層列表中
layers.Add(layer);