区块链技术博客
www.b2bchain.cn

QGIS实用技巧(四):保存图片之二求职学习资料

本文介绍了QGIS实用技巧(四):保存图片之二求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

  • 前言
  • 自带导出函数的局限性
    • 保存任意区域的图像
      • 区域计算
      • 抛出问题
      • 图元图层渲染
      • 背景图层渲染
      • 整体流程

前言

本章将为你讲述如何将 QGIS 顺利导出图片的后续内容。
废话不多说,书接上文。

自带导出函数的局限性

保存任意区域的图像

区域计算

……
(注:为了方便大家理清目录,在此接到上一章之前的标题)

抛出问题

上文提到的,为什么在计算出区域之后,不能够直接补齐场景的渲染函数 render函数呢?

如果大家这样做了,可以看到对于自己添加的图元是没有问题,可以绘制显示出来。

而对于背景地图图层(例如如 shp、卫星影像 等图像层)却是没有办法的。因为背景只与控件大小有关,即控件有多大,背景范围才多大。

因此我们只能分开渲染图元对象图层与背景地图图层。

那么如何分开渲染背景图像和图元对象呢?

图元图层渲染

可以看到上面我标注的图元是没有问题,可以绘制显示出来。也就是说场景的渲染函数 render是可以用的,只是多了不完整的背景图像。

因此我们只需要在使用场景的渲染函数 render的时候,隐藏掉背景图像,就是单独的图元对象图层渲染了。

那么如何隐藏背景图像呢?可以用如下方法:

scene()->setBackgroundBrush(Qt::NoBrush);

隐藏后再进行图元对象渲染即可。

背景图层渲染

背景地图渲染则要用到 QGIS 里面的 QgsMapRendererCustomPainterJob 类了。用法如下:
将之前计算得到的取整后的 rect 再做一道反算,将 控件坐标转GPS坐标 这样得到更精准的渲染区域。

// 计算背景区域 QPointF tlMap = pixelToMap(tl); QPointF brMap = pixelToMap(br);  // 构建 QgsRectangle 区域对象 QgsRectangle newRect(tlMap.x(), brMap.y(), brMap.x(), tlMap.y());

然后通过带入区域信息,渲染背景图层图像。

// 设置 mapSettings 对象 auto s = mapSettings(); // 设置输出大小 s.setOutputSize(sz); // 设置区域范围 s.setExtent(newRect); // 构建渲染任务对象 QgsMapRendererCustomPainterJob job(s, &painter); // 开始渲染 job.start(); // 等待完成 job.waitForFinished();

整体流程

上面已经分别叙述如何分开渲染,那么现在我们则将之前的操作合并即可。

