6. 加载栅格(raster)图层

news2024/11/17 3:51:19

文章目录

  • 前言
  • 加载栅格(raster)图层
    • gdal
      • GeoTiff
        • QGis导入tif
        • 代码添加
      • GeoPackage
        • QGis导入
        • 代码导入
    • wms
      • 在线高德影像地图
        • QGis添加在线高德影像
        • 代码添加
      • 离线高德影像地图
        • 瓦片原理
        • 服务描述XML文件
        • QGis导入离线地图
        • 代码导入

前言

本章讲述使用qgis c++ Api加载栅格地图数据并显示。

  • 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps

加载栅格(raster)图层

  • QgsRasterLayer代表栅格图层,详见官方文档

Represents a raster layer.

A QgsRasterLayer is instantiated by specifying the name of a data provider, such as “gdal” or “wms”, and a url defining the specific data set to connect to.

The raster layer constructor in turn instantiates a QgsRasterDataProvider subclass corresponding to the provider type, and passes it the url. The data provider connects to the data source.

  • 构造函数如下
QgsRasterLayer (const QString &uri, const QString &baseName=QString(), const QString &providerType="gdal", const QgsRasterLayer::LayerOptions &options=QgsRasterLayer::LayerOptions())
  • 构造函数中参数providerType用于指定data provider,data provider可以指定的值包括:
Provider说明
gdalGDAL 是读写大量的栅格空间数据格式的广泛应用的开源库
wms网络地图服务

gdal

空间数据抽象库(Geospatial Data Abstraction Library,GDAL)由Frank Warmerdam于1998年开始研发,主要用于读取栅格数据的抽象数据模型类库,并采用X/MIT协议发布。GDAL支持绝大多数的GIS栅格数据,并被大多数桌面GIS软件应用,如QGIS、ArcGIS等开源或商业软件都使用GDAL作为读取、写入栅格数据的基础类库。

常见的栅格数据如下表
在这里插入图片描述

GeoTiff

  • 是常用的栅格数据存储格式
QGis导入tif

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

代码添加
  • 构造函数参数uri为文件路径,providerTypegdal
void MainWindow::addRasterSlot()
{
    QString filename = QStringLiteral("maps/SRTM.tif");
    QFileInfo ff(filename);
    QgsRasterLayer* rlayer = new QgsRasterLayer(filename,ff.baseName(),"gdal");
    if(!rlayer->isValid())
    {
        QMessageBox::critical(this,tr("error"),tr("invalid layer"));
        return;
    }
    QgsProject::instance()->addMapLayer(rlayer);
    zoomToFirstLayer<QgsRasterLayer*>();
}

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

GeoPackage

包含多个tiff图层

QGis导入

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

代码导入
  • 注意: uri格式为GPKG:/home/project/data/data.gpkg:layername
void MainWindow::addGpkg1Slot()
{
    QString filename = QStringLiteral("maps/two_raster_layers.gpkg");
    QFileInfo ff(filename);
    QString uri1 = QString("GPKG:%1/%2:layer01").arg(QCoreApplication::applicationDirPath()).arg(filename);
    QString uri2 = QString("GPKG:%1/%2:layer02").arg(QCoreApplication::applicationDirPath()).arg(filename);
    QgsRasterLayer* rlayer1 = new QgsRasterLayer(uri1,"layer01","gdal");
    QgsRasterLayer* rlayer2 = new QgsRasterLayer(uri2,"layer02","gdal");
    QgsProject::instance()->addMapLayer(rlayer1);
    QgsProject::instance()->addMapLayer(rlayer2);
    zoomToFirstLayer<QgsRasterLayer*>();
}

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

wms

WMS通过HTTP为用户提供地图渲染数据,并且支持返回JPEG、PNG等多种数据格式。OGC为WMS定义了GetCapabilities、GetMap和GetFeatureInfo等常见重要方法。通过GetCapabilities方法可获得WMS服务的基本信息,如服务内容、版本信息等。GetMap方法是WMS的核心,通过它可获得具体地理范围的地图数据。通过GetFeatureInfo方法,可根据地理位置坐标获取该位置详细的要素信息。

WMS—Web地图服务详情文档地址

在线高德影像地图

