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