概述: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);