读取shp文件的字段名和字段值信息
1 目标
读取shp文件的字段名和字段值信息。
2 代码
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING
#include <QApplication>
#include <QMainWindow>
#include <qgsmapcanvas.h>
#include <qgsrasterlayer.h>
#include <qgsvectorlayer.h>
#include <qgsmaptoolpan.h>
#include <iostream>
#include <random>
#include <qgsPointXY.h>
#include <qgsFeature.h>
#include <qgsVectorLayer.h>
#include <qgsGeometry.h>
#include <qgsMarkerSymbol.h>
#include <qgsTextFormat.h>
#include <qgsTextRenderer.h>
#include <qgsTextBufferSettings.h>
#include <qgsSingleSymbolRenderer.h>
#include <qgstextbuffersettings.h>
void printLayerAttributes(QgsVectorLayer* vectorLayer) {
if (!vectorLayer->isValid()) {
std::cerr << "Invalid vector layer.\n";
return;
}
// 获取字段名
QgsFields fields = vectorLayer->fields();
int fieldCount = fields.count();
// 打印字段名
std::cout << "Fields:" << std::endl;
for (int i = 0; i < fieldCount; ++i) {
QString fldName = fields[i].name();
qDebug() << fldName ;
}
std::cout << std::endl;
// 遍历每个要素并打印属性值
QgsFeature feature;
QgsFeatureIterator iter = vectorLayer->getFeatures();
while (iter.nextFeature(feature)) {
for (int i = 0; i < fieldCount; ++i) {
QVariant value = feature.attribute(i);
qDebug() << value;
}
std::cout << std::endl;
}
}
// 函数:加载矢量图层
// 参数:
// - filePath: 矢量文件的路径
// - layerName: 图层名称
// - provider: 数据提供者类型
// 返回值:
// - QgsVectorLayer* 类型的指针,指向加载的矢量图层
QgsVectorLayer* loadVectorLayer(const QString& filePath, const QString& layerName, const QString& provider) {
QgsVectorLayer* vectorLayer = new QgsVectorLayer(filePath, layerName, provider);
if (!vectorLayer->isValid()) {
std::cerr << "Failed to load vector layer.\n";
return nullptr;
}
// 设置标签
QgsPalLayerSettings labelSettings;
labelSettings.fieldName = "STATE_NAME"; // 设置标签字段为 "STATE_NAME"
labelSettings.isExpression = false;
// 设置标签格式
QgsTextFormat textFormat;
textFormat.setSize(10); // 设置字体大小
textFormat.setColor(Qt::blue); // 设置字体颜色
labelSettings.setFormat(textFormat);
// 应用标签设置
QgsVectorLayerSimpleLabeling* labeling = new QgsVectorLayerSimpleLabeling(labelSettings);
vectorLayer->setLabeling(labeling);
vectorLayer->setLabelsEnabled(true);
return vectorLayer;
}
int main(int argc, char** argv)
{
//std::cout << "Hello World!\n";
// 创建QGIS应用程序对象
QApplication qgisApp(argc, argv);
// 创建主窗口
QMainWindow mainWindow;
// 创建地图画布对象
QgsMapCanvas mapCanvas;
// 加载矢量图层
QgsVectorLayer* vectorLayer = loadVectorLayer(R"(C:\Shapes\china_province.shp)", "My Shapefile Layer", "ogr");
// 确保图层成功加载
if (!vectorLayer || !vectorLayer ) {
delete vectorLayer ;
return -1;
}
// 打印字段名和字段值
printLayerAttributes(vectorLayer);
// 将图层添加到地图画布中
mapCanvas.setLayers({vectorLayer});
// 设置地图画布的显示范围为图层的范围
mapCanvas.setExtent(vectorLayer->extent());
// 刷新地图画布以应用更改
mapCanvas.refresh();
// 将地图画布设置为主窗口的中央部件
mainWindow.setCentralWidget(&mapCanvas);
// 显示主窗口
mainWindow.show();
// 运行QGIS应用程序的事件循环
int result = qgisApp.exec();
// 清理资源
delete vectorLayer;
return result;
}