VC+MapX鹰眼实现

在网上我看到了很多用VC+MapX实现的鹰眼,可功能都不全,看了清华出的那本<<用MapX开发地理信息系统>>上面有一个用vb作的鹰眼,功能不是很强,不过简单的也够用了,我翻译了一下写成了VC版的鹰眼。希望对新手有所帮助。

我的基本实现想法是,在同一个View窗口下家两个CMapX控件,一个称为主图,一个称为鹰眼图。

CMapX m_ctrlMapX; ///主图

CMapX m_eagleMapX; ///鹰眼图

注意事项:在View里的OnCreate函数一定要想创建m_eagleMapX,这样才能看见鹰眼图。既如此:

m_eagleMapX.Create(NULL, WS_VISIBLE, CRect(0, 0, 120, 120), this, IDC_MAP_EAGLE);
  m_eagleMapX.SetGeoSet(NULL);

  m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0, 0, 100, 100), this, IDC_MAP);
    m_ctrlMapX.SetGeoSet(NULL);

接下来,可以在主图里挑几层加到鹰眼图中(区域图层)

再在消息中映射几个消息:

ON_EVENT(CMTRSView, IDC_MAP_EAGLE, DISPID_MOUSEMOVE /* MouseMove */, OnMouseMoveEagleMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)
 ON_EVENT(CMTRSView, IDC_MAP_EAGLE, DISPID_MOUSEDOWN /* MouseDown */, OnMouseDownEagleMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)
 ON_EVENT(CMTRSView, IDC_MAP_EAGLE, DISPID_MOUSEUP /* MouseUp */, OnMouseUpEagleMap, VTS_I2 VTS_I2 VTS_R4 VTS_R4)
最后实现这几个函数:

void CMTRSView::OnMouseUpEagleMap(short Button, short Shift, float X, float Y)
{
 ///用户单击导航图上某点的处理
 if(strMouseState == "Begin")
 {
  double dblMapX1, dblMapY1;
  ///求出该点的地理坐标
  m_eagleMapX.ConvertCoord(&X, &Y, &dblMapX1, &dblMapY1, miScreenToMap);
  ///设置主图的地理坐标
  m_ctrlMapX.SetCenterX(dblMapX1);
  m_ctrlMapX.SetCenterY(dblMapY1);
 }
  ///用户在导航图上框出矩形区域时的处理
 if(strMouseState == "Move")
 {
  Single sngXMax, sngXMin, sngYMax, sngYMin;
  if(PreX < X)
  {
   sngXMax = X;
   sngXMin = PreX;
  }
  else
  {
   sngXMax = PreX;
   sngXMin = X;
  }

  if(PreX < Y)
  {
   sngYMax = Y;
   sngYMin = PreY;
  }
  else
  {
   sngYMax = PreY;
   sngYMin = Y;
  }

  double dblXMax, dblXMin, dblYMax, dblYMin;
  m_eagleMapX.ConvertCoord(&sngXMin, &sngYMin, &dblXMin, &dblYMin, miScreenToMap);
  m_eagleMapX.ConvertCoord(&sngXMax, &sngYMax, &dblXMax, &dblYMax, miScreenToMap);

  CMapXRectangle rect;
  rect.CreateDispatch(rect.GetClsid());
  rect.Set(dblXMin, dblYMin, dblXMin, dblYMax);
  m_ctrlMapX.SetBounds(rect.m_lpDispatch);
 }
 strMouseState = "Stop";
}

void CMTRSView::OnMouseDownEagleMap(short Button, short Shift, float X, float Y)
{
 CMapXFeatures ftrs = m_eagleMapX.GetLayers().Item("EagleLayer").AllFeatures();
 for(int i = 1; i <= ftrs.GetCount(); i++)
 {
  m_eagleMapX.GetLayers().Item("EagleLayer").DeleteFeature(ftrs.Item(i));
 }
 if(Button == vbLeftButton)
 {
  strMouseState = "Begin";
  PreX = X;
  PreY = Y;
 }

}

void CMTRSView::OnMouseMoveEagleMap(short Button, short Shift, float X, float Y)
{
 if(Button != vbLeftButton) return;
 CMapXRectangle rctMap;
 CMapXPoints pntsMap;
 CMapXPoint pntMap1, pntMap2, pntMap3, pntMap4;
 CMapXStyle styLine;
 CMapXFeatures ftrs;
 CMapXFeature ftr;
 Single sngX, sngY;

 
  ///得到鼠标单击点的地理坐标
 sngX = PreX;
 sngY = PreY;
 double dblMapX1, dblMapY1;
 m_eagleMapX.ConvertCoord(&sngX, &sngY, &dblMapX1, &dblMapY1, miScreenToMap);
 
  ///得到鼠标当前点的地理坐标
 double dblMapX2, dblMapY2;
 m_eagleMapX.ConvertCoord(&X, &Y, &dblMapX2, &dblMapY2, miScreenToMap);

 ///设置矩形的四角
 pntMap1.CreateDispatch(pntMap1.GetClsid());
 pntMap2.CreateDispatch(pntMap2.GetClsid());
 pntMap3.CreateDispatch(pntMap3.GetClsid());
 pntMap4.CreateDispatch(pntMap4.GetClsid());

 pntMap1.Set(dblMapX1, dblMapY2);
 pntMap2.Set(dblMapX2, dblMapY2);
 pntMap3.Set(dblMapX2, dblMapY1);
 pntMap4.Set(dblMapX1, dblMapY1);

 ///将矩形的四角加入点集中

 pntsMap.CreateDispatch(pntsMap.GetClsid());
 pntsMap.Add(pntMap1);
 pntsMap.Add(pntMap2);
 pntsMap.Add(pntMap3);
 pntsMap.Add(pntMap4);
 pntsMap.Add(pntMap1);

 styLine.SetLineColor(miColorBlack); ///定义样式的线条颜色
 styLine.SetLineWidth(1); ///定义样式的线条宽度
 styLine.SetLineStyle(3); ///虚线
 
 ///将导航图鹰眼层所有对象清空
 ftrs = m_eagleMapX.GetLayers().Item("EagleLayer").AllFeatures();
 for(int i = 1; i <= ftrs.GetCount(); i++)
 {
  m_eagleMapX.GetLayers().Item("EagleLayer").DeleteFeature(ftrs.Item(i));
 }

 ///在导航图鹰眼层画虚线矩形框,框出用户预选择的范围
 CMapXFeature ftrMap;
 COleVariant pntsVt, styVt;

 pntsVt.vt = VT_DISPATCH;
 pntsVt.pdispVal = pntsMap.m_lpDispatch;
 pntsVt.pdispVal->AddRef();

 styVt.vt = VT_DISPATCH;
 styLine.CreateDispatch(styLine.GetClsid());
 styVt.pdispVal = styLine.m_lpDispatch;
 styVt.pdispVal->AddRef();
 
 ftrMap = m_eagleMapX.GetFeatureFactory().CreateLine(pntsVt, styVt);
 m_eagleMapX.GetLayers().Item("EagleLayer").AddFeature(ftrMap);

 ///设置鼠标状态为"Move"
 strMouseState = "Move";
}

还有,可以在OnSize里面设置一下鹰眼图的大小.

还有什么问题可与我联系.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 9

打赏作者

collision

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值