gis1117
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
阅读:6928回复: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
MercuryGE
路人甲
路人甲
  • 注册日期2006-03-08
  • 发帖数3
  • QQ
  • 铜币107枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2006-10-25 23:42
<P>怎么什么也看不见?</P>
举报 回复(0) 喜欢(0)     评分
caysno
路人甲
路人甲
  • 注册日期2006-05-22
  • 发帖数14
  • QQ
  • 铜币179枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2006-09-07 12:10
怎么看不到贴子
举报 回复(0) 喜欢(0)     评分
jiaowei
路人甲
路人甲
  • 注册日期2006-05-15
  • 发帖数21
  • QQ
  • 铜币174枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2006-09-06 20:59
<P><a href="mailtjiaowei_bit@163.com" target="_blank" >jiaowei_bit@163.com</A></P>
<P>哪位热心的朋友给发一份?我很需要啊! 我把天底下最真挚的祝福送给他/她!</P>
举报 回复(0) 喜欢(0)     评分
wnfanny
路人甲
路人甲
  • 注册日期2005-03-25
  • 发帖数9
  • QQ
  • 铜币174枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2006-06-15 09:41
wnfanny@sina.com.cn
举报 回复(0) 喜欢(0)     评分
河马
路人甲
路人甲
  • 注册日期2005-06-29
  • 发帖数48
  • QQ
  • 铜币74枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2006-06-05 22:44
为什么我看不到阿
[ftf=仿宋_GB2312]支持奥运![/ft][ftc=#F68E54]支持GIS![/ft][em]e20[/em]
举报 回复(0) 喜欢(0)     评分
xiaoger
路人甲
路人甲
  • 注册日期2006-05-29
  • 发帖数2
  • QQ
  • 铜币105枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2006-05-30 12:41
ok good<br>
举报 回复(0) 喜欢(0)     评分
zhangliyong16
路人甲
路人甲
  • 注册日期2006-04-15
  • 发帖数35
  • QQ
  • 铜币212枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2006-05-06 22:11
<P>谢谢,虽然我看不见</P>
<P>怎么看不见??怎么看不见??好好郁闷啊</P>
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
zhangliyong16
路人甲
路人甲
  • 注册日期2006-04-15
  • 发帖数35
  • QQ
  • 铜币212枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2006-05-04 00:02
怎么看不见??郁闷
举报 回复(0) 喜欢(0)     评分
chenjf1222
路人甲
路人甲
  • 注册日期2005-05-09
  • 发帖数4
  • QQ
  • 铜币116枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2006-04-08 17:37
那里?
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部