gis1117
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
阅读:6873回复:23

MO基本代码(VC)2—来自侏罗纪公园[转帖]

楼主#
更多 发布于:2004-01-04 10:03
————————————————————————
MO基本代码(VC)2


////**********属性浏览**********
//

///////////////////////////////////////////////////////////////
//函数功能 : 选择地图要素
//处理过程 : 先得到鼠标点击的要素的Recordset,将鼠标点击的要素加入到Track层

//返 回 值 : void
//参数说明 : short Shift, //是否按下了Shift键
// long X, long Y
///////////////////////////////////////////////////////////////
void  SelectFeatToSelection(CMap1&  m_Map, short Shift, long X, long Y)
{
if(Shift==0)  CLISTrackLayer::ClearTrack(m_Map); //清除所有Track层数据

    long  ShapeType;
    CMoRecordset  selSet;
    if(SelectFeatureOnMap(m_Map,X,Y,m_SelTolerance,selSet,ShapeType))
// SelectFeatureOnMap函数参考如下
{
   CMoFields MoFields = selSet.GetFields();
CMoField  shapeField(MoFields.Item(COleVariant(TEXT("Shape"))));

if(ShapeType==moShapeTypePolygon)
{
   CMoPolygon shape(shapeField.Getvalue().pdispVal);
   CLISTrackLayer::AddTrack(m_Map,shape,TRACK_SYMBOL_BLOCK0);
}
if(ShapeType==moShapeTypeLine)
{
   CMoLine shape(shapeField.Getvalue().pdispVal);
   CLISTrackLayer::AddTrack(m_Map,shape,TRACK_SYMBOL_LINE0);
}
if(ShapeType==moShapeTypePoint)
{
   CMoPoint shape(shapeField.Getvalue().pdispVal);
   CLISTrackLayer::AddTrack(m_Map,shape,TRACK_SYMBOL_POINT0);
}
}
}

///////////////////////////////////////////////////////////////
//函数功能 :  选择地图要素,自动判断该要素属于那一层,返回该要素的Recordset和

//              要素所在图层的类型(点、线、面)
//返 回 值 : BOOL
//参数说明 : CMap1&  map,
//long X,  long Y,
//double ptSize,      选择范围
//CMoRecordset& set,  要素的Recordset(返回参数)
//long& ShapeType     要素所在图层的类型(返回参数)
///////////////////////////////////////////////////////////////
BOOL   SelectFeatureOnMap(CMap1&  map,long X,long Y,double ptSize,CMoRecordset
& set,long& ShapeType)
{
   double tolerance = map.ToMapDistance((float)ptSize);
   CMoPointmapPt(map.ToMapPoint((float)X, (float)Y));

   CMoLayers  layers(map.GetLayers());
   for(long i=0;i<layers.GetCount();i++)
   {
      CMoMapLayer Itemlayer(layers.Item(COleVariant(i)));
  if(!Itemlayer.GetVisible()) continue;
  ShapeType = Itemlayer.GetShapeType();
  if(Itemlayer.GetShapeType()==moShapeTypePolygon)
  {
      set = Itemlayer.SearchShape(mapPt,moPointInPolygon, TEXT(""));
  if(!set.GetEof()) return TRUE;
  }
  if(Itemlayer.GetShapeType()==moShapeTypePoint||Itemlayer.GetShapeType()==mo
ShapeTypeLine)
  {
      set = Itemlayer.SearchByDistance(mapPt,tolerance, TEXT(""));
  if(!set.GetEof()) return TRUE;
  }
   }
   return FALSE;
}

///////////////////////////////////////////////////////////////
//函数功能 : 取消选择
//处理过程 : 清除所有Track层数据
//返 回 值 : void
//参数说明 : CMap1&  map
///////////////////////////////////////////////////////////////
void  DelTrack(CMap1&  map)
{
   CLISTrackLayer::ClearTrack(map);
}

