用GDAL读取shp数据都是基于OGR库的,需要提前编译好GDAL库,配置好环境变量。这里的代码是在Linux系统下基于Qt5编写和运行的,亲测能成功运行。GDAL编译可以查看之前的文档,代码及部分说明如下:
#include "widget.h"
#include <QApplication>
#include "gdal.h"
#include "gdal_priv.h"
#include "ogrsf_frmts.h"
#include <iostream>
#include <QDebug>
#include <QString>
#include <vector>
#include <QVector>
using namespace std;
int main(int argc, char *argv[])
{
GDALAllRegister();
GDALDataset *poDS;
// CPLSetConfigOption("SHAPE_ENCODING",""); //解决乱码问题,建议注释掉
//read shp files
poDS=(GDALDataset*) GDALOpenEx("train_data/station_point.shp",GDAL_OF_VECTOR,NULL,NULL,NULL);
if(poDS==NULL)
{
return 0;
}
OGRLayer *poLayer;
// poLayer=poDS->GetLayer(0); //获取图层
poLayer=poDS->GetLayerByName("station_point"); //通过名字获取图层
QVector<QString> strVector;
OGRFeature *poFeature;
poLayer->ResetReading();
while((poFeature=poLayer->GetNextFeature())!=NULL)
{
OGRFeatureDefn *poFDefn=poLayer->GetLayerDefn();
int iField;
int n=poFDefn->GetFieldCount(); //得到字段数目,不包括最前面的两个字段(FID,shape),在arcgis里面这两个字段不能被改变
for(iField=0;iField<n;iField++)
{
OGRFieldDefn *poFieldDefn=poFDefn->GetFieldDefn(iField);
//output every field's value
if(poFieldDefn->GetType()==OFTInteger){
// qDebug()<<poFeature->GetFieldAsInteger(iField); //用qDebug输出,类似cout
// qDebug("%d",poFeature->GetFieldAsInteger(iField)); //输出,不同的形式,效果与上句相同
}
else if(poFieldDefn->GetType()==OFTReal){
// qDebug()<<poFeature->GetFieldAsDouble(iField);
// qDebug("%.3f",poFeature->GetFieldAsDouble(iField));
}
else if(poFieldDefn->GetType()==OFTString){
// qDebug()<<poFeature->GetFieldAsString(iField);
// qDebug("%s",poFeature->GetFieldAsString(iField));
strVector.push_back(poFeature->GetFieldAsString(iField)); //用了一个容器将name存到容器中
}
else{
// qDebug()<<poFeature->GetFieldAsString(iField);
// qDebug("%s",poFeature->GetFieldAsString(iField));
// strVector.push_back(poFeature->GetFieldAsString(iField));
}
// qDebug()<<poFeature->GetFieldAsString(iField)<<" ";
// qDebug()<<poFeature->GetFieldAsString(iField);
}
for(int i=0;i<strVector.size();i++)
{
qDebug()<<strVector[i];
}
qDebug()<<strVector.size();
OGRFeature::DestroyFeature(poFeature);
}
GDALClose(poDS);
system("pause");
QApplication a(argc, argv);
// Widget w;
// w.show();
return a.exec();
}
因为用到了qDebug,需要配置一下,参考https://blog.csdn.net/qq_38378235/article/details/80653092