目录
1、使用平台以及版本
VS 2022 编译器MSVC2019
QT版本 5.15.2
系统:win10
QGIS版本 3.26.9
2、显示一张tif格式的图片
代码:
#include "QtWidgetsApplication2.h"
#include <QtWidgets/QApplication>
#include <qgsapplication.h>
#include <qgsmapcanvas.h>
#include <qgsrasterlayer.h>
#include <qgsmaptoolpan.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtWidgetsApplication2 w;
QgsMapCanvas map_canvas;
QgsRasterLayer layer(R"(C:\Users\jin'yi'zhi\Desktop\images\111.tiff)"); //括号内的路径是本地影像路径,需要更改
map_canvas.setLayers({ &layer });
map_canvas.setExtent(layer.extent());
map_canvas.refresh();
QgsMapToolPan map_tool_pan(&map_canvas);
map_canvas.setMapTool(&map_tool_pan);
w.setCentralWidget(&map_canvas);
w.show();
return a.exec();
}
运行结果:
图片是jpg格式的,我拿转换器转换成tiff格式,就可以显示出来了。
3、代码的具体分析
QtWidgetsApplication2 w;
这里创建了一个名为 w
的 QtWidgetsApplication2
对象,是应用程序的主窗口
QgsMapCanvas map_canvas;
创建了一个名为 map_canvas
的地图画布,用于显示地图图层和进行交互操作
QgsRasterLayer layer(R"(C:\Users\jin'yi'zhi\Desktop\images\111.tiff)");
QgsRasterLayer layer(...);
: 创建一个名为 layer
的光栅图层对象,使用指定的 TIFF 影像文件作为图层数据。文件路径需要根据实际情况进行更改。
map_canvas.setLayers({ &layer });
map_canvas.setLayers({ &layer });
: 将创建的图层对象添加到地图画布中,这样地图画布就能够显示该图层的内容。
map_canvas.setExtent(layer.extent());
map_canvas.setExtent(layer.extent());
: 设置地图画布的显示范围为图层的范围,确保整个图层都能在画布中显示出来。
map_canvas.refresh();
map_canvas.refresh();
: 刷新地图画布,使添加的图层和范围生效显示。
QgsMapToolPan map_tool_pan(&map_canvas);
QgsMapToolPan map_tool_pan(&map_canvas);
: 创建一个名为 map_tool_pan
的地图工具,用于实现平移地图的交互操作。
map_canvas.setMapTool(&map_tool_pan);
map_canvas.setMapTool(&map_tool_pan);
: 将地图工具设置为平移工具,这样用户就可以通过拖动地图来改变视图位置。
w.setCentralWidget(&map_canvas);
w.setCentralWidget(&map_canvas);
: 将地图画布设置为主窗口的中央部件,使其成为应用程序窗口的核心显示区域。
w.show();
: 显示主窗口,将创建的地图画布和图层显示出来,允许用户与地图进行交互。
4、一点基础知识
tif格式是栅格数据,例如图像,是由多个像素点组成,一般用在生成地图山脉,河流那种背景。
而shapefile格式是矢量数据,存储的是地图边框的数据点,也包括颜色,格式形式是xxx.shp,但是这个文件不能单独存在,同级目录下必须包含dbf 数据表 prj 坐标信息等其他信息格式。
就像是这个图,就不仅包含了shp格式,同级目录下也需要其他的格式。
5、其他代码
代码:
//模块二 显示
QtWidgetsApplication2 w;
QgsMapCanvas map_canvas;
QString shapefilePath = "C:/Users/jin'yi'zhi/Desktop/qu3/qu-sheng.shp";
//shp不能单独存在 读取的同级目录下必须存在.shp — 图形格式,用于保存元素的几何实体。
/*.shx — 图形索引格式。几何体位置索引,记录每一个几何体在shp文件之中的位置,能够加快向前或向后搜索一个几何体的效率。
.dbf — 属性数据格式,以dBase III + 的数据表格式存储每个几何形状的属性数据。*/
QgsVectorLayer* vectorLayer = new QgsVectorLayer(shapefilePath, "MyShapefile", "ogr");
if (vectorLayer->isValid())
{
map_canvas.setLayers(QList<QgsMapLayer*>() << vectorLayer);
map_canvas.setExtent(vectorLayer->extent());
map_canvas.refresh();
QgsMapToolPan map_tool_pan(&map_canvas);
map_canvas.setMapTool(&map_tool_pan);
w.setCentralWidget(&map_canvas);
w.resize(1000, 900);
w.show();
}
else
{
qDebug() << "Error loading layer!";
}
运行结果:
代码:
QtWidgetsApplication2 w;
QWidget* centralWidget = new QWidget(&w);
QVBoxLayout* layout = new QVBoxLayout(centralWidget);
QgsMapCanvas* mapCanvas = new QgsMapCanvas(centralWidget);
layout->addWidget(mapCanvas);
QString shapefilePath = "C:/Users/jin'yi'zhi/Desktop/hubei/hubei.shp";
QgsVectorLayer* vectorLayer = new QgsVectorLayer(shapefilePath, "MyShapefile", "ogr");
if (vectorLayer->isValid())
{
QgsProject::instance()->addMapLayer(vectorLayer);
mapCanvas->setExtent(vectorLayer->extent());
mapCanvas->setLayers(QList<QgsMapLayer*>() << vectorLayer);
mapCanvas->refresh();
}
else
{
qDebug() << "Error loading layer!";
}
QgsMapToolPan* mapToolPan = new QgsMapToolPan(mapCanvas);
mapCanvas->setMapTool(mapToolPan);
w.setCentralWidget(centralWidget);
w.resize(1000, 900);
w.show();