arcsde java_ArcSDE空间数据库查询

//连接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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值