隨筆-18  評論-20  文章-0  trackbacks-0

          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-08-17 08:28 JavaPoint 閱讀(1346) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 平凉市| 阿尔山市| 穆棱市| 永济市| 黑山县| 万荣县| 石首市| 长兴县| 中山市| 台安县| 南部县| 喀喇沁旗| 河东区| 宣城市| 临朐县| 开阳县| 沧州市| 讷河市| 桐城市| 开封县| 元阳县| 佛坪县| 边坝县| 新和县| 乌苏市| 许昌县| 济宁市| 大埔县| 威远县| 会昌县| 屏东市| 永靖县| 洪雅县| 五寨县| 大悟县| 尉犁县| 冀州市| 邹城市| 宁津县| 石渠县| 静宁县|