QGIS二次開發:基礎類簡單使用(畫布、圖層、要素、字段、渲染、標簽)


創建畫布(QgsMapCanvas)

QgsMapCanvas * canvas = new QgsMapCanvas;
canvas->setCanvasColor(Qt::white); //設置畫布顏色
canvas->enableAntiAliasing(true); //啟用抗鋸齒
canvas->setExtent(vlayer->extent()); //設置圖層范圍 vlayer矢量圖層
canvas->setLayers(vLayer); //設置圖層集合
canvas->setVisible(true); //設置是否可見
canvas->freeze(false); //設置是否凍結對圖層的操作
canvas->refresh(); //刷新
canvas->show(); //顯示

創建圖層(QgsMapLayer)

//幾何類型,"Point", "LineString", "Polygon", "MultiPoint", "MultiLineString", "MultiPolygon"    
QString path = "multiPoint"
path.append( QString( "crs=EPSG:4326&")); //參照坐標系 path.append( QString( "field=id:integer&field=name:string(50)&")); //添加字段屬性 path.append( QString( "index=yes&" )); //創建索引 path.append( QString( "memoryid=%1").arg(QUuid::createUuid().toString())); //臨時編碼 //創建矢量圖層 QgsVectorLayer *vLayer = new QgsVectorLayer(path, "MyPoint", "memory");

在圖層插入點要素(QgsFeature)

//創建一個點圖層
QgsVectorLayer* pointLayer = new QgsVectorLayer("Point?crs=epsg:4326", "MyPoint", "memory");
QgsVectorDataProvider* dataProvider = pointLayer->dataProvider();
//創建一個要素
QgsFeature MyFeature;
//設置在地圖的插入點的坐標
MyFeature.setGeometry( QgsGeometry::fromPointXY( QgsPointXY(116.3215, 39.5416) ) );
dataProvider->addFeatures(QgsFeatureList()<<MyFeature);
pointLayer->updateExtents();
//pointLayer->setCoordinateSystem();

在圖層插入線要素(QgsFeature)

//創建一個線圖層
QgsVectorLayer *lineLayer = new QgsVectorLayer("LineString?crs=epsg:4326", "MyLine", "memory");
QgsVectorDataProvider* dataProder = lineLayer->dataProvider();
//在指定坐標添加點
QgsFeature feature;
QgsGeometry geometry = QgsGeometry::fromPointXY( QgsPointXY(50,50) );
//通過點坐標進行畫線
QgsPolyline line ;
line << QgsPoint(100.4443, 32.2123) << QgsPoint(130.5557, 50.4445);
geometry = QgsGeometry::fromPolyline(line);
feature.setGeometry(geometry);
dataProder->addFeatures(QgsFeatureList()<<feature);
lineLayer->updateExtents();
//lineLayer->setCoordinateSystem();

在圖層添加字段,並對指定要素設置屬性(QgsField)

//創建圖層
QgsVectorLayer alarmLayer = new QgsVectorLayer("Point?crs=epsg:4326", "alarmLayer", "memory");
//添加字段
alarmLayer->startEditing();
QgsField* filed = new QgsField(QStringLiteral("頻率"), QVariant::String);
alarmLayer->addAttribute(*filed)); //也可通過alarmLayer->dataProvier()->addAttributes(QgsFields); alarmLayer->updateFields();
alarmLayer->commitChanges();
//根據id添加屬性
alarmLayer->startEditing();
alarmLayer->changeAttributeValue(id, field, attribute);
alarmLayer->commitChanges();

在圖層中刪除要素

QgsVectorLayer planeLayer = new QgsVectorLayer("Point?crs=epsg:4326", "MyPoint", "memory");
//啟用編輯
planeLayer->startEditing();
planeLayer->deleteFeature( QgsFeatureId(對應id) );
planeLayer->updateExtents();
//提交修改
planeLayer->commitChanges();

設置點樣式(點圖層渲染 QgsFeatureRenderer)

