主要参考了大神之作 https://github.com/Leopard-C/iCGIS
结果看图
因为工作上会用到GIS显示地图,用的功能简单,而用QGIS会显得非常庞大,故考虑自己写一个简单的GIS,但能力素质实在偏低,终于看到了大神之作 https://github.com/Leopard-C/iCGIS。于是自个根据需求瞎改了一起,用GDAL读地图文件Shapefile,进而用opengl渲染。
这里需要一个gdal库的支持,因为我安装了qgis,所以已经配好了,可以利用osgeo4w-setup-x86_64.exe直接配置。
建了个类FileReader,写个静态函数readShapefile,将图层保存到layers。
调用方法:FileReader::readShapefile("D:/work/shp/asia1.shp",layers);
void FileReader::readShapefile(QString filepath, QVector<OGRLayer*> &layers)
{
QByteArray bytes = filepath.toLocal8Bit();
const char* path = bytes.data();
GDALAllRegister();
GDALDataset* pDS = nullptr;
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
CPLSetConfigOption("SHAPE_ENCODING", "");
pDS = (GDALDataset*)GDALOpenEx(path, GDAL_OF_VECTOR, NULL, NULL, NULL);
if (!pDS) {
qDebug()<<"Open {0} error"<<path;
return ;
}
int layerCount = pDS->GetLayerCount();
if (layerCount == 0) {
qDebug()<<("poDsIn dosen't have any layer");
return ;
}
qDebug()<<"convertGDALDataset layerCount="<<layerCount;
for (int i = 0; i < layerCount; ++i) {
OGRLayer* pLayer = pDS->GetLayer(i);
layers.append(pLayer);
}
//GDALClose(poDS);//先不关
}
下一步就开始分析图层里的图元等。