麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

VC++开发GIS系统(216)重绘区之获取可视范围的所有区

之前的文章已经实现了 输入区 的相应功能,但现在只完成了绘图并保存的过程,如图示:

但现在的问题是当窗口发生重绘时,图形就消失了,所以这里有必要实现区的重绘功能。为了更高的绘图性能,这里设计在重绘时只绘制可见区域的图形,并设计函数如下。

函数定义

在_malaIO.h中的CPolyIO类中添加如下声明

public:
  void getAllPolys(malaScreen &pScreen, vector<malaPolyFile>&pAllPolys, CString &fileName);//获取某个文件中某一范围的所有的区
  • pScreen 当前屏幕坐标
  • pAllPolys 获取所有可见的区
  • fileName 区文件路径

函数实现

在_malaIO.cpp的CPolyIO类中实现上述函数

//获取某个文件中某一范围的所有的区
void CPolyIO::getAllPolys(malaScreen &pScreen, vector<malaPolyFile>&pAllPolys, CString &fileName)
{
  CFile file;
  file.Open(LPCTSTR(fileName), CFile::modeRead | CFile::modeCreate | CFile::modeNoTruncate);
  CArchive ar(&file, CArchive::load);
  if (pAllPolys.size())
    pAllPolys.clear();

  vector<malaPoint> tPoly;
  malaPolyPro tPolyPro;
  malaPoint tPoint;
  int pointNum;
  while (1)
  {
    try
    {
      ar >> tPolyPro.polyId >> tPolyPro.polyStyle >> tPolyPro.borderStyle >> tPolyPro.borderColor >> tPolyPro.borderWidth >> tPolyPro.fillColor >> tPolyPro.fillStyle;
      ar >> pointNum;
    }
    catch (CException* e)
    {
      break;
    }

    for (int i = 0; i < pointNum; i++)
    {
      try
      {
        ar >> tPoint.x >> tPoint.y;
      }
      catch (CException* e)
      {
        break;
      }
      tPoly.push_back(tPoint);
    }
    //检查是否在可视范围内

    malaLogic mylog;
    malaRect lineRc = mylog.getRect(tPoly);
    malaRect screenRc;
    screenRc.xmin = pScreen.lbx;
    screenRc.ymin = pScreen.lby;
    ScreenToCoord(pScreen.wScreen, 0, pScreen, &screenRc.xmax, &screenRc.ymax);

    if (mylog.isRectIntersect(lineRc, screenRc))
    {
      malaPolyFile MyPoly(tPoly, tPolyPro);
      pAllPolys.push_back(MyPoly);
    }
    tPoly.clear();
  }
  ar.Close();
  file.Close();
}

getRect 参考:VC++开发GIS系统(160)重绘线之获取一个图形的外接矩形

isRectIntersect 参考:VC++开发GIS系统(161)判断两个矩形是否相交

详细代码可以参考:GitHub

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子

留言板(小编看到第一时间回复)