///////////////////////////////////////////////////////////////
//函数功能 : 输入线、矩形、多边形,选择与其有相交或包含关系的要素
//处理过程 :
//返 回 值 : BOOL
//参数说明 : BOOL  fromTrackShp, ;是否直接从Track层取几何图形来选择
//   int   nID           ;要输入几何图形的类型
///////////////////////////////////////////////////////////////
BOOL ShowLayerFWAttrib(CMap1&  m_Map, BOOL  fromTrackShp, int nID)
{
   CMoPolygon    poly;
   CMoLine       line;
   CMoRectangle  rect;
   CMoEllipse    Ellipse;
   int         shapeType = 0;
   if(fromTrackShp)
   {
   if(CLISTrackLayer::GetTrackCount(m_Map)!=1)
   {
   CLISTrackLayer::ClearTrack(m_Map);
   return FALSE;
   }

   if(CLISTrackLayer::GetTrackShapeType(m_Map,0)==moShapeTypePolygon)
   {
       CLISTrackLayer::GetTrackShape(m_Map,0,poly); //获得Track层的第一个多边

   if(!LPDISPATCH(poly)) return FALSE;
   shapeType = moShapeTypePolygon;
   }
      else if(CLISTrackLayer::GetTrackShapeType(m_Map,0)==moShapeTypeLine)

   {
       CLISTrackLayer::GetTrackShape(m_Map,0,line); //获得Track层的第一个线

   if(!LPDISPATCH(line)) return FALSE;
   shapeType = moShapeTypeLine;
   }
   else
   {
       CLISTrackLayer::ClearTrack(m_Map);
   return FALSE;
   }
   }
   else
   {
   if(nID==ID_MAP_POLYFWATT) //输入多边形
   {
          poly = m_Map.TrackPolygon();
      if(!LPDISPATCH(poly))  return FALSE;  
      CLISTrackLayer::AddTrack(m_Map,poly,TRACK_SYMBOL_BLOCK0);
  shapeType = moShapeTypePolygon;
   }
   else if(nID==ID_MAP_RECTFWATT) //输入矩形
   {
          rect = m_Map.TrackRectangle();
      if(!LPDISPATCH(rect))  return FALSE;
      CLISTrackLayer::AddTrack(m_Map,rect,TRACK_SYMBOL_BLOCK0);
  shapeType = moShapeTypeRectangle;
   }
   else if(nID==ID_MAP_CIRCLFWATT) //输入圆
   {
          Ellipse = m_Map.TrackCircle();
      if(!LPDISPATCH(Ellipse))  return FALSE;
      CLISTrackLayer::AddTrack(m_Map,Ellipse,TRACK_SYMBOL_BLOCK0);
  shapeType = moShapeTypeEllipse;
   }
   else if(nID==ID_MAP_LINEFWATT) //输入线
   {
          line = m_Map.TrackLine();
      if(!LPDISPATCH(line))  return FALSE;
      CLISTrackLayer::AddTrack(m_Map,line,TRACK_SYMBOL_LINE0);
  shapeType = moShapeTypeLine;
   }
   else
   {
  
   }
   }

   CString     LayerCode = FormatSDELayerCode(*m_LayerManger.m_curLayer);
   CMoLayers   layers(m_Map.GetLayers());
   CMoMapLayer Itemlayer(layers.Item(COleVariant(LayerCode)));  
   if(!LPDISPATCH(Itemlayer))
   {
      AfxMessageBox("打 不 开 选 中 的 层 !");
  return TRUE;
   }
   long ShapeType = Itemlayer.GetShapeType();

   CMoRecordset  selSet;
   if(shapeType == moShapeTypePolygon)
       selSet = Itemlayer.SearchShape(poly,moAreaIntersect, TEXT(""));
   else if(shapeType == moShapeTypeLine)
   selSet = Itemlayer.SearchShape(line,moAreaIntersect, TEXT(""));
   else if(shapeType == moShapeTypeRectangle)
       selSet = Itemlayer.SearchShape(rect,moAreaIntersect, TEXT(""));
   else if(shapeType == moShapeTypeEllipse)
       selSet = Itemlayer.SearchShape(Ellipse,moAreaIntersect, TEXT(""));
   else
   return  TRUE;
// 根据返回的Recordset对象在对话框中显示属性值,代码略
   return TRUE;
}