QGis添加在线高德影像
  • 输入Name和Url
    在这里插入图片描述
    在这里插入图片描述
  • 注意: 这里没有选择WMS/WMTS,而是选择了XYZ
代码添加
  • 需要构建QgsRasterLayer的uri参数,其中最重要的是以下四个
    • url: wms的服务器地址https://webst01.is.autonavi.com/appmaptile?style=8&x={x}&y={y}&z={z}
    • type: 类型 xyz,mbtiles,wmst和其他,对于高德选择xyz,其他参数待查
    • zmin/zmax: 缩放等级
  • 构建url参数有两种方法:
    • 使用QgsDataSourceUri类的setParam函数,encodeUri函数返回最终url
    • 直接使用字符串构造,需要注意参数url需要UrlEncode转码
QgsMapLayer *ll_qgis_base_lib::addWmsLayer(const QString &uri, const QString &baseName)
{
    QString urlWithParams;
    QString type = QStringLiteral("xyz");
    int zMin = 0;
    int zMax = 18;
#if 1
    QgsDataSourceUri urik;
    urik.setParam( QStringLiteral( "url" ), uri );
    urik.setParam( QStringLiteral( "type" ), type );
    urik.setParam( QStringLiteral( "zmin" ), QString::number( zMin ) );
    urik.setParam( QStringLiteral( "zmax" ), QString::number( zMax ) );
    urlWithParams = urik.encodedUri();
#else
    QString urlEncode = QUrl::toPercentEncoding(url);
    urlWithParams = QString("type=xyz&url=%1&zmax=18&zmin=0").arg(urlEncode);
#endif
    QgsRasterLayer *rlayer = new QgsRasterLayer(urlWithParams,baseName,"wms");
    QgsProject::instance()->addMapLayer(rlayer);
    return rlayer;
}

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

离线高德影像地图

瓦片原理
  • 瓦片就是一堆图片,怎么对这堆图片进行编号,是目前主流互联网地图商分歧最大的地方。总结起来分为四个流派:
    • 谷歌XYZ:Z表示缩放层级,Z=zoom;XY的原点在左上角,X从左向右,Y从上向下。
    • TMS:开源产品的标准,Z的定义与谷歌相同;XY的原点在左下角,X从左向右,Y从下向上。
    • QuadTree:微软Bing地图使用的编码规范,Z的定义与谷歌相同,同一层级的瓦片不用XY两个维度表示,而只用一个整数表示,该整数服从四叉树编码规则
    • 百度XYZ:Z从1开始,在最高级就把地图分为四块瓦片;XY的原点在经度为0纬度位0的位置,X从左向右,Y从下向上。

下图显示了前三个流派在zoom=1层级上的瓦片编号结果:
在这里插入图片描述

服务描述XML文件
  • 通过创建本地服务描述XML文件访问服务,详情见链接
<GDAL_WMS>
    <Service name="TMS"> 
	<ServerUrl>file:///home/t/gis/ld_qgis_demos/bin/maps/gaode20230630//${z}/${y}/${x}.png</ServerUrl>
    </Service>
    <DataWindow>
        <UpperLeftX>-180</UpperLeftX>
        <UpperLeftY>90</UpperLeftY>
        <LowerRightX>180</LowerRightX>
        <LowerRightY>-90</LowerRightY>
        <TileLevel>2</TileLevel>
        <YOrigin>top</YOrigin>
    </DataWindow>
    <Projection>EPSG:4326</Projection>
    <BlockSizeX>256</BlockSizeX>
    <BlockSizeY>256</BlockSizeY>
    <BandsCount>3</BandsCount>
    <Cache />
</GDAL_WMS>
  • ServerUrl:描述本地瓦片地址路径
    在这里插入图片描述
QGis导入离线地图
  • 选择tms.xml
    在这里插入图片描述
    在这里插入图片描述
代码导入
  • 重点是构建正确的xml文件
