转载 5.1 加载矢量图层(ogr,gpx)_矢量层文件信息-CSDN博客
目录
前言
本章讲述使用qgis c++ Api加载各种类型的矢量地图数据显示。
- 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps
加载矢量(vector)图层
在QGIS中,图层并不保存数据的实体,而是引用各种类型的数据源,并利用图层样式等属性渲染数据。
- 类
QgsVectorLayer
代表矢量图层,首先看一下官方文档
The QgsVectorLayer is instantiated by specifying the name of a data provider, such as postgres or wfs, and url defining the specific data set to connect to. The vector layer constructor in turn instantiates a QgsVectorDataProvider subclass corresponding to the provider type, and passes it the url. The data provider connects to the data source.
- 实例化
QgsVectorLayer
需要提供data provider的名称以及文件路径或url,其构造函数如下
QgsVectorLayer (const QString &path=QString(), const QString &baseName=QString(), const QString &providerLib="ogr", const QgsVectorLayer::LayerOptions &options=QgsVectorLayer::LayerOptions())
- data provider可以指定的值包括:
- data provider分两类,内置和外部,外部data provider以动态库的形式存在,如下图
以下是完整加载data provider后的输出
C:\src\OSGeo4W\src\qgis-ltr-dev\qgis\src\core\providers\qgsproviderregistry.cpp(337) : (QgsProviderRegistry::init) [633ms] Loaded 25 providers (OAPIF;WFS;arcgisfeatureserver;arcgismapserver;copc;delimitedtext;ept;gdal;geonode;gpx;hana;mdal;memory;mesh_memory;mssql;ogr;pdal;postgres;postgresraster;spatialite;vectortile;virtual;virtualraster;wcs;wms)
下边分别加载不同data provider的数据
ogr
Accesses data using the OGR drivers (https://gdal.org/drivers/vector/index.html). The url is the OGR connection string. A wide variety of data formats can be accessed using this driver, including file based formats used by many GIS systems, database formats, and web services. Some of these formats are also supported by custom data providers listed below.
OGR是用于读写矢量数据的抽象数据模型类库,是GDAL开源项目的一个分支,也采用X/MIT协议发布。
- OGR支持的矢量数据格式完整列表见链接
- 常见的矢量数据包括Shapefile、KML/KMZ、DXF/DMG、GPX、OSM等多种类型
Shapefile
- 一个Shapefile数据仅存储单一要素类型(如点、线、面)
- 一个Shapefile只包含一个图层
QGis导入.shp文件
QGis中打开后缀名为.shp格式的矢量图层
代码导入
- 传入文件路径,图层名,provider名称,构造
QgsVectorLayer
- 调用
QgsProject
的成员函数addMapLayer
即可
void MainWindow::addShpSlot()
{
QString filename = QStringLiteral("maps/shapefile/protected_areas.shp");
QFileInfo ff(filename);
//创建图层
QgsVectorLayer* vecLayer = new QgsVectorLayer(filename,ff.baseName(),"ogr");
if(!vecLayer->isValid())
{
QMessageBox::critical(this,tr("error"),tr("invalid layer"));
return;
}
QgsProject::instance()->addMapLayer(vecLayer);
zoomToFirstLayer<QgsVectorLayer*>();
}