///////////////////////////////////////////////////////////////
//函数功能 : 根据表达式查询地图要素
//处理过程 :
//备    注 :
//返 回 值 :  BOOL
//参数说明 :  CMap1& map,
//CString layerCode, //查询目标图层的名称
//CString SQL,       //查询表达式,SQL形式
//CMoRecordset& selSet, //返回查询要素的Recordset
//long& ShapeType       //返回查询目标图层的类型
///////////////////////////////////////////////////////////////
BOOL  SQLSearchFeature(CMap1& map,CString layerCode,CString SQL,CMoRecordset&
selSet, long& ShapeType)
{
for(int i=0;i<m_LayerManger.m_layers.GetSize();i++)
{
if(!m_LayerManger.m_layers.m_Visible) continue;

    if(m_LayerManger.m_layers.m_LayerCode.CompareNoCase(layerCode)!=0) con
tinue;
// 寻找目标图层
    CMoLayers    layers = map.GetLayers();
    CMoMapLayer  SearchLayer(layers.Item(COleVariant(FormatSDELayerCode(m_Lay
erManger.m_layers))));
        if(!LPDISPATCH(SearchLayer)) return FALSE;

    VARIANT va;
        VariantInit(&va);
CMoRectangle  Rect,RectCell;
Rect.CreateDispatch(TEXT("MapObjects2.Rectangle"));
RectCell.CreateDispatch(TEXT("MapObjects2.Rectangle"));

BOOL  Flag = TRUE;
ShapeType = SearchLayer.GetShapeType();
        selSet = SearchLayer.SearchExpression(SQL);
if(selSet.GetEof()) return FALSE;
        while(!selSet.GetEof())
{
   CMoFields MoFields = selSet.GetFields();
CMoField  shapeField(MoFields.Item(COleVariant(TEXT("Shape"))));

if(ShapeType==moShapeTypePolygon)
{
   CMoPolygon shape(shapeField.Getvalue().pdispVal);
   CLISTrackLayer::AddTrack(map,shape,TRACK_SYMBOL_BLOCK1);
   RectCell = shape.GetExtent();
}
if(ShapeType==moShapeTypeLine)
{
   CMoLine shape(shapeField.Getvalue().pdispVal);
   CLISTrackLayer::AddTrack(map,shape,TRACK_SYMBOL_LINE1);
   RectCell = shape.GetExtent();
}
if(ShapeType==moShapeTypePoint)
{
   CMoPoint shape(shapeField.Getvalue().pdispVal);
   CLISTrackLayer::AddTrack(map,shape,TRACK_SYMBOL_POINT1);
   RectCell.SetLeft(shape.GetX()-1);
   RectCell.SetRight(shape.GetX()+1);
   RectCell.SetTop(shape.GetY()+1);
   RectCell.SetBottom(shape.GetY()-1);
}
if(Flag)
{
   Rect = RectCell;
   Flag = FALSE;
}
else
{
   if(Rect.GetLeft()>RectCell.GetLeft())   Rect.SetLeft(RectCell.GetLeft())
;
   if(Rect.GetRight()<RectCell.GetRight())   Rect.SetRight(RectCell.GetRigh
t());
   if(Rect.GetBottom()>RectCell.GetBottom())   Rect.SetBottom(RectCell.GetB
ottom());
   if(Rect.GetTop()<RectCell.GetTop())   Rect.SetTop(RectCell.GetTop());
}

selSet.MoveNext();
}
Rect.ScaleRectangle(1.2);
map.SetExtent(Rect);
map.Refresh();
    break;
}
return TRUE;
}

///////////////////////////////////////////////////////////////
//函数功能 :  坐标点定位
//返 回 值 : void
//参数说明 : CMap1& m_Map,
//   long X, long Y; 坐标点
///////////////////////////////////////////////////////////////
void SetPos(CMap1& m_Map, long X,long Y)
{
CMoRectangle  moRect(m_Map.GetExtent());
CMoRectangle  moRectNew;
moRectNew.CreateDispatch(TEXT("MapObjects2.Rectangle"));
moRectNew.SetLeft(X - moRect.GetWidth()/2.0);
moRectNew.SetRight(X + moRect.GetWidth()/2.0);
moRectNew.SetTop(Y + moRect.GetHeight()/2.0);
moRectNew.SetBottom(Y - moRect.GetHeight()/2.0);
m_Map.SetExtent(moRectNew);
    m_Map.Refresh();
}
喜欢0 评分0
gis1117
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
1楼#
发布于:2004-01-04 10:04
////**********图形浏览**********
//

///////////////////////////////////////////////////////////////
//函数功能 : 拉框放大
//返 回 值 : void
//参数说明 : CMap1& map
///////////////////////////////////////////////////////////////
void ZoomIn(CMap1& map)
{
CMoRectangle r(map.TrackRectangle());
if (LPDISPATCH(r))
map.SetExtent(r);
}