void MainWindow::addGdalOfflineSlot()
{
    QString mapPath = QCoreApplication::applicationDirPath()+QStringLiteral("/maps/gaode20230630");
    QString tmsPath = mapPath+QStringLiteral("/tms.xml");
    QString serverUrl = QStringLiteral("file:///") + mapPath + QStringLiteral("//${z}/${y}/${x}.png");
    QString tmsStr = QString("<GDAL_WMS>"
                     "<Service name=TMS><ServerUrl>%1</ServerUrl></Service>"
                     "<DataWindow>"
                     "<UpperLeftX>-180</UpperLeftX><UpperLeftY>90</UpperLeftY><LowerRightX>180</LowerRightX><LowerRightY>-90</LowerRightY>"
                     "<TileLevel>2</TileLevel><YOrigin>top</YOrigin>"
                     "</DataWindow>"
                     "<Projection>EPSG:4326</Projection><BlockSizeX>256</BlockSizeX><BlockSizeY>256</BlockSizeY><BandsCount>3</BandsCount><Cache />"
                             "</GDAL_WMS>").arg(serverUrl);
    QFile file(tmsPath);
    if(file.open(QIODevice::ReadWrite))
    {
        file.write(tmsStr.toStdString().c_str());
        file.close();
    }
    QgsRasterLayer* layer = new QgsRasterLayer(mapPath+QStringLiteral("/tms.xml"),"gaodeoffline","gdal");
    QgsProject::instance()->addMapLayer(layer);
    zoomToFirstLayer<QgsRasterLayer*>();
}

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

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

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

相关文章

卡通人像制作就是这么简单

1、打开提示词生成器。 Prompt Generatorhttps://remaker.ai/userspace/prompt-generator/2、按下面截图设置。 3、复制英文提示。 4、打开画图链接。 https://poe.com/chat/https://poe.com/chat/ 5、输入提示词&#xff0c;按回车。 female,wide eyes,lipstick,fox ears,b…

解决一则诡异的javascript函数不执行的问题

有个vue 音乐播放器项目&#xff0c;由于之前腾讯的搜索接口没法用了&#xff0c;于是改成了别家的搜索接口。 但是由于返回数据结构不一样&#xff0c;代码重构的工作量还是挺大的&#xff1a;包括数据请求&#xff0c;数据处理&#xff0c;dom渲染&#xff0c;处理逻辑都进行…

C++算法:二叉树的序列化与反序列化

#题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。…

golang的json转pb验证

基于这篇文章的最后一个代码进行验证。 https://blog.csdn.net/mijichui2153/article/details/133894403?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22133894403%22%2C%22source%22%3A%22mijichui2153%22%7D 1、准备 &…

gs_moment

ps:仅共学习&#xff0c;自用。

OpenGL —— 2.7、绘制多个自旋转的贴图正方体(附源码,glfw+glad)

源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库&#xff0c;该库只有一个头文件。 具体代码&#xff1a; vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _modelMatrix; …

抽象数据库

在刚刚的文章中&#xff0c;完成了无范式到三级范式的过程 : 遵循原子性。即&#xff0c;表中字段的数据&#xff0c;不可以再拆分。 在满足第一范式的情况下&#xff0c;遵循唯一性&#xff0c;消除部分依赖。即&#xff0c;表中任意一个主键或任意一组联合主键&#xff0c…

计算几何+2sat:1020T3

http://cplusoj.com/d/senior/p/SS231019C 我们进行这样的转化 则0/1必选一个&#xff0c;2/3必选一个 那么就变成一个2sat问题 两三角形有交&#xff0c;则一个选&#xff0c;一个不能选 对角三角形一个选&#xff0c;一个不选。一个不选&#xff0c;一个选 三角形不合法…

体感互动游戏研发虚拟场景3D漫游

体感互动游戏是一种结合虚拟现实&#xff08;VR&#xff09;或增强现实&#xff08;AR&#xff09;技术的游戏&#xff0c;允许玩家以身体动作和姿势来与游戏互动。这种类型的游戏通常需要特殊的硬件设备&#xff0c;例如体感控制器、摄像头或传感器&#xff0c;以捕捉玩家的动…

spring cloud alibaba 集成seata

1.启动服务端 1.下载 seata-server-1.4.2 2.创建数据库 DROP DATABASE IF EXISTS ry-seata;CREATE DATABASE ry-seata DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;USE ry-seata;-- ---------------------------…

Java操作Python数据交互最佳实践

