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

Linux--mo和po文件

含义: PO 是 Portable Object (可移植对象)的缩写形式;MO 是 Machine Object (机器对象) 的缩写形式。 PO 文件是面向翻译人员的、提取于源代码的一种资...
  • here_c_my
  • here_c_my
  • 2015年03月23日 16:20
  • 2146

如何使用gettext, po, mo制作多语言应用程序

 一、翻译档制作部分1、制作po档(1)生成template文件xgettext -k_ -o ui_pref.pot ui.c pref.pot head. ...
  • hwizhao
  • hwizhao
  • 2008年02月19日 15:42
  • 3253

【汉化】使用gettext和poedit对xibo-mo文件进行汉化编辑

下载 下载gettext,我用的是windows版本,下载地址 下载poedit,然后安装。下载地址 确认已经下载了xibo的源代码,下载安装流程 文件转换在命令行界面,进入gettext目录下的bi...
  • xuexiiphone
  • xuexiiphone
  • 2016年06月02日 16:57
  • 1517

vc里使用GDI+

vc里使用GDI+下面是开始的设置,方便有这个需求的朋友使用. :)GDI+是什么?GDI+ 是面向 C/C++ 程序员的基于类的应用程序编程接口 (API)。它使应用程序可以将图形和格式化文本同时用...
  • chongfeng90
  • chongfeng90
  • 2011年05月20日 16:06
  • 214

vc里使用GDI+

GDI+是什么?GDI+ 是面向 C/C++ 程序员的基于类的应用程序编程接口 (API)。它使应用程序可以将图形和格式化文本同时用于视频显示和打印机。GDI+ 代表应用程序与设备驱动程序进行交互。G...
  • Augusdi
  • Augusdi
  • 2011年07月25日 09:04
  • 1109

语言文件 po 和 mo 的互相转换

语言文件 po 和 mo 的互相转换 今天要反编译一个mo的语言文件,顺手查了一下mo、po语言文件的相互转换,贴出来分享一下。 --------- 涉及的套件: ...
  • alaclp
  • alaclp
  • 2012年08月01日 02:04
  • 1844

MO和MT

以前做网关的时候经常接触这些术语,很长时间没用,都忘记了,网上找了点资料拿来回忆学习。MO,MT,Linkid的关系是什么在做SP的过程中,有这样一些词是必须知道的。 如MO,MT,GSM,LINKI...
  • improveyourself
  • improveyourself
  • 2011年05月12日 14:45
  • 5236

Po文件 和 Mo文件

po文件是GNU gettext项目的一套应用规范,属于L10n方案。 PO 是 Portable Object (可移植对象)的缩写形式;MO 是 Machine Object (机器对象) 的缩写...
  • joker0910
  • joker0910
  • 2011年04月04日 18:44
  • 7969

续上篇,改用struts2实现JQuery的ajax异步请求

····································································································...
  • YAN_HUAXIANGMO
  • YAN_HUAXIANGMO
  • 2017年09月03日 16:25
  • 246

vc中使用lib方法

vc6.0 中使用lib文件 使用库的方法如下:1. 包含库的头文件在应用程序工程中使用#include "file path"file path可以为绝对路径,也可以为相对于工程所在目录的相对路径如...
  • flyingstarwb
  • flyingstarwb
  • 2008年07月30日 14:30
  • 8604
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC里使用MO
举报原因:
原因补充:

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