Qgis二次开发-加载高德在线地图失败报错Raster layer Cannot instantiate the ‘wms‘ data provider

news2024/12/22 14:47:04

1.加载在线的高德地图

以下是在线高德地图地址。

http://webrd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8

以下是代码示例:

#include <QApplication>
#include <QMainWindow>
#include "qgisinterface.h"
#include "qgsproviderregistry.h"
#include "qgsrasterlayer.h"
#include "qgsproject.h"
#include "qgsmapcanvas.h"
int main(int argc, char *argv[])
{
    // 初始化QGIS
    QgsApplication app(argc, argv, true);
    app.initQgis();
    // 创建主窗口
    QMainWindow mainWindow;
    mainWindow.setWindowTitle("QGIS with Amap");
    // 创建地图Canvas
    QgsMapCanvas* mapCanvas = new QgsMapCanvas(&mainWindow);
    mapCanvas->setCanvasColor(Qt::white);
    mapCanvas->setVisible(true);
    mapCanvas->setFrameStyle(0);
    mainWindow.setCentralWidget(mapCanvas);
    // 创建栅格图层
    QgsRasterLayer* amapLayer = new QgsRasterLayer("http://webrd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8", "Amap", "wms");
    if (amapLayer->isValid())
    {
        QgsProject::instance()->addMapLayer(amapLayer);
        QgsRectangle extent = amapLayer->extent();
        mapCanvas->setExtent(extent);
    }
    else
    {
        QMessageBox::critical(&mainWindow, "Error", "Could not load Amap layer.");
        return -1;
    }
    // 设置地图范围和投影
    QgsCoordinateReferenceSystem crs("EPSG:3857");
    mapCanvas->setDestinationCrs(crs);
    mapCanvas->enableAntiAliasing(true);
    // 显示主窗口
    mainWindow.show();
    // 执行QGIS事件循环
    return app.exec();
}

结果运行结果无效并报错:

Raster layer Cannot instantiate the 'wms' data provider

大概的意思就是说不能初始化wms的东西,就是wms的相关驱动没有加载好。

解决办法:

1.设置路径

    //设置前缀路径
    QgsApplication app(argc, argv, true);
    app.setPrefixPath("E:/OSGeo4W/apps/qgis-ltr-dev", true);
    app.initQgis();

2.将驱动文件拷贝到运行目录下

不需要设置setPrefixPath()。

将E:/OSGeo4W/apps/qgis-ltr-dev/plugins目录拷贝到生成程序的运行目录下,因为程序启动起来加载的是本地的plugins下的插件。

注意不要拷贝错了,我下载的目录下有两个qgis目录,你使用的哪个路径下的库来编译的程序,就拷贝哪个路径下的plugins目录,否则有可能导致程序起不来。

2.如果url填入不能进行正常加载

提供一个编码url的类

#ifndef QGSXYZCONNECTION_H
#define QGSXYZCONNECTION_H

#include <QStringList>

struct QgsXyzConnection
{
  QString name;
  QString url;
  int zMin = -1;
  int zMax = -1;
  // Authentication configuration id
  QString authCfg;
  // HTTP Basic username
  QString username;
  // HTTP Basic password
  QString password;
  // Referer
  QString referer;
  // tile pixel ratio (0 = unknown (not scaled), 1.0 = 256x256, 2.0 = 512x512)
  double tilePixelRatio = 0;
  bool hidden = false;

  QString encodedUri() const;
};

//! Utility class for handling list of connections to XYZ tile layers
class QgsXyzConnectionUtils
{
  public:
    //! Returns list of existing connections, unless the hidden ones
    static QStringList connectionList();

    //! Returns last used connection
    static QString selectedConnection();

    //! Saves name of the last used connection
    static void setSelectedConnection( const QString &connName );

    //! Returns connection details
    static QgsXyzConnection connection( const QString &name );

    //! Removes a connection from the list
    static void deleteConnection( const QString &name );

    //! Adds a new connection to the list
    static void addConnection( const QgsXyzConnection &conn );
};


#endif // QGSXYZCONNECTION_H



#include <qgslogger.h>
#include "qgsxyzconnection.h"

#include <qgsdatasourceuri.h>
#include <qgssettings.h>