My_MapCanvas->freeze();
//獲取SVG矢量圖標,繪制矢量圖層
QString Image_Path = QFileDialog::getOpenFileName(this,tr("Select"),"D:/svg",tr("Files(*.svg)"));
QgsSvgMarkerSymbolLayer* svg_Marker =  new QgsSvgMarkerSymbolLayer(Image_Path);
svg_Marker->setColor(QColor(0,0,0));
svg_Marker->setSize(10);
svg_Marker->setAngle(0);
//創建QgsSymbolLayerList QgsSymbolLayerList Sym_Layer_List; Sym_Layer_List.append(svg_Marker); //構建QgsMarkerSymbol QgsMarkerSymbol* MarkerSymbol = new QgsMarkerSymbol(Sym_Layer_List); //構建QgsSingleSymbolRenderer, 即最終圖層的渲染器 QgsSingleSymbolRenderer* Sym_Renderer = new QgsSingleSymbolRenderer( MarkerSymbol ); //設置當前圖層的渲染器 CurrentLayer->setRenderer(Sym_Renderer);
// My_MapCanvas
->freeze(false); My_MapCanvas->refresh();

設置線樣式(線圖層渲染 QgsFeatureRenderer)

My_MapCanvas->freeze();
//
設置線圖層的樣式,包括color, width (in millimeters) and penStyle QgsSimpleLineSymbolLayer* Line_Renderer_Layer = new QgsSimpleLineSymbolLayer(); Line_Renderer_Layer->setColor(Qt::red); Line_Renderer_Layer->setPenStyle(Qt::PenStyle::DotLine); //創建矢量圖層列表,QgsSymbolLayerList就是重新定義了一個特殊的QList QgsSymbolLayerList Sym_Layer_List; Sym_Layer_List.append(Line_Renderer_Layer); //構建QgsLineSymbol QgsLineSymbol* LineSymbol = new QgsLineSymbol(Sym_Layer_List); //構建QgsSingleSymbolRenderer, 即最終圖層的渲染器 QgsSingleSymbolRenderer* Sym_Renderer = new QgsSingleSymbolRenderer( LineSymbol ); //設置當前圖層的渲染器 CurrentLayer->setRenderer( Sym_Renderer );
//
My_MapCanvas->freeze(false);
My_MapCanvas->refresh();

 在圖層中添加標簽,顯示某字段屬性

QgsVectorLayer* vLayer = new QgsVectorLayer("D:/MSCities_Geo_Pts.shp", "Cities", "ogr");
//文本緩沖區設置
QgsTextBufferSettings* bufSettings = new QgsTextBufferSettings;
bufSettings->setEnabled(true); //啟用文本緩沖區
bufSettings->setSize(1); //設置緩緩沖區大小
bufSettings->setColor(QColor("white"));
//文本樣式設置
QgsTextFormat * textFormat = new QgsTextFormat;
textFormat->setFont( QFont("Arial", 12) );
textFormat->setSize(12);
textFormat->setBuffer(*bufSettings); //設置文本緩沖區
//圖層屬性設置
QgsPalLayerSettings* lSettings = new QgsPalLayerSettings;
lSettings->setFormat(*textFormat); //設置標簽文本格式
lSettings->fieldName = "NAME10"; //要顯示的字段名
lSettings->placement = QgsPalLayerSettings::Placement::Line; //設置標簽樣式
//lSettings->geometryGeneratorEnabled = true; //啟用幾何生成器
//創建label標簽
QgsVectorLayerSimpleLabeling* LSsettings = new QgsVectorLayerSimpleLabeling(*lSettings);
//
vLayer->setLabelsEnabled(true); //該圖層啟用label標簽
vLayer->setLabeling(LSsettings); //設置標簽配置
vLayer->triggerRepaint();

 遍歷元素及元素字段

QgsFeatureIterator it = vLayer->getFeatures();
it->rewind();
QgsFeature f;
while( it.nextFeature(f) )
{
    //f.attribute(fieldsID).toInt();
}

查詢元素時,常用到矢量圖層的QgsFeatureRequest

 

參考鏈接:QT(5.12)+Qgis(3.10) 點圖層及線圖層渲染 - 灰信網(軟件開發博客聚合) (freesion.com)

     QT下Qgis的簡單使用 - 丶丿漫步 - 博客園 (cnblogs.com)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM