<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      用VC實現GIS系統基本功能

      VC實現GIS系統基本功能

      文檔說明:

      此文檔適合VC++的初學者,高手也可參考(希望能提出寶貴意見)。

      開發前準備:

      前提:必須在你的電腦上安裝了MapX控件,并且準備好需要用到的電子地圖(Mapinfo格式的)

      VC++嵌入MapX進行二次開發可分為以下幾個步驟來實現:

        對應用工程的預設置

        在創建MapX控件之前,必須將MapX.hMapX.cpp文件加入到工程中。對于Visual C++5.0及以上版本,從Project菜單中選擇Add To Project -> Files命令,打開InsertFiles into Project對話框,選擇MapX.cppMapX.h文件加入到工程中(在MapX自帶的C++例子中有這兩個文件)。

        注意:不要選擇Project菜單中的Add TO Project->Components And Controls命令。如果選擇該命令加入MapX控件,將創建一新的.cpp文件,但是該文本沒有包括所有的MapX對象。

        MapX屬性的操作

        對于C++程序來說,每個MapX對象(Objects)都在MapX.h 和 MapX.cpp中用一個類來實現,類的名字和MapX對象的名字相同,且已經在CmapX中定義了。

        例如,DataSet對象用類CmapXDataset實現。這和C++類的定義相一致。而每個MapX對象的屬性(Properties)是用類的成員函數來實現的。比如DataSet對象的名字(Name),就是用Name()函數來實現的,不過,Name()有兩種使用方法,即GetSet。如:

        CString GetName();//獲取對象名字

        void SetNameLPCTSTR);//設置對象名字

        部分MapX工具的應用

        (1) 全圖工具的改進

        一般全圖工具的代碼為:

        m_ctrlMapX.SetZoomm_ctrlMapX.GetGeoSetWidth());

        此方法的缺點是重新顯示全圖后,實際上是以上一個視圖的中心作為屏幕中心進行顯示,如果上一個視圖在全圖中的邊緣位置,點擊全圖工具后實際上不是初始設置的全圖。因此可以用如下代碼實現:

        CString mapname=m_ctrlMapX.GetGeoSet();//取得當前地圖的名字

        m_ctrlMapX.SetGeoSetmapname);//設置該地圖為主視區顯示圖

        (2) 創建信息工具

        MapX沒有提供信息工具,該工具是自定制工具。有兩種實現方法,其基本思想是:

        (1) 創建工具的鼠標指針類型(一般為“+”),當在工具欄上選擇此工具后,設置為當前工具,然后跟蹤鼠標在地圖上點擊的位置,觸發ToolUsed事件,根據位置信息確定相應的對象,然后讀取對象屬性或綁定的數據庫,彈出對話框,實現信息顯示。此種方法只適用于顯示地圖的最上層對象(在MapX自帶的C++例子“Buffer”中有具體實現代碼)。

        (2) 用選擇工具選中地圖上所要顯示信息的對象,然后再點擊工具欄上的信息工具,彈出對話框,實現信息顯示。此信息工具的實現代碼與(1)不同,沒有鼠標指針,實際上就是讀取選中對象的屬性或綁定的數據庫的操作。此方法適合顯示地圖上的任意圖層。

        兩種方法各有特點,第一種方法直接,但在實際應用中容易出現異常,第二種方法要多點擊一次,但應用穩定,而且適用地圖上的任意圖層。

        (3) 測距工具的使用注意事項

        MapXDistance()函數是針對地球地圖的,在非地球地圖中使用要注意數值轉換。否則測出的數據與實際相差甚遠。

        MapX進行GIS二次開發

        (1) 創建數據庫

        空間數據庫可以通過兩種方法創建,一種是通過MapX的圖層生成功能創建。MapX生成的每一圖層都對應一張表(table),該表中除了存有地理對象的位置坐標以外,還可以包含其他屬性字段;另一種方法是通過導入帶有地理位置信息的其他數據庫生成。MapX可以通過數據綁定把這些數據庫中的地理信息映射到地圖圖層上,MapX支持對多種常用數據庫的訪問。

        (2) 設置圖層控制和地圖投影

        在把地圖加入到MapX之前,我們可以使用MapX附帶的圖層管理工具Geoset Manager把要加入的圖層匹配在一起,建成一個圖層組,該圖層組規定了其中各個圖層的名稱、內容、屬性及各圖層之間的顯示順序。MapX中可以給圖層設置四種屬性:可顯示、可選擇、可編輯和自動標注。一般圖層的屬性是可顯示的,需要查詢的圖層設置為可選擇,需要修改的圖層設置為可編輯,而自動標注可以自動顯示圖層中地理對象的標簽。合理地設置這些屬性將有助于系統實現地理信息的維護和查詢功能。在匹配各個圖層時,應該注意各個圖層投影的設置。全部圖層必須使用一致的投影方法才能精確匹配。MapX中的地圖分為地球地圖和非地球地圖,地球地圖中對象的坐標用經緯度來表示,非地球地圖中對象的坐標通常是相對坐標,是相對于圖中的某個基準點來設置的。如果圖層的坐標不一致的話,必須先轉換坐標才能進行匹配。

        (3) 設計編輯功能

        MapX提供標準的地理對象類型定義,在MapX所提供的點、線、面類型選擇對話框中可以方便地選擇地理對象的類型,包括所使用的符號的形狀、顏色、大小等屬性。利用MapX提供的畫圖工具,可以為用戶設計出多種多樣的地理對象生成工具。利用MapX提供的多種地理信息對象的選擇工具(如矩形、圓形選擇工具),用戶可以調用這些選擇工具并和MapX所提供的編輯(刪除、修改等)地理對象功能相結合,以完成地理信息系統中地理對象的編輯操作。但要注意,對于地理數據和非地理數據要分別對待。

        (4) 設計查詢功能和分析統計功能

        對于地理信息系統中所要求的有關地理信息查詢功能和分析統計功能,MapX提供了一定的查詢和分析手段,如MapX可以根據圖層表中的字段值查詢相對應的地理對象;可以提供對應于圖層表中某個或某幾個字段的分析餅圖等。對于非地理信息,就要依據系統的具體要求用面向對象的語言設計查詢和分析統計功能。

      開發過程:

      1.前期學習,因為是利用別人的空間進行二次開發,所以必須先熟悉別人提供的函數接口一起定義的數據結構(類)。

      2.主要實現的功能:地圖的顯示,放大,縮小,移動,顯示某一點的信息等。很多功能只需要用一個函數就可以解決了。

      3.具體實現:

      定義一個CMapX的全局或成員變量,m_ctrlMapX

      (1)放大:m_ctrlMapX.SetCurrentTool(miZoomInTool);

      (2)縮小:m_ctrlMapX.SetCurrentTool(miZoomOutTool);

      (3)漫游:m_ctrlMapX.SetCurrentTool(miPanTool);

      (4)各種類型的選擇工具設置:

      m_ctrlMapX.SetCurrentTool(miSelectTool);

      m_ctrlMapX.SetCurrentTool(miRectSelectTool);

      m_ctrlMapX.SetCurrentTool(miRadiusSelectTool);

      m_ctrlMapX.SetCurrentTool(miPolygonSelectTool);

      (5)設置用戶自定義工具:

      m_ctrlMapX.SetCurrentTool(INFO_TOOL);

      (6)設置整張圖顯示

      try

      {

      m_ctrlMapX.SetZoom(m_ctrlMapX.GetGeoSetWidth());

      }

      catch (COleDispatchException *e)

      {

      e->ReportError();

      e->Delete();

      }

      catch (COleException *e)

      {

      e->ReportError();

      e->Delete();

      }

      (7)設置居中工具:

      m_ctrlMapX.SetCurrentTool(miCenterTool);

      (8) 地圖屬性信息:

      m_ctrlMapX.PropertyPage();

      (9)設置鼠標滾動放大縮小功能:

      m_ctrlMapX.SetMousewheelSupport(miMousewheelNoAutoScroll);

      (10)實現經緯度信息:

      這里稍微要麻煩一些,需要用到OLE的消息處理機制,相當于需要自定義消息處理,在自動生成的消息映射代碼后面添加如下(CPP文件里面):在MSDN里面有具體的使用方法,以及里面參數的意義。還有就是需要看MapX的幫助文檔看里面對應的消息。

      BEGIN_EVENTSINK_MAP(CMapXSampleView, CView)

      //鼠標單擊別選擇了用戶自定義的工具

      ON_EVENT(CMapXSampleView, IDC_MAP, MAPX_DISPID_TOOLUSED, OnInfoToolUsed, 

      VTS_I2 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_BOOL VTS_BOOL VTS_PBOOL)

      //這是后面用到的

      ON_EVENT(CMapXSampleView,IDC_MAP,DISPID_MOUSEMOVE,OnMouseMoveInMap,

      VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_XPOS_PIXELS)

      //視圖內容改變時

      ON_EVENT(CMapXSampleView, IDC_MAP1, MAPX_DISPID_MAPVIEWCHANGED, OnMapViewChanged, VTS_NONE)

      END_EVENTSINK_MAP()

      響應函數:

      //鼠標點擊取圖元信息

      void CMapXSampleView::OnInfoToolUsed(short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, BOOL Shift, BOOL Ctrl, BOOL *EnableDefault)

      {

      if (ToolNum == INFO_TOOL)

      {

      m_gX = X1;

      m_gY = Y1;

      CInfoDlg dlg;

      dlg.DoModal();

      }

      }

      其中在CInfoDlg有一個比較主要重要函數實現實現某一圖元的具體信息:

      void CInfoDlg::InfoToolUsed()

      {

      int iCount = 0;

      iCount = m_ctrlMapX.GetLayers().GetCount();

      //這點是搜索中心

      CMapXPoint pt;

      //這將搜索所有功能

      CMapXFeatures fs;

      //這將保留我們目前正在客戶的功能

      CMapXFeature feature;

      CMapXLayer layer;

      //創建一個調度的點

      pt.CreateDispatch(pt.GetClsid());

      pt.Set(m_gX, m_gY);

      double dLayerZoomMax,dLayerZoomMin;

      double dMapZoom;

      dMapZoom = m_ctrlMapX.GetZoom();

      for (int i=1; i<=iCount; i++)

      {

      layer = m_ctrlMapX.GetLayers().Item(i);

      dLayerZoomMax = layer.GetZoomMax();

      dLayerZoomMin = layer.GetZoomMin();

      if ((dLayerZoomMax >= dMapZoom && dLayerZoomMin <= dMapZoom) ||  (dLayerZoomMax == 0 && dLayerZoomMin ==0))

      {

      fs = m_ctrlMapX.GetLayers().Item(i).SearchAtPoint(pt);

      if (fs.GetCount() != 0)

      {

      CString buffer;

      CMapXDataset ds;

      feature = fs.Item(1);

      layer = feature.GetLayer();

      COleVariant layerVt;

      layerVt.vt = VT_DISPATCH;

      layerVt.pdispVal = layer.m_lpDispatch;

      layerVt.pdispVal->AddRef();

      ds = m_ctrlMapX.GetDatasets().Add(miDataSetLayer, layerVt);

      COleVariant ValueVt;

      int iFieldCount = ds.GetFields().GetCount();

      for (int i=0; i<iFieldCount; i++)

      {

      buffer = ds.GetFields().Item(i+1).GetName();

      m_ctrlInfoList.InsertItem(i, buffer);

      COleVariant vVal;

      for (int j=0; j<iFieldCount; j++)

      {

      vVal = ds.GetValue(feature.GetFeatureID(), j+1);

      //判斷是否有對應的值

      if (vVal.vt == VT_NULL)

      {

      continue ;

      }

      vVal.ChangeType(VT_BSTR);

      buffer = vVal.bstrVal;

      m_ctrlInfoList.SetItemText(j, 1, buffer);

      }// end for (int j = 0; j < iFieldCount; j++)

      }// end for (int i = 0; i < iFieldCount; i++)

      break;

      }// end if(fs.GetCount() != 0)

      }// end if (dLayerZoomMax >= dMapZoom && dLayerZoomMin <= dMapZoom)

      }// end for (int i = 1; i <= iCount; i++)

      }

      (11)實現地圖投影

      m_ctrlMapX.GetDisplayCoordSys().PickCoordSys();

      CMapXDatum datum;

      datum.CreateDispatch(datum.GetClsid());

      datum.SetFromList(0);

      m_ctrlMapX.GetDisplayCoordSys().Set(1, datum, COptionalVariant(),  COptionalVariant(),

      COptionalVariant(), COptionalVariant(), COptionalVariant(), COptionalVariant(), COptionalVariant(), 

      COptionalVariant(), COptionalVariant(), COptionalVariant(), COptionalVariant(), COptionalVariant()); 

      (12)圖層控制:

      try 

      {

      VARIANT vHelpFile, vHelpID;

      vHelpFile.vt = VT_ERROR;

      vHelpFile.scode = DISP_E_PARAMNOTFOUND;

      vHelpID.vt = VT_ERROR;

      vHelpID.scode = DISP_E_PARAMNOTFOUND;

      CMapXLayers layers = m_ctrlMapX.GetLayers();

      layers.LayersDlg(vHelpFile, vHelpID);

      }

      catch (COleDispatchException *e) 

      {

      e->ReportError();

      e->Delete();

      }

      catch (COleException *e) 

      {

      e->ReportError();

      e->Delete();

      }

      (13) 打開圖形文件:

      void CMapXSampleView::OnFileOpen() 

      {

      CFileDialog dlgFile(TRUE, "*.gst", NULL, OFN_HIDEREADONLY , szTabFilter, this);

      dlgFile.m_ofn.lpstrTitle = "Open MapInfo Map";

      if (dlgFile.DoModal() == IDCANCEL)

      {

      return ;

      }

      m_strFilePath = dlgFile.GetPathName();

      try 

      {

      // Close the existing set of map layers and load the Canada map

      TRACE0("Old Geoset: " + m_ctrlMapX.GetGeoSet());

      m_ctrlMapX.SetGeoSet(m_strFilePath);

      ((CMainFrame*)AfxGetApp()->GetMainWnd())->m_wndMyDialogBar.SetDlgItemText( IDC_EDIT_GEOSET_NAME, m_ctrlMapX.GetTitleText() );

      m_ctrlMapX.SetTitleText("");

      TRACE0("New Geoset: " + m_ctrlMapX.GetGeoSet());

      catch (COleDispatchException *e)

      {

      e->ReportError();

      e->Delete();

      catch (COleException *e) 

      {

      e->ReportError();

      e->Delete();

      }

      }

      4. 總結:

      開發GIS系統是相對比較復雜的,如果完全從零開始開發周期相對較慢,不過靈活性更高。現在有很多現成的開發包,把最基本的功能都實現了,我們只需要簡單調用提供的一種就可以了。

      posted @ 2010-02-05 17:55  薔薇理想人生  閱讀(1147)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 日韩有码中文字幕第一页 | 美女黄网站18禁免费看| 国产综合久久久久久鬼色| 五月综合网亚洲乱妇久久| 久久综合色最新久久综合色| 久9re热视频这里只有精品免费| 91久久精品国产性色也| 欧美乱码伦视频免费| 人人妻人人插视频| 久久国内精品一区二区三区| 国产成人精品一区二区三区免费| 日本不卡的一区二区三区| 午夜亚洲www湿好爽| 日日碰狠狠添天天爽五月婷| 99久久国产成人免费网站| 国产亚洲精品AA片在线播放天| 日韩精品一区二区三区中文无码| 午夜亚洲AV日韩AV无码大全 | 日本一区二区不卡精品| 成人午夜激情在线观看| 欧美成人h亚洲综合在线观看| 午夜DY888国产精品影院| 濮阳县| 无码国产偷倩在线播放老年人| 在线亚洲妇色中文色综合| 天堂亚洲免费视频| 国产日本一区二区三区久久| 亚洲精品一区二区三区在线观看 | 白玉县| 亚洲精品天堂在线观看| 午夜福利在线观看成人| 午夜精品福利亚洲国产| 少妇精品视频一码二码三| 三男一女吃奶添下面视频| 国产精品爽爽久久久久久竹菊| 囯产精品久久久久久久久久妞妞| 国产精品国产三级国av| 日韩有码国产精品一区| 国内少妇人妻丰满av| 人妻在线无码一区二区三区| 五月天丁香婷婷亚洲欧洲国产|