ArcSDE C SDK开发详解

来源:互联网 发布:苹果系统开发linux 编辑:程序博客网 时间:2024/05/24 04:45

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

原创粉丝点击