5.1 加载矢量图层(ogr,gpx)

文章目录

  • 前言
  • 加载矢量(vector)图层
    • ogr
      • Shapefile
        • QGis导入.shp文件
        • 代码导入
      • gpx
        • QGis导入GPX文件
        • 代码导入
      • gpkg
        • QGis导入GPKG文件
        • 代码导入
      • geojson
        • QGis导入GeoJson文件
        • 代码导入
      • gml
        • QGis导入GML
        • 代码导入
      • kml/kmz
        • QGis导入Kml
        • 代码导入
      • dxf/dwg
        • QGis导入dxf
        • 代码导入
      • Coverage
        • QGis导入Coverage矢量数据
        • 代码导入
      • ogr参数总结
    • gpx
      • QGis导入gpx
      • 代码导入
  • 总结

前言

本章讲述使用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可以指定的值包括:
Provider说明
ogrOGR提供了一组基于标准的接口和函数库,用于处理和操作地理空间数据。
delimitedtext文本数据按指定的分隔符进行分割
gpxGPX(GPS eXchange Format,GPS交换格式)是一种用于存储坐标数据的 XML 文件格式
spatialiteSpatialite是SQLite数据库的空间数据引擎。
memory数据存在内存中
postgresPOSTGRES是一个对象-关系型数据库管理系统(ORDBMS)
mssqlMSSQL是指微软的SQLServer数据库服务器
wfsWFS(Web Feature Service)是一种允许用户在分布式环境下通过HTTP对空间数据进行增加、删除、修改、查询的GIS数据服务
grassGRASS GIS是一个开源的地理信息系统,可用于处理栅格、拓扑矢量、影像和图表数据。
  • 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*>();
}

在这里插入图片描述
在这里插入图片描述

gpx

GPX是一种以xml格式记录的坐标轨迹文件,通常由GPS设备生成
GPX通常包括航点(Waypoints)、路线(Routes)和轨迹(Tracks)三个主要图层。

QGis导入GPX文件

不同于Shapefile,GPX文件通常包含多个图层,在QGis中会提示用户选择图层
在这里插入图片描述
选择之后,添加图层
在这里插入图片描述

代码导入
  • 基本流程和Shapefile一致
  • ==注意:==路径参数,要通过在文件路径添加后缀|layername=tracks 如下示例代码
void MainWindow::addGpxSlot()
{QString filename = QStringLiteral("maps/route.gpx");QFileInfo ff(filename);//创建图层QgsVectorLayer* route_pointsLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=route_points"),"route_points","ogr");QgsVectorLayer* routesLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=routes"),"routes","ogr");QgsVectorLayer* tracks_pointsLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=track_points"),"track_points","ogr");QgsVectorLayer* tracksLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=tracks"),"tracks","ogr");QgsVectorLayer* waypointsLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=waypoints"),"waypoints","ogr");QList<QgsMapLayer *> mapLayers;mapLayers << route_pointsLayer << routesLayer << tracks_pointsLayer << tracksLayer << waypointsLayer;QgsProject::instance()->addMapLayers(mapLayers);zoomToFirstLayer<QgsVectorLayer*>();
}

在这里插入图片描述
在这里插入图片描述

  • 这样添加有一个问题,需要事先知道文件包含的图层名称,后边的章节会讲述如何获取包含的图层
  • 这里QgsVectorLayer第三个参数provider传入的是ogr,也可以传入gpx,功能相同,但是uri不同,详情见下章

gpkg

全称是GeoPackage,是一种开放的、基于标准的、独立于平台的、可移植的、自描述的、用于传输地理空间信息的紧凑数据格式。

它是一个独立于平台的SQLite数据库文件,其中包含矢量要素、不同比例尺的图像和光栅映射的瓦矩阵集、属性(非空间数据)以及扩展机制。

QGis导入GPKG文件

gpkg基于SQLite,一般会存储多个图层,在QGis中会提示用户选择图层
在这里插入图片描述
在这里插入图片描述

代码导入
  • 流程同gpx,示例代码如下
void MainWindow::addGpkgSlot()
{QString filename = QStringLiteral("maps/points_gpkg.gpkg");QFileInfo ff(filename);//创建图层QgsVectorLayer* points_gpkgLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=points_gpkg"),"points_gpkg","ogr");QgsVectorLayer* points_smallLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=points_small"),"points_small","ogr");QList<QgsMapLayer *> mapLayers;mapLayers << points_gpkgLayer << points_smallLayer;QgsProject::instance()->addMapLayers(mapLayers);zoomToFirstLayer<QgsVectorLayer*>();
}

在这里插入图片描述
在这里插入图片描述

geojson

包含空间信息的数据交换格式,经常用于Web服务,进行数据交换

QGis导入GeoJson文件

