VC里使用MO

原创 2005年04月27日 14:34:00

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

VC+MO加载CAD图层代码

  • 2009年11月08日 00:48
  • 5KB
  • 下载

c#简单使用IBM-MO编程

c#简单使用IBM-MO编程1:TOPIC使用region topic #region 定义属性/字段 public MQQueueManager qMgr; public Mq...

MO+VC 开发总结

  • 2009年11月30日 23:23
  • 183KB
  • 下载

mo二次开发vc版

  • 2012年09月05日 10:41
  • 7.75MB
  • 下载

Android 6.0 Phone MO(去电)流程分析(应用层)

写在前面的话本文主要分析MO(去电)的流程,研究的代码是Android 6.0的,目前只关注应用层,以GSM为例。(如果图片看不清的话,可以右键选择在新标签中打开图片,或者把图片另存到自己电脑再查看。...

基于VB,使用MO开发的GIS

  • 2014年12月07日 07:15
  • 6KB
  • 下载

mo格式语言文件汉化方法

对于WordPress 来说,没有插件的辅助意义是没什么乐趣可言的。而WordPress的绝大部分的插件都是外语,基于WP的跨国性,采用标准的语言文件便于更好的跨国翻译使用。本地化插件的好处如果你的作...
  • shuiaaa
  • shuiaaa
  • 2011年06月20日 22:11
  • 2623

难懂的书之--android Call(MO)流程介绍

网上有很多的资料,我这里整理一份属于自己的。当然其中的很多内容还是来自网络,无所不能的网络啊~~~ 很多人的文章写Call的流程的时候,都是从OutgoingCallBroadcaster....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC里使用MO
举报原因:
原因补充:

(最多只允许输入30个字)