///////////////////////////////////////////////////////////////
//函数功能 : 点击缩小
//返 回 值 : void
//参数说明 : CMap1& map
///////////////////////////////////////////////////////////////
void ZoomOut(CMap1& map)
{
CMoRectangle r(map.GetExtent());
ASSERT(LPDISPATCH(r));
r.ScaleRectangle(1.5);  //1.5为每次缩小比例
map.SetExtent(r);
}

///////////////////////////////////////////////////////////////
//函数功能 : 漫游
//返 回 值 : void
//参数说明 : CMap1& map
///////////////////////////////////////////////////////////////
void Pan(CMap1& map)
{
map.Pan();
}

///////////////////////////////////////////////////////////////
//函数功能 : 刷新
//返 回 值 : void
//参数说明 : CMap1& map
///////////////////////////////////////////////////////////////
void Refresh(CMap1& map)
{
map.Refresh();
}

///////////////////////////////////////////////////////////////
//函数功能 : 全图显示
//返 回 值 : void
//参数说明 : CMap1& map
///////////////////////////////////////////////////////////////
void ZoomFull(CMap1& map)
{
CMoRectangle r(map.GetFullExtent()); //获得地图全图范围
ASSERT(LPDISPATCH(r));
map.SetExtent(r);
}

///////////////////////////////////////////////////////////////
//函 数 名 : Identify
//函数功能 : 属性查询
//处理过程 :
//返 回 值 : void
//参数说明 : long X, long Y ;X,Y为鼠标点击地图屏幕时,鼠标的屏幕位置
///////////////////////////////////////////////////////////////
void  Identify(long X,long Y)
{
long          ShapeType;
    CMoRecordset  selSet;  
CMoMapLayer   selLayer;
    if(SelectFeatureOnMap(*m_Map,X,Y,m_SelTolerance/* 咬合范围的大小 */,selSet
,ShapeType,selLayer))
 //SelectFeatureOnMap函数参考如下
{
   CMoFields MoFields = selSet.GetFields();  
FlashMoFields(*m_Map,MoFields,ShapeType); //使所选择的要素闪烁
// 根据返回的Recordset对象在无模式对话框中显示属性值,代码略
}
}


///////////////////////////////////////////////////////////////
//函数功能 : 返回要素属性
//处理过程 :
//返 回 值 : BOOL
//参数说明 : CMap1&  map, long X, long Y, double ptSize,
//   CMoRecordset& set,  该要素的Recordset (返回参数)
//   long& ShapeType,   要素所在图层的类型(返回参数)
//   CMoMapLayer& layer  要素所在图层      (返回参数)
///////////////////////////////////////////////////////////////

BOOL   SelectFeatureOnMap(CMap1&  map,long X,long Y,double ptSize,CMoRecordset
& set,long& ShapeType,CMoMapLayer& layer)
{
   double tolerance = map.ToMapDistance((float)ptSize);
   CMoPointmapPt(map.ToMapPoint((float)X, (float)Y));

   CMoLayers  layers(map.GetLayers());
   for(long i=0;i<layers.GetCount();i++)
   {
      CMoMapLayer Itemlayer(layers.Item(COleVariant(i)));
  if(!Itemlayer.GetVisible()) continue;
  ShapeType = Itemlayer.GetShapeType();
  if(Itemlayer.GetShapeType()==moShapeTypePolygon)
  {
      set = Itemlayer.SearchShape(mapPt,moPointInPolygon, TEXT(""));
  layer = Itemlayer;
  if(!set.GetEof()) return TRUE;
  }
  if(Itemlayer.GetShapeType()==moShapeTypePoint||Itemlayer.GetShapeType()==mo
ShapeTypeLine)
  {
      set = Itemlayer.SearchByDistance(mapPt,tolerance, TEXT(""));
  layer = Itemlayer;
  if(!set.GetEof()) return TRUE;
  }
   }
   return FALSE;
}

///////////////////////////////////////////////////////////////
//函数功能 : 使Recordset对应的要素闪烁
//返 回 值 : void
//参数说明 : CMap1& map, CMoFields MoFields,  MoFields为要素的Recordset对应的
Fields
//   long ShapeType
///////////////////////////////////////////////////////////////
void   FlashMoFields(CMap1& map,CMoFields MoFields,long ShapeType)
{
    CMoField  shapeField(MoFields.Item(COleVariant(TEXT("Shape"))));

if(ShapeType==moShapeTypePolygon)
{
   CMoPolygon shape(shapeField.Getvalue().pdispVal);
   map.FlashShape(shape,2);  // 2为闪烁次数
}
if(ShapeType==moShapeTypeLine)
{
   CMoLine shape(shapeField.Getvalue().pdispVal);
   map.FlashShape(shape,2);
}
if(ShapeType==moShapeTypePoint)
{
   CMoPoint shape(shapeField.Getvalue().pdispVal);
   map.FlashShape(shape,2);
}
}