在这里插入图片描述
在这里插入图片描述

代码导入
  • 流程和Shapefile相同,代码如下
void MainWindow::addGeoJsonSlot()
{QString filename = QStringLiteral("maps/grid_4326.geojson");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*>();
}

在这里插入图片描述

gml

地理标记语言(GML)是一种用可扩展标记语言(XML)编写地理信息的方式,以方便地理信息的传输和存储。可以将其视为描述应用程序架构的XML语法,应用程序架构描述特定领域或给定上下文中的概念结构。

QGis导入GML

在这里插入图片描述
在这里插入图片描述

代码导入
void MainWindow::addGmlSlot()
{QString filename = QStringLiteral("maps/linedensity.gml");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*>();
}

在这里插入图片描述

kml/kmz

Keyhole 标记语言 (KML) 是一种基于 XML 的格式,用于存储地理数据和相关内容,是一种官方的开放地理空间联盟 (OGC) 标准。 KML 格式便于在 Internet 上发布并可通过许多免费应用程序(例如 Google Earth 和 ArcGIS Explorer)进行查看,因此常用于与非 GIS 用户共享地理数据。 KML 文件以 .kml 或 .kmz(表示压缩的 KML 文件)为扩展名。

QGis导入Kml

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码导入
void MainWindow::addKmlSlot()
{QString filename = QStringLiteral("maps/multilayer.kml");QFileInfo ff(filename);//创建图层QgsVectorLayer* layer1 = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=Layer1"),"Layer1","ogr");QgsVectorLayer* layer2 = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=Layer2"),"Layer2","ogr");QgsVectorLayer* layer3 = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=Layer3"),"Layer3","ogr");QList<QgsMapLayer *> mapLayers;mapLayers << layer1 << layer2 << layer3;QgsProject::instance()->addMapLayers(mapLayers);zoomToFirstLayer<QgsVectorLayer*>();
}

在这里插入图片描述

dxf/dwg

DXF 是Autodesk公司开发的用于AutoCAD与其它软件之间进行CAD数据交换的CAD数据文件格式

QGis导入dxf

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码导入
  • 注意:这里使用了新参数geometrytype=Pointgeometrytype=LineString
  • 由于layername相同,所以使用geometrytype区分不同类型图层
void MainWindow::addDxfSlot()
{QString filename = QStringLiteral("maps/points_lines_3d.dxf");QFileInfo ff(filename);//创建图层QgsVectorLayer* points_gpkgLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=entities|geometrytype=LineString"),"entities1","ogr");QgsVectorLayer* points_smallLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=entities|geometrytype=Point"),"entities2","ogr");QList<QgsMapLayer *> mapLayers;mapLayers << points_gpkgLayer << points_smallLayer;QgsProject::instance()->addMapLayers(mapLayers);zoomToFirstLayer<QgsVectorLayer*>();
}

在这里插入图片描述

Coverage

Coverage 是一种用于存储矢量数据的地理相关数据模型,它包含地理要素的空间(位置)数据和属性(描述性)数据。Coverage 使用一组要素类来表示地理要素。每个要素类存储一组点、线(弧)、面或注记(文本)。Coverage 可以具有拓扑,用于确定要素间的关系。
Coverage 以目录形式存储,而目录中的每个要素类则以一组文件的形式进行存储。

QGis导入Coverage矢量数据
  • 注意: 这里Source Type选的是Directory
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
代码导入
void MainWindow::addCoverageSlot()
{QString filename = QStringLiteral("maps/CoverageDir/testvector");QFileInfo ff(filename);QgsVectorLayer* aaLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=aa"),"aa","ogr");QgsVectorLayer* ARCLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=ARC"),"ARC","ogr");QgsVectorLayer* CNTLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=CNT"),"CNT","ogr");QgsVectorLayer* PALLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("|layername=PAL"),"PAC","ogr");QList<QgsMapLayer *> mapLayers;mapLayers << aaLayer << ARCLayer << CNTLayer << PALLayer;QgsProject::instance()->addMapLayers(mapLayers);zoomToFirstLayer<QgsVectorLayer*>();
}

在这里插入图片描述

ogr参数总结

  • 加载图层的过程中用到了layerName,geometryType等参数,这里给出ogr支持的所有参数
  • qgis源码中qgsogrprovidermetadata.cpp中encodeUri函数
