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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值