QString QgsXyzConnection::encodedUri() const
{
  QgsDataSourceUri uri;
  uri.setParam( QStringLiteral( "type" ), QStringLiteral( "xyz" ) );
  uri.setParam( QStringLiteral( "url" ), url );
  if ( zMin != -1 )
    uri.setParam( QStringLiteral( "zmin" ), QString::number( zMin ) );
  if ( zMax != -1 )
    uri.setParam( QStringLiteral( "zmax" ), QString::number( zMax ) );
  if ( ! authCfg.isEmpty() )
    uri.setAuthConfigId( authCfg );
  if ( ! username.isEmpty() )
    uri.setUsername( username );
  if ( ! password.isEmpty() )
    uri.setPassword( password );
  if ( ! referer.isEmpty() )
    uri.setParam( QStringLiteral( "referer" ), referer );
  if ( tilePixelRatio != 0 )
    uri.setParam( QStringLiteral( "tilePixelRatio" ), QString::number( tilePixelRatio ) );
  return uri.encodedUri();
}

QStringList QgsXyzConnectionUtils::connectionList()
{
  QgsSettings settings;
  QStringList connList;

  settings.beginGroup( QStringLiteral( "qgis/connections-xyz" ) );
  connList = settings.childGroups();

  const QStringList global = settings.globalChildGroups();
  settings.endGroup();

  for ( const auto &s : global )
  {
    settings.beginGroup( "qgis/connections-xyz/" + s );
    bool isHidden = settings.value( QStringLiteral( "hidden" ), false ).toBool();
    settings.endGroup();
    if ( isHidden )
    {
      connList.removeOne( s );
    }
  }

  return connList;
}

QString QgsXyzConnectionUtils::selectedConnection()
{
  QgsSettings settings;
  return settings.value( QStringLiteral( "qgis/connections-xyz/selected" ) ).toString();
}

void QgsXyzConnectionUtils::setSelectedConnection( const QString &name )
{
  QgsSettings settings;
  return settings.setValue( QStringLiteral( "qgis/connections-xyz/selected" ), name );
}

QgsXyzConnection QgsXyzConnectionUtils::connection( const QString &name )
{
  QgsSettings settings;
  settings.beginGroup( "qgis/connections-xyz/" + name );

  QgsXyzConnection conn;
  conn.name = name;
  conn.url = settings.value( QStringLiteral( "url" ) ).toString();
  conn.zMin = settings.value( QStringLiteral( "zmin" ), -1 ).toInt();
  conn.zMax = settings.value( QStringLiteral( "zmax" ), -1 ).toInt();
  conn.authCfg = settings.value( QStringLiteral( "authcfg" ) ).toString();
  conn.username = settings.value( QStringLiteral( "username" ) ).toString();
  conn.password = settings.value( QStringLiteral( "password" ) ).toString();
  conn.referer = settings.value( QStringLiteral( "referer" ) ).toString();
  conn.tilePixelRatio = settings.value( QStringLiteral( "tilePixelRatio" ), 0 ).toDouble();
  conn.hidden = settings.value( QStringLiteral( "hidden" ) ).toBool();
  return conn;
}

void QgsXyzConnectionUtils::deleteConnection( const QString &name )
{
  QgsSettings settings;
  settings.remove( "qgis/connections-xyz/" + name );

  settings.beginGroup( QStringLiteral( "qgis/connections-xyz" ) );
  QStringList global = settings.globalChildGroups();

  if ( global.contains( name ) )
  {
    QgsSettings settings;
    settings.beginGroup( "qgis/connections-xyz/" + name );
    settings.setValue( QStringLiteral( "hidden" ), true );
  }

}