QString QgsOgrProviderMetadata::encodeUri( const QVariantMap &parts ) const
{const QString vsiPrefix = parts.value( QStringLiteral( "vsiPrefix" ) ).toString();const QString vsiSuffix = parts.value( QStringLiteral( "vsiSuffix" ) ).toString();const QString path = parts.value( QStringLiteral( "path" ) ).toString();const QString layerName = parts.value( QStringLiteral( "layerName" ) ).toString();const QString layerId = parts.value( QStringLiteral( "layerId" ) ).toString();const QString subset = parts.value( QStringLiteral( "subset" ) ).toString();const QString geometryType = parts.value( QStringLiteral( "geometryType" ) ).toString();const QString authcfg = parts.value( QStringLiteral( "authcfg" ) ).toString();const QStringList openOptions = parts.value( QStringLiteral( "openOptions" ) ).toStringList();const QString uniqueGeometryType = parts.value( QStringLiteral( "uniqueGeometryType" ) ).toString();......}

gpx

Provider reads tracks, routes, and waypoints from a GPX file. The url defines the name of the file, and the type of data to retrieve from it (“track”, “route”, or “waypoint”).
An example url is “/home/user/data/holiday.gpx?type=route”

  • 注意: 这次使用的data provider是gpx

QGis导入gpx

在这里插入图片描述
在这里插入图片描述

代码导入

  • 注意 uri格式是maps/route.gpx?type=route,并且只支持route,track和waypoint
void MainWindow::addGpx1Slot()
{QString filename = QStringLiteral("maps/route.gpx");QFileInfo ff(filename);QgsVectorLayer* routesLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("?type=route"),"route","gpx");QgsVectorLayer* tracksLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("?type=track"),"track","gpx");QgsVectorLayer* waypointsLayer = new QgsVectorLayer(QString("%1%2").arg(filename).arg("?type=waypoint"),"waypoint","gpx");QList<QgsMapLayer *> mapLayers;mapLayers << routesLayer << tracksLayer << waypointsLayer;QgsProject::instance()->addMapLayers(mapLayers);zoomToFirstLayer<QgsVectorLayer*>();
}

在这里插入图片描述
在这里插入图片描述

总结

  • 分别使用qgis软件和代码导入了ogr,gpx支持的图层格式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/108035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter安装及环境配置

1. JMeter 介绍 Apache组织开发的基于Java的压力测试工具 100%纯Java开发、完全的可移植性 可以用于测试静态和动态资源 多协议—HTTP/FTP/socket/Java/数据库(JDBC) 完全多线程 高可扩展性 2. 安装jdk并配置jdk环境 因为jmeter运行依赖jdk环境&#xff0c;所以在安装j…

lvgl 页面管理器

lv_scr_mgr lvgl 界面管理器 适配 lvgl 8.3 降低界面之间的耦合使用较小的内存&#xff0c;界面切换后会自动释放内存内存泄漏检测 使用方法 在lv_scr_mgr_port.h 中创建一个枚举&#xff0c;用于界面ID为每个界面创建一个页面管理器句柄将界面句柄添加到 lv_scr_mgr_por…

发电机组负载测试的必要性

发电机组负载测试是确保发电机组能够在实际运行中稳定工作的重要步骤&#xff0c;负载测试可以模拟发电机组在不同负载条件下的工作情况&#xff0c;评估其性能和稳定性。负载测试可以验证发电机组在不同负载条件下的性能表现&#xff0c;通过模拟实际使用情况评估发电机组的输…

css3自动吸附scroll-snap

我们希望可以一块一块的滚动&#xff0c;比如当前一个块滚出去了一部分并且后一个块滚进来一部分的时候&#xff0c;实现后一个块自动滚入或者前一个块回弹到初始位置这种效果&#xff0c;以前的时候用js需要写比较复杂的判断逻辑&#xff0c;后来有了一个css scroll snap这个方…

Java打印二进制

&#x1f495;"把握未定&#xff0c;宜绝迹尘嚣&#xff0c;使此心不见可欲而不乱&#xff0c;以澄悟吾静体。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;Java打印二进制 Java中打印二进制的方法有很多&#xff0c;这里介绍三种方式 1.利用In…

CSI2与CDPHY学习

注意&#xff1a;本文是基于CSI2-V3.0 spec。 其中CPHY为 V2.0 DPHY为V2.5 本文主要在packet级别介绍CSI2与对应的CDPHY&#xff0c;需要注意的是&#xff1a; CDPHY的HS burst数据和LPDT都是以packet为单位传输数据。 其中LPDT包括Escape和ALP的LPDT 1.CSI-CPHY 1.1CPH…

传输机房的基本结构

文章目录 传输机房主要结构 传输机房主要结构 ODF &#xff08;Optical Distribution Frame&#xff09;&#xff0c;光纤配线架&#xff0c;是专为光纤通信机房设计的光纤配线设备&#xff0c;具有光缆固定和保护功能、光缆终接功能、调线功能&#xff0c;完成从设备间纤缆连…

Linux学习——进程状态

目录 一&#xff0c;进程状态 1&#xff0c;进程状态的分类 2.状态的本质 3.进程状态详解 1.运行状态 2.阻塞状态 3.挂起状态 4.Linux内核中的状态分类 一&#xff0c;进程状态 1&#xff0c;进程状态的分类 如下图&#xff1a; 在计算机中我们的状态的分类便如下图所示…

【Java实战】Mysql读写分离主从复制搭建保姆级教程

MySQL 的数据同步通常采用主从复制&#xff08;Master-Slave&#xff09;的方式。 主从复制基于二进制日志&#xff08;binlog&#xff09;。主服务器&#xff08;Master&#xff09;在 binlog 中记录数据更改&#xff0c;从服务器&#xff08;Slave&#xff09;将这些日志读取…

Git版本控制管理

Git基础_环境配置 当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的&#xff0c;因为每次Git提交都会使用该用户信息。 设置用户信息 git config --global user.name "Bandits" git config --global user.email "gb010704163.com"查…

Java反射调用jar包实现多态

上一篇实现了反射调用jar包&#xff0c;但是没有实现多态&#xff0c;这次先给自己的jar包类抽象一个接口&#xff0c;然后实现类实现接口。最后调用放反射得到的对像转换成接口类型调用执行。 定义接口&#xff0c;指定包为ZLZJar package ZLZJar;public interface ITest {p…

FPGA中的LUT查找表工作原理。

在RAM中填入1110,后续的不同AB组合Y输出对应的值&#xff0c;实现上面逻辑表达式的功能。

计算机视觉开源代码汇总

1.【基础网络架构】Regularization of polynomial networks for image recognition 论文地址&#xff1a;https://arxiv.org/pdf/2303.13896.pdf 开源代码:https://github.com/grigorisg9gr/regularized_polynomials 2.【目标检测&#xff1a;域自适应】2PCNet: Two-Phase Cons…

京东数据分析:2023年下半年母婴市场各大细分赛道消费趋势盘点!

于今天的新生代父母而言&#xff0c;在诸多消费观念被改变的当下&#xff0c;新生父母们在育儿上更强调精细化&#xff0c;在这种情况下&#xff0c;母婴市场的消费升级已是大势所趋。不过&#xff0c;在如今收入增速整体放缓的背景下&#xff0c;各细分赛道的消费升级都出现了…

网络社区挖掘-图论部分的基本知识笔记

1 网络社区挖掘定义 网络社区挖掘是指利用数据挖掘技术和机器学习算法&#xff0c;分析社交网络、在线社区或互联网上的各种交互数据&#xff0c;以揭示其中隐藏的模式、关系和信息。这些社区可以是社交媒体平台、在线论坛、博客、微博等&#xff0c;人们在这些平台上进行交流…

众和策略:尾盘5分钟拉升意味着什么?

跟着投资者越来越重视股市改动&#xff0c;一些术语逐渐进入商场人员的词汇库中&#xff0c;例如“尾盘5分钟拉升”。这个概念在许多人眼中是听起来生疏的&#xff0c;但它实际上是股市生意中十分重要的一种现象。 简略来说&#xff0c;尾盘5分钟拉升是指股市在毕竟5分钟呈现了…

智能网关IOT 2050采集应用

SIMATIC IOT2050 是西门子公司新推出的应用于企业数字化转型的智能边缘计算和云连接网关。 它将云、公司内 IT 和生产连接在一起&#xff0c;专为直接在生产环境中获取、处理和传输数据的工业 IT 解 决方案而设计。例如&#xff0c;它可用于将生产 过程与基于云的机器和生产数据…

学习记录682@查准率与查全率真的必然负相关吗?

查准率和查全率定义 查准率与查全率真的必然负相关吗&#xff1f; 先说结论&#xff0c;两者并非绝对负相关&#xff0c;只是在统计学上表现出大概率的负相关性&#xff0c;而数学证明上无法严格证明两个的负相关性。 枚举来证明两者并非必然负相关 一组数据&#xff1a;A1、…

4.2 网际协议IP

思维导图&#xff1a; 前言&#xff1a; **笔记 4.2 - 网际协议IP** 1. **定义与重要性**&#xff1a; - 网际协议IP是TCP/IP体系中的核心协议之一。 - 它是互联网的关键标准协议。 2. **发展背景**&#xff1a; - 又被称为Kahn-Cerf协议。 - 由Robert Kahn和…

vue 拿到数据后,没有重新渲染视图,nuxt.js拿到数据后,没有重新渲染视图,强制更新视图

以下为Vue2的解决方案 一、 Vue.set&#xff08;&#xff09; 问&#xff1a;什么情况下使用&#xff1f; 答&#xff1a;如果你向响应式数据添加新的“属性”&#xff0c;理论上&#xff0c;一般情况下是没问题的&#xff0c;但是&#xff0c;如果你的级别比较深&#xff0c;又…