VC裏使用MO

概述:mapobjects是ESRI公司的一個GIS的二次開發產品。
在GIS行業裏有二大公司。一個就是ESRI,還有一個就是MapInfo公司。

在ESRI公司裏,它們的所有的GIS產品都是叫ArcGIS。包括:
ArcIMS這是用於把GIS發佈到Internet上。還支持使用JSP等做開發。
ArcSDE是在數據庫管理系統中存儲和管理多用戶空間數據庫的通路。
簡單的說來就是一個網上的地圖服務器。
ArcView是用於核心的製圖還有GIS功能。
ArcEditor包括了AcrView的全部功能,還增加了對空間數據庫的編輯能力。
ArcInfo包括了ArcView還有ArcEditor的功能,還有高級的空間處理能力。是一個完全的GIS數據建立,更新,查詢製圖和分析系統。
ArcObjects與MapObjects是ESRI公司的二次開發的組件工具。ArcObjects的功能要比MO強大。ArcView就是使用AO開發出來的。
新版本的ESRI公司的產品裏有一個ArcServer它將一些功能註冊爲一些WebServer。減少了開發的次數。

在MapInfo公司裏,它們的地圖編輯軟件就是MapInfo。二次開發的組件就是MapX.

開始使用MO之前要了解一些這樣的基本的概念。MO顯示是使用了一個MO的控件。它可以加載圖層,可以放大,縮小等等。
每個圖層都對應一個表,還有shp文件。這個表中保存了本圖層中全部的點線面的屬性信息。我們可以對圖層渲染讓一些點可以把它的屬性信息顯示出來。這就是所謂的標註。
還可以在圖層裏去找這個圖層裏找一些shp,爲它定位。

1.先要把MapObjects給加載到工程中。
2.在安裝目錄下去找到這三個文件。它對MapObjects的一些常用的操作進行了封裝。我們可以直接使用這一些函數庫來減少我們自己的代碼。./Samples/MFC/Common/目錄下的:MapHelper.cpp,MapHelper.h,MapObjects2.h。
3.開始做加載圖層。你可以把你的exe程序的目錄下新建一個地圖文件夾,保存你這個程序需要加入的地圖文件。使用函數庫裏的AddLayer函數來加載圖層。
4.放大,縮小,漫遊.映射好鼠標點擊事件,調用幾個方法就可以實現三個功能。

 switch(m_nCurrID)
 {
 case ID_MAP_ZOOMIN:
  {
   CMoRectangle r(m_map.TrackRectangle());
   if (LPDISPATCH(r))
   {
    m_map.SetExtent(r);
   }
  }
  break;
 case ID_MAP_ZOOMOUT:
  {
   CMoRectangle r(m_map.GetExtent());
   r.ScaleRectangle(1.5);
   m_map.SetExtent(r);
  }
  break;
 case ID_MAP_PAN:
  {
   m_map.Pan();
  }
 case ID_MAP_LABEL:
  {
  }
  break;
 default:
  break;
 }

5.如何在圖層裏找到一個shp。
//查詢函數
void CMODemoView::FindShape(CString searchText)
{

//查詢的語句,表示當前我要到這個圖層裏找表中字段爲Name,=什麼。。。
 CString expression;
 expression.Format("(Name Like '%%%s%%')", searchText);

//找到我們要查詢的這個圖層
 CMoLayers layers(m_map.GetLayers());
 CMoMapLayer layer(layers.Item(COleVariant(TEXT("label1"))));

//開始在這個圖層裏查詢
 CMoRecordset recs(layer.SearchExpression(expression));
 
//如果查詢成功了
 if (recs.GetEof())
 {
  ::MessageBeep(MB_ICONHAND);
 }
 else
 {
//從記錄集裏得到這個shape文件出來
  CMoFields fields(recs.GetFields());
  CMoField  shapeField(fields.Item(COleVariant(TEXT("Shape"))));
  
//這裏這個shape文件是一個點對象
  CMoPoint shape(shapeField.GetValue().pdispVal);
  CMoRectangle r(m_map.GetFullExtent());

//取一個固定的比例,已這個點對象爲中心定位。
  r.ScaleRectangle(0.01999);
  m_map.SetExtent(r);
  m_map.CenterAt(shape.GetX(),shape.GetY());

//將這個點閃動三次  
m_map.Refresh(); // force redraw
  m_map.FlashShape(shape, 3);
  
 }
}
6.如何把圖層中的shp的屬性顯示出來。做爲標註。
//找到這個圖層
 CMoLayers layers(m_map.GetLayers());
 CMoMapLayer lable1(layers.Item(COleVariant(TEXT("label1"))));
 
 //新建一個標註對象
 CMoLabelPlacer labelPlacer;
 labelPlacer.CreateDispatch("MapObjects2.LabelPlacer");

