1.简介
QgsMapLayer是所有地图层类型的基类,这是所有地图层类型(矢量,栅格)的基类,首先定义一个QgsMapCanvas地图画布,然后画布上添加图层,使用以下方法设置图层集合。
//设置当前图层集合
void setLayers (const QList< QgsMapLayer * > &layers)
以下是QgsMapLayer的类继承:
- QgsAnnotationLayer:标注的图层
- QgsMeshLayer:表示支持在结构化或非结构化网格上显示数据的网格层 。
- QgsPluginLayer:插件层的基类
- QgsRasterLayer:表示栅格层
- QgsVectorLayer:矢量图层
- QgsVectorTileLayer:专门用于渲染矢量贴图
2.常用方法
//设置图层的显示名称
void setName (const QString &name)
//设置图层图例的URL
void setLegendUrl (const QString &legendUrl)
//为地图层指定一个图例管理器
void setLegend (QgsMapLayerLegend *legend)
//设置数据url
void setDataUrl (const QString &dataUrl)
//返回层的数据提供程序,它可以是nullptr
const QgsDataProvider *dataProvider () const
//返回层的范围。
virtual QgsRectangle extent () const
//返回层的唯一ID,用于从QgsProject访问该层。
QString id () const
//返回层的状态
bool isValid () const
//返回图层的显示名称
QString name () const
3.示例
加载栅格图层
QList<QgsMapLayer *> m_layers;
//添加栅格数据按钮槽函数
void MainWindow::addRasterlayers()
{
//步骤1:打开文件选择对话框
QString filename=QFileDialog::getOpenFileName(this,tr("打开栅格数据"),"","remote sensing image(*.tif *.tiff);;image(*.jpg *.jpeg *.png *.bmp)");
if(filename.isNull())//如果未选择文件则返回
return;
QFileInfo fi(filename);
QString basename=fi.baseName();//获取栅格数据名称
//步骤2:创建QgsRasterLayer类
QgsRasterLayer* rasterLayer=new QgsRasterLayer(filename,basename,"gdal",false);
if(!rasterLayer->isValid())//如果图层不合法
{
QMessageBox::critical(this,"error","图层无效!");
return;
}
//步骤3:注册添加栅格数据,并个并添加到画布中
m_layers.append(rasterLayer);
m_mapCanvas->setExtent(rasterLayer->extent());//设置显示范围。Extent:范围、尺度
m_mapCanvas->setLayerSet(m_layers);//设置图层集合
m_mapCanvas->setVisible(true);//设置是否可见
m_mapCanvas->freeze(false);//设置是否冻结对图层的操作
m_mapCanvas->refresh();//刷新
}
加载矢量图层
QList<QgsMapLayer *> m_layers;
//添加矢量数据小按钮槽函数
void MainWindow::addVectorlayers()
{
//步骤1:打开文件选择对话框
QString filename=QFileDialog::getOpenFileName(this,tr("打开矢量数据"),"","ESRI Shapefile(*.shp)");
if(filename.isNull())//如果未选择文件则返回
return;
QFileInfo fi(filename);
QString basename=fi.baseName();//获取文件基名称
//步骤2:创建QgsVectorLayer类
QgsVectorLayer* vecLayer=new QgsVectorLayer(filename,basename,"ogr",false);
if(!vecLayer->isValid())//如果图层不合法
{
QMessageBox::critical(this,"error","图层无效!");
return;
}
//步骤3:注册添加矢量数据,并个并添加到画布中
//设置该图层的单一渲染风格
QgsSymbolV2* symbol = QgsSymbolV2::defaultSymbol(vecLayer->geometryType());//QGis::GeometryType::Polygon
symbol->setColor(QColor(100,100,156,255));
vecLayer->setRendererV2( new QgsSingleSymbolRendererV2(symbol) );
m_layers.append(vecLayer);
m_mapCanvas->setExtent(vecLayer->extent());//设置显示范围。Extent:范围、尺度
m_mapCanvas->setLayers(m_layers);//设置图层集合
m_mapCanvas->setVisible(true);//设置是否可见
m_mapCanvas->freeze(false);//设置是否冻结对图层的操作
m_mapCanvas->refresh();//刷新
}
4.相关参考
Qgis二次开发-QgsAnnotationItem(添加文字、svg标注)_Mr.codeee的博客-CSDN博客
Qgis二次开发-QgsMapCanvas画布简介_Mr.codeee的博客-CSDN博客
Qgis二次开发-QgsRubberBand详解(画线、画多边形)_Mr.codeee的博客-CSDN博客
Qgis二次开发-QgsAnnotationItem(添加文字、图片标注(支持svg、png、jpg等常用图片格式))_Mr.codeee的博客-CSDN博客