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);


posted on 2007-07-11 11:00  GIS云中飞鹏  阅读(2232)  评论(0编辑  收藏  举报

导航