QT_QGIS_基本使用
QT_QGIS_基本使用
2、添加矢量圖層
1、打開矢量圖層
2、新建矢量圖層
1、添加幾何要素——點
2、添加幾何要素——線
3、添加柵格圖層
1、打開柵格圖層
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)
後續更新…