QGIS二次开发:加载XYZ Tiles形式的瓦片地图

本文介绍了如何在QGIS中通过二次开发加载XYZ Tiles形式的瓦片地图,包括设置离线地图服务URL,开发环境(QGIS 3.26.2,Qt 5.14.1,Visual Studio 2019)以及关键代码示例,强调了瓦片精度设置的重要性,以及并行渲染模式对提升用户体验的作用。

1.前言

  QGIS官方提供的QGIS.exe可以加载远程地图提供商提供的基于URL格式的XYZ Tiles形式的瓦片地图。如:https://tile.openstreetmap.org/{z}/{x}/{y}.png  ,开发者如果不能联网,也可以创建离线地图服务。如下:打开QGIS 3.26.2.exe,选择xyz Tiles节点,单击右键,选择“New Connection...”菜单,按如下操作,输入name,如:chinaofflinemap, 在URL中输入:http://127.0.0.1:8080/{z}{x}{y}.png (注:本机8080端口必须存在离线地图服务)或https://tile.openstreetmap.org/{z}/{x}/{y}.png,在左下角的zoom Level中输入最小最大地图精度:

然后就可以显示地图了,如下:

 关于如何在本机搭建离线地图服务,请参见:

<think>我们正在使用QGIS进行二次开发,需要添加在线地图。根据QGIS的架构,我们可以通过添加XYZ图层或WMTS服务来实现。以下是具体步骤: 1. **添加XYZ图层**:这是添加在线地图(如OpenStreetMap, Google Maps等)的常用方法。我们可以通过创建`QgsRasterLayer`对象并指定URL模板来实现。 2. **使用WMTS服务**:如果在线地图提供WMTS服务,我们可以通过创建WMTS图层来添加。 下面以添加OpenStreetMap为例,说明如何通过二次开发代码添加在线地图。 ### 添加OpenStreetMap的代码示例 ```cpp // 创建OpenStreetMap图层 QString url = "http://a.tile.openstreetmap.org/{z}/{x}/{y}.png"; QString name = "OpenStreetMap"; QgsRasterLayer *tileLayer = new QgsRasterLayer("type=xyz&url=" + url, name, "wms"); // 检查图层是否有效 if (tileLayer->isValid()) { // 添加到当前项目 QgsProject::instance()->addMapLayer(tileLayer); } else { // 处理错误 qDebug() << "图层加载失败"; } ``` ### 说明 - `type=xyz` 表示我们使用XYZ瓦片服务。 - `url` 参数指定了瓦片服务的URL模板,其中`{z}`、`{x}`、`{y}`分别代表缩放级别、瓦片的X坐标和Y坐标。 - 我们创建了一个`QgsRasterLayer`对象,并将服务类型设置为`"wms"`(这里实际上使用的是XYZ服务,但QGIS中通过WMS provider来支持XYZ,因此这里使用`"wms"`作为provider key)。 ### 其他在线地图 对于其他在线地图(如Google Maps、Bing Maps等),方法类似,只需替换URL模板即可。但需注意,这些服务可能有使用条款和访问限制。 ### 使用WMTS服务 如果需要使用WMTS服务,可以使用`QgsRasterLayer`并指定WMTS的URL和参数,或者使用`QgsWmsProvider`。具体代码较为复杂,需要根据服务的Capabilities文档来设置参数。 ### 注意事项 - 在线地图需要网络连接。 - 部分在线地图服务需要API Key或访问令牌,需要在URL中附加。 - 添加图层后,可能需要刷新地图画布(`m_mapCanvas->refresh()`)才能显示。 ### 相关问题 1. 如何添加高德地图或百度地图作为在线图层? 2. 如何管理多个在线图层的叠加顺序? 3. 如何为在线地图设置缓存以提高性能? [^1]: QGIS二次开发地图符号库操作) [^2]: Qgis二次开发-QgsMapTool地图交互工具详解 [^3]: Qgis二次开发-QgsAnnotation(添加文字、svg标注) [^4]:QGIS二次开发地图编辑-08</think>### 在QGIS二次开发中添加在线地图的方法 在QGIS二次开发中,添加在线地图主要通过**XYZ瓦片服务**实现。以下是具体步骤和代码示例: --- #### **1. 创建XYZ瓦片图层** 使用`QgsRasterLayer`创建在线地图图层,核心是构造符合规范的URL模板: ```cpp // 创建OpenStreetMap图层示例 QString url = "https://tile.openstreetmap.org/{z}/{x}/{y}.png"; QString layerName = "OpenStreetMap"; QString providerType = "wms"; // 使用WMS提供者支持XYZ格式 QgsRasterLayer* onlineLayer = new QgsRasterLayer( "url=" + url + "&type=xyz", layerName, providerType ); // 验证图层有效性 if (onlineLayer->isValid()) { QgsProject::instance()->addMapLayer(onlineLayer); } else { qDebug() << "图层加载失败:" << onlineLayer->error().message(); } ``` --- #### **2. 支持其他在线地图服务** 只需修改URL模板即可适配不同服务: - **Google地图**: `https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}` - **天地图**: `https://t0.tianditu.gov.cn/vec_w/wmts?layer=vec&tilematrixset=w&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=您的密钥` --- #### **3. 添加到地图画布** 将图层添加到地图画布并刷新显示: ```cpp // 获取当前地图画布 QgsMapCanvas* canvas = m_mapCanvas; // 设置图层范围并刷新 canvas->setExtent(onlineLayer->extent()); canvas->refreshAllLayers(); ``` --- #### **4. 关键注意事项** 1. **坐标系匹配** 在线地图通常使用`EPSG:3857`(Web墨卡托),需确保项目坐标系一致: ```cpp QgsProject::instance()->setCrs(QgsCoordinateReferenceSystem("EPSG:3857")); ``` 2. **网络访问权限** 在`Qt`项目中需添加网络权限声明(Windows在`.pro`文件添加`win32: LIBS += -lwininet`)。 3. **异步加载处理** 使用`QgsRasterLayer::dataChanged`信号监听加载状态: ```cpp QObject::connect(onlineLayer, &QgsRasterLayer::dataChanged, [=](){ if(onlineLayer->isValid()) canvas->refresh(); }); ``` --- ### 相关问题 1. 如何为在线地图添加自定义瓦片缓存机制? 2. 如何处理在线地图加载失败时的重试逻辑? 3. 如何实现多源在线地图的混合叠加显示? 4. 如何动态切换不同在线地图服务源? > 引用[^1]: QGIS二次开发地图符号库操作) > 引用[^2]: Qgis二次开发-QgsMapTool地图交互工具详解 > 引用[^3]: Qgis二次开发-QgsAnnotation(添加文字、svg标注)
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值