Java操作Python最佳实践 1、Java与Python的互操作性2、Java调用Python脚本及数据交互2.1、准备工作2.2、执行一段Python代码2.3、执行Python文件脚本2.4、执行Python文件中的指定方法2.5、执行含有第三方库的Python文件3、附录1、Java与Python的互操作性 在当今的软件开发领域,…

Linux服务器下装anaconda | 配置深度学习环境 | Pycharm连接远程服务器-经验总结

0 前言 推荐2个工具 WinSCP 一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端。同时支持 SCP 协议。它的主要功能是在本地与远程计算机间安全地复制文件&#xff0c;并且可以直接编辑文件。 WindTerm 一个多平台开源免费的终端软件&#xff0c;用于连接服务器 一…

Redis 主从复制,哨兵,集群——(3)集群篇

目录 1. 前篇回顾 2. Redis 集群是什么&#xff1f; 3. Redis 集群的优点 4. Redis 集群的槽位概念 5. 什么是分片&#xff1f; 6. 如何找到给定key的分片&#xff1f; 7. 分片槽位的设计有什么好处&#xff1f; 8. key映射到节点的三种解决方案 8.1 哈希取余分区 8.…

SortedSet 和 List 异同点

SortedSet 在 Java 的整个集合体系中&#xff0c;集合可以分成两个体系&#xff0c;一个是 Collection 存储单个对象的集合&#xff0c;另一个是 k-v 结构的 Map 集合。 SortedSet 是 Collection 体系下 Set 接口下的派生类&#xff0c;而 Set 集合的特征是不包含重 复的元素的…

【UE】纯蓝图实现:在游戏运行时设置关键点,然后让actor沿着关键点移动

前言 在上一篇博客(【UE】两步实现“从UI中拖出Actor放置到场景中”)中我们已经实现了如何从UI拖拽生成Actor ,本篇博客在此基础上要实现的是:从UI中拖出车,再从UI中拖出关键点,点击“开始移动”按钮后,车会沿着关键点移动,具体效果如下所示。 效果 步骤 1. 首先创建…

WMS透明仓库:实现仓储的全方位可视化与优化

一、WMS透明仓库的定义与特点 1. WMS透明仓库的定义&#xff1a;WMS透明仓库是一种基于信息技术的仓库管理系统&#xff0c;通过实时数据采集、分析和可视化&#xff0c;将仓库内外的物流流程、库存状态、人员活动等信息以透明的方式展示给相关利益方。 2. 实时数据采集&…

RCD负载箱的安全性能和认证标准有哪些?

RCD负载箱的安全性能和认证标准主要包括以下几个方面&#xff1a;RCD负载箱应符合国家标准或国际标准的防护等级要求&#xff0c;通常情况下&#xff0c;RCD负载箱应具备防护等级为IP54或更高级别&#xff0c;以确保在恶劣的环境条件下仍能正常工作。 RCD负载箱的绝缘电阻应满足…

Python+unittest接口自动化测试

首先配置好开发环境&#xff0c;下载安装Python并下载安装pycharm&#xff0c;在pycharm中创建项目功能目录。以下是项目的目录结构&#xff1a; common&#xff1a; 1 2 3 4 5 6 7 8 9 ——configDb.py&#xff1a;这个文件主要编写数据库连接池的相关内容&#xff0c;本项目…

suricata匹配从入门到精通(五)----二次开发保护规则库

0x00 背景 开源的suricata资源包是没有做加密处理,如果想要保护资源包,需要二次开发修改suricata源码。 本文基于suricata6.0.1 版本https://github.com/OISF/suricata/archive/refs/tags/suricata-6.0.1.zip二开。 0x01 实践 通过debug,跟规则处理相关需要修改2个地方。…

iPhone垃圾清理器:AnyMP4 iOS Cleaner for mac

AnyMP4 iOS Cleaner 是一款功能强大的iOS设备清理工具&#xff0c;旨在帮助用户轻松管理和优化iOS设备上的存储空间。该工具支持iPhone、iPad、iPod等设备&#xff0c;可以有效地清理无用的缓存、日志、文稿等&#xff0c;以释放存储空间。它还具有一键清理功能&#xff0c;能够…