//選擇將Name這個字段做爲標註
 labelPlacer.SetField(TEXT("Name"));
 labelPlacer.SetDrawBackground(false);
 labelPlacer.SetAllowDuplicates(false);
 labelPlacer.SetPlaceAbove(false);
 labelPlacer.SetPlaceBelow(false);
 labelPlacer.SetPlaceOn(true);
 labelPlacer.SetSymbolHeight(m_map.GetFullExtent().GetHeight());

//爲這個標註對象設置字體
 CMoTextSymbol textSymbol(labelPlacer.GetDefaultSymbol());
 CMoFont fnt;
 fnt.SetName(TEXT("宋體"));
 fnt.SetSize(10);
 textSymbol.SetFont(fnt);

將標註對象與圖層對象關連
 lable1.SetRenderer(labelPlacer);

7.如何在已有圖層裏圖點,線,面
先要定義一個保存點,線,面的vector
在點擊函數裏寫這樣的代碼主要的功能見註解:
//得到動態的圖層
CMoTrackingLayer tLayer(m_map.GetTrackingLayer());
 case ID_MAP_RANGER:
  {
//新增一個點對象
   CMoRectangle rect(m_map.TrackRectangle());
   if (LPDISPATCH(rect))
   {
//保存到點對象數組中
    m_Rects.push_back(rect);
   }
   
//觸發動態圖層重畫
   VARIANT var;
   var.vt=VT_DISPATCH;
   var.pdispVal=rect.m_lpDispatch;
   
   tLayer.Refresh(true,var);
  }
  break;
 case ID_MAP_POINT:
  {
   CMoPoint point(m_map.ToMapPoint((float)X, (float)Y));
   if (LPDISPATCH(point))
   {
    m_Points.push_back(point);
   }
   
   CMoRectangle r;
   r.CreateDispatch(TEXT("MapObjects2.Rectangle"));

   r.SetBottom(point.GetY());
   r.SetTop(point.GetY()+1.0);

   r.SetLeft(point.GetX());
   r.SetRight(point.GetX()+1.0);

   r.ScaleRectangle(50.0);
   VARIANT var;
   var.vt=VT_DISPATCH;
   var.pdispVal=r.m_lpDispatch;

   tLayer.Refresh(true,var);
  }
  break;
來看一下這個動態圖層的重畫函數如何寫
 CMoSymbol sym;
 if (!sym.CreateDispatch("MapObjects2.Symbol"))
  return;
 sym.SetColor(moPurple);

 //
 // Draw points
 //
 sym.SetColor(moRed);
 sym.SetSymbolType(moPointSymbol);
 sym.SetStyle(moCircleMarker);
 for (int i = 0; i < m_Points.size(); i++)
  m_map.DrawShape(m_Points[i], sym);
 
 //
 // Draw points
 //
 sym.SetColor(moBlue);
 sym.SetSymbolType(moFillSymbol);
 sym.SetStyle(moGrayFill);
 for ( i = 0; i < m_Rects.size(); i++)
  m_map.DrawShape(m_Rects[i], sym);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章