连接ArcSDE
SE_CONNECTION conn;
SE_ERROR error;
long rc=SE_connection_create("192.168.56.1", "5151", NULL, "scott", "tiger", &error, &conn);
check_error(rc);
查询出sde中的图层信息
void getLayerInfo(SE_CONNECTION conn,std::vector<std::string> &fcNames,std::vector<short> &shapeTypes,std::vector<std::string> &ogcSRs)
{
char user[MAX_LEN]={0};
SE_connection_get_user_name(conn,user);
SE_LAYERINFO *layer_list=0;
long layerCount=0;
SE_layer_get_info_list(conn,&layer_list,&layerCount);
for(int j=0;j<layerCount;++j)
{
char tableName[MAX_LEN]={0};
char colName[MAX_LEN]={0};
SE_layerinfo_get_spatial_column(layer_list[j],tableName,colName);
SE_COORDREF ogcSR;
SE_coordref_create(&ogcSR);
SE_layerinfo_get_coordref(layer_list[j],ogcSR);
char ogc[1024]={0};
PE_COORDSYS cs;
SE_coordref_get_coordsys (ogcSR,&cs);
pe_coordsys_to_string(cs,ogc);
ogcSRs.push_back(ogc);
SE_coordref_free(ogcSR);
if (!strstr(tableName, user))
{
continue;
}
const char *layerName = strchr(tableName, '.') + 1;
short shapeType=0;
long geomType=0;
SE_layerinfo_get_shape_types(layer_list[j],&geomType);
if(geomType==262157)
{
shapeType=FEATURE_TYPE_PLINE;
}
else if(geomType==262161)
{
shapeType=FEATURE_TYPE_POLYGON;
}
else
{
shapeType=FEATURE_TYPE_POINT;
}
fcNames.push_back(layerName);
shapeTypes.push_back(shapeType);
printf("table name is %s;\tshapeType is %d\r\n",layerName,shapeType);
}
SE_layer_free_info_list (layerCount,layer_list);
}
查询图层的字段信息
void getFieldsInfo(std::vector<std::string> &outFields,std::vector<short> &fieldTypes,SE_CONNECTION conn,const char *tblName)
{
long colType = 0;
char colName[MAX_LEN]={0};
//1=short(int16); 2=int;4=double,8=shape 14=SE_NSTRING_TYPE;
SE_COLUMN_DEF *pcoldef=NULL;
short ncols=0;
SE_table_describe(conn,tblName, &ncols, &pcoldef);
for(int i=0;i<ncols;++i)
{
strcpy(colName,pcoldef[i].column_name);
colType=pcoldef[i].sde_type;
outFields.push_back(colName);
fieldTypes.push_back(colType);
switch(colType)
{
case SE_INT16_TYPE:
case SE_INT32_TYPE:
case SE_FLOAT64_TYPE:
case SE_NSTRING_TYPE:
{
int colLen=pcoldef[i].size;
break;
}
case SE_SHAPE_TYPE:
default:
{
break;
}
}
}
SE_table_free_descriptions(pcoldef);
查询图层中的属性数据
#define MAX_LEN 255 //字符串最大长度
SE_STREAM stream;
SE_stream_create(conn, &stream);
///* Allocate an SE_SQL_CONSTRUCT */
SE_SQL_CONSTRUCT *sqlc=0;
SE_sql_construct_alloc (1, &sqlc);
strcpy(sqlc->tables[0], fcNames[j].c_str());
//sqlc->where =(char *)malloc(20);
//strcpy (sqlc->where, "objectid=254");
/* Define the number and names of the table columns to be returned */
int num_cols = fcFields.size();
char **attrs = (char **) malloc (num_cols * sizeof(char *));
for(int i=0;i<num_cols;++i)
{
attrs[i]=(char *)fcFields[i].c_str();
}
SE_stream_query (stream, num_cols, (const char **)attrs, sqlc);
long rc=SE_stream_execute (stream);
/* Iterate over the results */
//字段的index是从1开始的,不是从0开始的
while (rc == SE_SUCCESS)
{
rc = SE_stream_fetch (stream);
if (rc == SE_SUCCESS)
{
//1=short(int16); 2=int;4=double,8=shape 14=SE_NSTRING_TYPE;
for(int k=0;k<num_cols-1;++k)
{
const char *fldName=outFields[k].c_str();
switch(fieldTypes[k])
{
case 1:
{
short vInt=0;
SE_stream_get_smallint(stream,k+1,&vInt);
break;
}
case 2:
{
long vInteger=0;
SE_stream_get_integer(stream,k+1,&vInteger);
break;
}
case 4:
{
double vDouble=0;
SE_stream_get_double(stream,k+1,&vDouble);
break;
}
case 14:
{
SE_WCHAR s[MAX_LEN]={0};
SE_stream_get_nstring (stream,k+1,s);
setlocale(LC_ALL,"");//设置locale
char s2[MAX_LEN]={0};
wcstombs(s2,s,MAX_LEN);
break;
}
case 8:
{
break;
}
default:
{
SE_WCHAR s[MAX_LEN]={0};
SE_stream_get_nstring (stream,k+1,s);
//注意字符串,sde的字符是占两个字节,char *是变长字符,总之获取字符串一定要小心
setlocale(LC_ALL,"");//设置locale
char s2[MAX_LEN]={0};
wcstombs(s2,s,MAX_LEN);
break;
}
}
}
free(attrs);
SE_sql_construct_free (sqlc);
SE_stream_free(stream);