void QgsXyzConnectionUtils::addConnection( const QgsXyzConnection &conn )
{
  QgsSettings settings;
  bool addHiddenProperty = false;

  settings.beginGroup( QStringLiteral( "qgis/connections-xyz" ) );
  QStringList global = settings.globalChildGroups();
  if ( global.contains( conn.name ) )
  {
    addHiddenProperty = true;
  }
  settings.endGroup();

  settings.beginGroup( "qgis/connections-xyz/" + conn.name );
  settings.setValue( QStringLiteral( "url" ), conn.url );
  settings.setValue( QStringLiteral( "zmin" ), conn.zMin );
  settings.setValue( QStringLiteral( "zmax" ), conn.zMax );
  settings.setValue( QStringLiteral( "authcfg" ), conn.authCfg );
  settings.setValue( QStringLiteral( "username" ), conn.username );
  settings.setValue( QStringLiteral( "password" ), conn.password );
  settings.setValue( QStringLiteral( "referer" ), conn.referer );
  settings.setValue( QStringLiteral( "tilePixelRatio" ), conn.tilePixelRatio );
  if ( addHiddenProperty )
  {
    settings.setValue( QStringLiteral( "hidden" ), false );
  }
}

使用:

	QgsXyzConnection xyz;
	xyz.url = QStringLiteral("http://webrd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8");
	xyz.zMin = 0;
	xyz.zMax = 18;
	xyz.tilePixelRatio = 1.0;

	QgsXyzConnectionUtils::addConnection(xyz);

	QString url2 = xyz.encodedUri();
	qDebug() << "url2 = " << url2;

	QgsRasterLayer *layer = addRasterLayerPrivate(url2, QStringLiteral("ocr0"), QStringLiteral("wms"));

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

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

相关文章

Django学习笔记-表单(forms)的使用

在Django中提供了了form表单&#xff0c;可以更为简单的创建表单模板信息&#xff0c;简化html的表单。 一、网页应用程序中表单的应用 表单通常用来作为提交数据时候使用。 1.1 创建表单模板文件夹 在项目文件夹下创建一个template文件夹&#xff0c;用于存储所有的html模…

Integer 和 int

一、区别 1.Integer是int的包装类&#xff0c;int则是java的一种基本的数据类型&#xff1b; 2.Integer变量必须实例化之后才能使用&#xff0c;而int变量不需要实例化&#xff1b; 3.Integer实际是对象的引用&#xff0c;当new一个Integer时&#xff0c;实际上生成一个指针指向…

Linux vsftp三种模式的简单配置部署

环境&#xff1a;Debian 6.1.27-1kali1 (2023-05-12) vsftpd 安装 --查看是否当前系统是否已安装 apt list --installed | grep vsftpd 没有安装的话&#xff0c;就正常安装 apt-get update apt-get install vsftpd 一、匿名用户模式 分享一些不重要文件&#xff0c;任…

AI学习笔记二:YOLOV5环境搭建及测试全过程

若该文为原创文章&#xff0c;转载请注明原文出处。 记录yolov5从环境搭建到测试全过程。 一、运行环境 1、系统&#xff1a;windows10 &#xff08;无cpu) 2、yolov5版本&#xff1a;yolov5-5.0 3、python版本&#xff1a;py3.8 在创建虚拟环境前需要先把miniconda3和py…

Font Awesome 5使用

Font Awesome 5介绍 Font Awesome 5 的专业版有7842个图标。 要使用免费的Font Awesome 5 图标&#xff0c;您可以选择下载Font Awesome库&#xff0c;或者在Font Awesome注册一个帐户&#xff0c;并获得一个代码&#xff08;称为KIT CODE&#xff09;&#xff0c;以便在将Fo…

Wireshark抓包分析教程(ubuntu版本)

安装 first&#xff0c;多亏我们的C知道&#xff0c;成功安装了wireshark&#xff0c; Steps are as following&#xff1a; 添加wireshark的软件源(PPA:personal package archive(档案)) sudo apt-add-repository ppa:wireshark-dev/stable ppa:wireshark-dev/stable 是一个…

Quad Remesher 参数效果记录

基本属性 Detect Hard-Edges by angle 这个属性最好开启&#xff0c;它用于保持必要的边缘

WEB:ics-06

背景知识 burpsuite的使用 题目 所有都尝试点了一遍&#xff0c;只有报表中心可以打开 先查看源代码&#xff0c;没有发现有用的信息 选择了日期范围但是毫无反应&#xff0c;这里发现url中有一个id1&#xff0c;尝试抓包爆破 使用bp进行抓包 设置有效载荷配置&#xff0c;开…

(链表) 剑指 Offer 24. 反转链表 ——【Leetcode每日一题】

