QT_QGIS_基本使用

QT_QGIS_基本使用


1、新建畫布

2、添加矢量圖層

​ 1、打開矢量圖層

​ 2、新建矢量圖層

​ 1、添加幾何要素——點

​ 2、添加幾何要素——線

3、添加柵格圖層

​ 1、打開柵格圖層

小demo


1、新建畫布

/* #include "QgsMapCanvas"
 * class QgsMapCanvas;
 * 繼承於QWidget,可以直接當成Widget使用
 */
QgsMapCanvas* m_canvas = new QgsMapCanvas;  // 實例化畫布
QgsMapToolPan * toolPan = new QgsMapToolPan(m_canvas); // 新建移動工具
// QgsMapToolZoom * toolZoom = new QgsMapToolZoom(m_canvas,true); // 放大工具
// m_canvas->setMapTool(toolZoom);

m_canvas->setMapTool(toolPan);  // 將移動工具設置到畫布
m_canvas->freeze(false); // 畫布解凍
m_canvas->setCanvasColor(QColor(255,255,255)); // 設置畫布顏色
m_canvas->setVisible(true); // 設置可見
m_canvas->enableAntiAliasing(true); // 設置可抗鋸齒

QGridLayout * layout = new QGirdLayout(this);
layout->addWidget(m_canvas); // 顯示畫布

2、添加矢量圖層

1、打開矢量圖層
QString fileName = QFileDialog::getOpenFileName(this, 
                                                tr("Open shape file"),
                                                "",
                                                "*.shp"); // 選擇文件
QStringList list = fileName.split("/"); // 通過"/" 分隔獲取的路徑
Qstring baseName = list.back; // 圖層名

/* #include "qgsvectorlayer.h"
 * class QgsVectorLayer;
 * 繼承 QgsMapLayer
 * @parameter1 要打開的文件
 * @parameter2 圖層名稱
 * @parameter3 數據提供者的名稱,"memory"/"postgres"/...
 */
QgsVectorLayer * layer = new QgsVectorLayer(fileName,baseName,"ogr"); // 實例化矢量圖層類
if(!layer->isValid()) // 判斷圖層是否有效
{
    return;
}
QList<QgsMapLayer *> m_layers; // 創建一個容器用於保存圖層
m_layers.append(layer); // 將打開的圖層添加到容器
m_canvas->setLayers(m_layers); // 將容器的中的圖層設置到畫布
2、新建矢量圖層
1、添加幾何要素——點
/* @parameter1 組成
 * 幾何類型:
 * 點 "Point?" 
 * 線 "LineString?"
 * 多邊形 "Polygon?"
 * 參照坐標系:
 * "crs=epsg:4326&"
 * 添加字段:
 * "field=id:integer&field=name:string(50)&"
 * 創建索引:
 * "index=yes&" 
 */
QgsVectorLayer * pointLayer = new QgsVectorLayer("Point?crs=epsg:4326&","MyPoint","memory"); // 實例化矢量圖層,作為點圖層

pointLayer->startEditing(); // 設置圖層狀態為開始編輯

/* #include "qgsgeometry.h"
 * class QgsGeometry;
 * 幾何類
 */
QgsGeometry point = QgsGeometry::fromPointXY(QgsPointXY(116.46,39.92)); // 調用靜態函數,實例化一個幾何點
/* #include "qgsfeature.h"
 * class QgsFeature;
 * QGis 要素類
 */
QgsFeature feature; // 創建要素
feature.setGeometry(point); // 將幾何點設置為要素
feature.setAttributes(QgsAttributes() << QVariant(1) << QVariant("test")); // 設置要素屬性

/* #include "qgsvectordataprovider.h"
 * class QgsVectorDataProvider;
 * 繼承於 QgsDataProvider(同樣繼承於此類的還有 QgsRasterDataProvider)
 * 是矢量數據提供者的基類
 */
QgsVectorDataProvider * provider = pointLayer->dataProvider(); // 獲取點圖層的數據提供者的指針,用於添加要素
provider->addFeature(feature); // 將點要素添加到矢量層
// provider->addFeatures(featureList << feature); // 此方法用於添加多個要素 

pointLayer->commitChanges(); // 保存圖層
pointLayer->updateExtents(); // 更新圖層

m_layer.push_front(pointLayer); // 將設置好的圖層添加到保存圖層的容器中

m_canvas->setExtent(pointLayer->extent()); // 設置畫布範圍為當前圖層的範圍,也就是將圖層平鋪到畫布上
m_canvas->setLayers(m_layer); // 將容器設置到畫布
m_canvas->refresh(); // 刷新畫布
2、添加幾何要素——線
/* 添加線的流程和點基本一樣
 */
QgsVectorLayer * pointLayer = new QgsVectorLayer("LineString?crs=epsg:4326","MyPoint","memory"); 

pointLayer->startEditing(); // 設置圖層狀態為開始編輯

QgsPolyline l; 
l << QgsPoint(116.2448,40.0573) << QgsPoint(116.2448,80) 
    << QgsPoint(110,80) << QgsPoint(50,50) << QgsPoint(116,40); // 添加若干坐標,組成一條拆線
QgsGeometry line = QgsGeometry::fromPolyline(line); // 調用靜態函數,實例化一條拆線

QgsFeature feature; // 創建要素
feature.setGeometry(line); // 設置幾何拆線設置為要素
feature.setAttributes(QgsAttributes() << QVariant(1) << QVariant("test")); // 設置屬性

QgsVectorDataProvider * provider = pointLayer->dataProvider(); // 獲取一個用於添加要素的指針
provider->addFeature(feature); // 將幾何點添加到矢量層
// provider->addFeatures(featureList << feature); // 此方法用於添加多個要素 

pointLayer->commitChanges(); // 保存圖層
pointLayer->updateExtents(); // 更新圖層

m_layer.push_front(pointLayer); // 將設置好的圖層添加到保存圖層的容器中

m_canvas->setExtent(pointLayer->extent()); // 設置畫面範圍為圖層的範圍,也就是將圖層平鋪到畫布上
m_canvas->setLayers(m_layer); // 將容器設置到畫布
m_canvas->refresh(); // 刷新畫布

3、添加柵格圖層

1、打開柵格圖層
// 還沒寫

自己寫了個小demo,還沒寫完,代碼://cloud.189.cn/t/quyYBvq6fiAb(訪問碼:4uoh)

後續更新…