bool CMapCanvas::saveImg(const QString&fileName, const QPointF&topLeft, const QPointF&bomRight) {     // 根据画布大小构建保存矩形     QPointF tl = mapToPixel(topLeft);     QPointF br = mapToPixel(bomRight);     // 区域取整     tl = QPointF(floor(tl.x()), ceil(tl.y()));     br = QPointF(ceil(br.x()), floor(br.y()));

  • 前言
  • 自带导出函数的局限性
    • 保存任意区域的图像
      • 区域计算
      • 抛出问题
      • 图元图层渲染
      • 背景图层渲染
      • 整体流程

前言

本章将为你讲述如何将 QGIS 顺利导出图片的后续内容。
废话不多说,书接上文。

自带导出函数的局限性

保存任意区域的图像

区域计算

……
(注:为了方便大家理清目录,在此接到上一章之前的标题)

抛出问题

上文提到的,为什么在计算出区域之后,不能够直接补齐场景的渲染函数 render函数呢?

如果大家这样做了,可以看到对于自己添加的图元是没有问题,可以绘制显示出来。

而对于背景地图图层(例如如 shp、卫星影像 等图像层)却是没有办法的。因为背景只与控件大小有关,即控件有多大,背景范围才多大。

因此我们只能分开渲染图元对象图层与背景地图图层。

那么如何分开渲染背景图像和图元对象呢?

图元图层渲染

可以看到上面我标注的图元是没有问题,可以绘制显示出来。也就是说场景的渲染函数 render是可以用的,只是多了不完整的背景图像。

因此我们只需要在使用场景的渲染函数 render的时候,隐藏掉背景图像,就是单独的图元对象图层渲染了。

那么如何隐藏背景图像呢?可以用如下方法:

scene()->setBackgroundBrush(Qt::NoBrush);

隐藏后再进行图元对象渲染即可。

背景图层渲染

背景地图渲染则要用到 QGIS 里面的 QgsMapRendererCustomPainterJob 类了。用法如下:
将之前计算得到的取整后的 rect 再做一道反算,将 控件坐标转GPS坐标 这样得到更精准的渲染区域。

// 计算背景区域 QPointF tlMap = pixelToMap(tl); QPointF brMap = pixelToMap(br);  // 构建 QgsRectangle 区域对象 QgsRectangle newRect(tlMap.x(), brMap.y(), brMap.x(), tlMap.y());

然后通过带入区域信息,渲染背景图层图像。

// 设置 mapSettings 对象 auto s = mapSettings(); // 设置输出大小 s.setOutputSize(sz); // 设置区域范围 s.setExtent(newRect); // 构建渲染任务对象 QgsMapRendererCustomPainterJob job(s, &painter); // 开始渲染 job.start(); // 等待完成 job.waitForFinished();

整体流程

上面已经分别叙述如何分开渲染,那么现在我们则将之前的操作合并即可。

bool CMapCanvas::saveImg(const QString&fileName, const QPointF&topLeft, const QPointF&bomRight) {     // 根据画布大小构建保存矩形     QPointF tl = mapToPixel(topLeft);     QPointF br = mapToPixel(bomRight);     // 区域取整     tl = QPointF(floor(tl.x()), ceil(tl.y()));     br = QPointF(ceil(br.x()), floor(br.y()));

  • 前言
  • 自带导出函数的局限性
    • 保存任意区域的图像
      • 区域计算
      • 抛出问题
      • 图元图层渲染
      • 背景图层渲染
      • 整体流程

前言

本章将为你讲述如何将 QGIS 顺利导出图片的后续内容。
废话不多说,书接上文。

自带导出函数的局限性

保存任意区域的图像

区域计算

……
(注:为了方便大家理清目录,在此接到上一章之前的标题)

抛出问题

上文提到的,为什么在计算出区域之后,不能够直接补齐场景的渲染函数 render函数呢?

如果大家这样做了,可以看到对于自己添加的图元是没有问题,可以绘制显示出来。

而对于背景地图图层(例如如 shp、卫星影像 等图像层)却是没有办法的。因为背景只与控件大小有关,即控件有多大,背景范围才多大。

因此我们只能分开渲染图元对象图层与背景地图图层。

那么如何分开渲染背景图像和图元对象呢?

图元图层渲染

可以看到上面我标注的图元是没有问题,可以绘制显示出来。也就是说场景的渲染函数 render是可以用的,只是多了不完整的背景图像。

因此我们只需要在使用场景的渲染函数 render的时候,隐藏掉背景图像,就是单独的图元对象图层渲染了。

那么如何隐藏背景图像呢?可以用如下方法:

scene()->setBackgroundBrush(Qt::NoBrush);

隐藏后再进行图元对象渲染即可。

背景图层渲染

背景地图渲染则要用到 QGIS 里面的 QgsMapRendererCustomPainterJob 类了。用法如下:
将之前计算得到的取整后的 rect 再做一道反算,将 控件坐标转GPS坐标 这样得到更精准的渲染区域。

// 计算背景区域 QPointF tlMap = pixelToMap(tl); QPointF brMap = pixelToMap(br);  // 构建 QgsRectangle 区域对象 QgsRectangle newRect(tlMap.x(), brMap.y(), brMap.x(), tlMap.y());

然后通过带入区域信息,渲染背景图层图像。

// 设置 mapSettings 对象 auto s = mapSettings(); // 设置输出大小 s.setOutputSize(sz); // 设置区域范围 s.setExtent(newRect); // 构建渲染任务对象 QgsMapRendererCustomPainterJob job(s, &painter); // 开始渲染 job.start(); // 等待完成 job.waitForFinished();

整体流程

上面已经分别叙述如何分开渲染,那么现在我们则将之前的操作合并即可。

bool CMapCanvas::saveImg(const QString&fileName, const QPointF&topLeft, const QPointF&bomRight) {     // 根据画布大小构建保存矩形     QPointF tl = mapToPixel(topLeft);     QPointF br = mapToPixel(bomRight);     // 区域取整     tl = QPointF(floor(tl.x()), ceil(tl.y()));     br = QPointF(ceil(br.x()), floor(br.y()));

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » QGIS实用技巧(四):保存图片之二求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们