❓剑指 Offer 24. 反转链表 难度&#xff1a;简单 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制&#xff1a; 0 < …

小程序如何删除/上架/下架商品

在小程序中&#xff0c;产品的删除、上架和下架是常见的操作&#xff0c;可以根据实际需求来管理商品的展示与销售。下面将介绍如何在小程序中删除上架下架商品的具体步骤。 进入商品管理页面&#xff0c; 在个人中心点击管理入口&#xff0c;然后找到“商品管理”菜单并点击。…

Git----分布式版本控制系统

1. 简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。它是世界上目前最先进的分布式版本控制系统。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversio…

2023最新版本Activiti7系列-流程中的任务

流程中的任务 1.用户任务 用户任务:用于定义流程中需要人工参与的任务。 用户任务可以在流程中创建并分配给特定的用户或用户组。当流程执行到用户任务时&#xff0c;流程将暂停&#xff0c;并等待相应的用户完成该任务。完成用户任务后&#xff0c;流程将继续执行。 用户任…

系统架构设计师视频教程笔记

根据历年真题倒翻官方教程&#xff0c;发现好多内容没有&#xff0c;据说2022新版改动很大 既然是真题&#xff0c;肯定有参考价值&#xff0c;那就看看旧视频吧 考试分享 软考高级架构师&#xff0c;有用但不大【通过后分享】 up主公司要接政府项目&#xff0c;有考证需求 …

Spring:Annontation

Bean 配置注解Autowired 注解context:component-scan 标签 配置 在 Spring 中&#xff0c;配置 bean 实例一般使用 xml 配置方式或注解&#xff08;Annontation&#xff09; 方式进行配置。 注解 注解&#xff08;Annontation&#xff09;&#xff0c;是在原有代码和逻辑下通…

数据库字段变更监控平台设计开发

序&#xff1a; 在开发过程中&#xff0c;在值班解决客服问题时&#xff0c;在分析定位别人写的业务代码问题时&#xff0c;重点是不是自己写的代码&#xff0c;只看到了数据库中落库最终数据&#xff0c;并不知道业务逻辑问题发生时数据库表中当时数据情况&#xff1f;如果能知…

虚拟机 NAT模式联网 重启断网的解决方法

1、虚拟机NAT模式联网 这个博客写的很清楚:按照他的方法可以ping通www.baidu.com 三分钟完成虚拟机联网 小白看了都说好&#xff01;&#xff01;&#xff01; 虚拟机超详细联网教程/步骤 SDN软件定义网络实验_虚拟机联网教程_九号迷妹的博客-CSDN博客 但是虚拟机重启几次之后…

九种分布式ID解决方案,总有一款适合你!

1、UUID 2、数据库自增ID 2.1、主键表 2.2、ID自增步长设置 3、号段模式 4、Redis INCR 5、雪花算法 6、美团(Leaf) 7、百度(Uidgenerator) 8、滴滴(TinyID) 总结比较 背景 在复杂的分布式系统中&#xff0c;往往需要对大量的数据进行唯一标识&#xff0c;比如在对…

2023牛客暑期多校训练营3

A.World Fragments I 将两个二进制数先转换成十进制数,因为只要二进制中有1,就加或减1(加减0是没有用的),所以求两个二进制的差的绝对值(这是在有1的情况下,其实只要不等于0就有1,数是非负整数) 所以需要特判,如果第一个二进制数为0,第二个二进制数不为0,那么就不能转化,输出…

甄云质量管理解决方案——插上数字“羽翼”,实现PPAP落地

导语 质量管理是供应链管理中非常重要的一环&#xff0c;通过制定和开展质量相关的活动&#xff0c;确保产品符合质量标准和一致性要求。质量管理水平的高低直接影响供应链的整体效率和最终效益&#xff0c;关乎企业形象和品牌声誉&#xff0c;已然是企业的生命线。 作为采购…

Redis超详细入门教程(基础篇)

目录 一、什么是Redis 二、安装Redis 1、Windows系统安装 2、Linux系统安装 三、Redis通用命令 四、Redis基本命令 五、五种数据结构类型 5.1、String类型 5.2、List集合类型 5.3、Set集合类型 5.4、Hash集合类型 5.5、Zset有序集合类型 六、总结 一、什么是Redi…