///////////////////////////////////////////////////////////////
//函数功能 : 设置地图显示比例尺
//处理过程 : 先得到屏幕上一米包含多少个象素点,地图的宽度(象素点值)除以该值
得到
//             地图的显示实际宽度(米),地图的显示宽度(米)乘地图显示的比例尺
即得到该比例尺
//             下地图宽度(象素点值)
//返 回 值 : void
//参数说明 : CMap1& map, double scale ;scale为地图显示比例尺
///////////////////////////////////////////////////////////////
void SetMapScale(CMap1& map,double scale)  
{
CDC* pDC = map.GetDC();

double MiterPointNum = (1000.0/25.4)*GetDeviceCaps(pDC->m_hDC,LOGPIXELSX);  

//MiterPointNum为屏幕上一米有多少个象素点
    //GetDeviceCaps(pDC->m_hDC,LOGPIXELSX) 返回屏幕横轴方向上每英寸长度包含的象
素个数
CRect r = GetDeviceRect(pDC);
double widthX =  r.Width()*scale/MiterPointNum;
double widthY =  r.Height()*scale/MiterPointNum;  

CMoRectangle  moRect(map.GetExtent());
   CMoPoint  pt(moRect.GetCenter());

CMoRectangle  moRectNew;
if(!moRectNew.CreateDispatch(TEXT("MapObjects2.Rectangle")))
   return;

moRectNew.SetLeft(pt.GetX()-widthX/2.0);
moRectNew.SetRight(pt.GetX()+widthX/2.0);
moRectNew.SetTop(pt.GetY()+widthY/2.0);
moRectNew.SetBottom(pt.GetY()-widthY/2.0);
map.SetExtent(moRectNew);
    map.Refresh();
map.ReleaseDC(pDC);
}

--
GIS尚未明白,学习还需努力




※ 来源:.侏罗纪公园 http://bbs.cug.edu.cn[FROM: 10.58.4.194]
[回文章] [返回上一页][本讨论区]
举报 回复(0) 喜欢(0)     评分
zzqgis
路人甲
路人甲
  • 注册日期2003-08-26
  • 发帖数70
  • QQ
  • 铜币9枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2004-01-06 09:09
太好了,雪中送炭也
举报 回复(0) 喜欢(0)     评分
sjf_2003
路人甲
路人甲
  • 注册日期2003-12-05
  • 发帖数145
  • QQ
  • 铜币165枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2004-01-11 00:13
大哥,缘分啊
举报 回复(0) 喜欢(0)     评分
cole
路人甲
路人甲
  • 注册日期2003-07-28
  • 发帖数80
  • QQ
  • 铜币582枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2004-01-12 18:07
hao
举报 回复(0) 喜欢(0)     评分
Hynix
路人甲
路人甲
  • 注册日期2003-09-10
  • 发帖数79
  • QQ23601474
  • 铜币276枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2004-02-17 23:39
好是好,如果写在一个文件用来下载就更好了
举报 回复(0) 喜欢(0)     评分
bianguowei
路人甲
路人甲
  • 注册日期2004-02-06
  • 发帖数51
  • QQ
  • 铜币280枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2004-02-20 16:08
very good.
举报 回复(0) 喜欢(0)     评分
limail
路人甲
路人甲
  • 注册日期2004-04-13
  • 发帖数14
  • QQ
  • 铜币224枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2004-04-13 09:40
good
举报 回复(0) 喜欢(0)     评分
fwting59
路人甲
路人甲
  • 注册日期2003-10-25
  • 发帖数6
  • QQ
  • 铜币124枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2004-04-26 12:22
ding
举报 回复(0) 喜欢(0)     评分
yoyogao
路人甲
路人甲
  • 注册日期2004-05-14
  • 发帖数62
  • QQ
  • 铜币430枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2004-05-22 10:42
<img src="images/post/smile/dvbbs/em02.gif" /><img src="images/post/smile/dvbbs/em02.gif" /><img src="images/post/smile/dvbbs/em01.gif" />
Study and Use GIS,As a GIS Men。 qq群:3712090-gis space
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部