QGis二次开发基础 -- 添加在线地图服务

OpenGIS 规范致力于为地理信息系统间的数据和服务互操作提供统一,提供了很多在线的 GIS 数据,包括Web Map Service (WMS),Web Feature Service(WFS),Web Coverage Service(WCS)等在线地图服务。为了能够方便使用这样的在线地图数据,QGis专门做了支持在线地图数据的功能,只要电脑联网,就可以轻松访问 OGC 的各种地图服务器,并轻易的将所需要的地图数据下载下来。本文就来与大家探讨一下如何在QGis二次开发时添加这些在线地图图层。

这里写图片描述

以添加 WMS 图层为例

WMS 图层属于图像图层,也就是栅格图层。既然是栅格,先来看一看 QgsRasterLayer 有没有相关的支持。在 API 文档中,QgsRasterLayer 的构造函数有三个,如下图

这里写图片描述

其中,第三个构造函数,正是我们需要的根据地图文件位置、地图图层名称以及地图数据提供者来构造栅格图像的方式。

看到这里似乎就很简单了,要添加 WMS 图层,与之前添加本地栅格图层一个道理,只不过将原来的本地路径改为地图服务所在的网址就行了。于是,有了下面的代码。

// **这个函数的定义见下文**
addOpenSourceRasterLayer("contextualWMSLegend=0&crs=EPSG:4326&dpiMode=all&featureCount=10&format=image/gif&layers=DC&styles=&url=http://wms.lizardtech.com/lizardtech/iserv/ows",
                 "DC",
                 "wms" );

只要触发上面这行代码,就能够添加一个基本的 WMS 图层,效果如下。
这里写图片描述
如果你的需求仅仅是为了打开某个特定的在线地图数据,到这里应该就能实现了。

然而,有没有办法如同 QGis 那样可以查询可用的地图服务,实时下载显示呢?

源码分析

为了解决上面的问题,实际上,我们需要模仿QGis的做法,于是还是从源码上面找答案。打开源码,找到添加 WMS 图层的相应代码段,如下

void QgisApp::addWmsLayer()
{
    // Fudge for now
    QgsDebugMsg( "about to addRasterLayer" );

    // TODO: QDialog for now, switch to QWidget in future
    QDialog *wmss = dynamic_cast<QDialog*>( QgsProviderRegistry::instance()->selectWidget( QString( "wms" ), this ) );
    if ( !wmss )
    {
        QMessageBox::warning( this, tr( "WMS" ), tr( "Cannot get WMS select dialog from provider." ) );
        return;
    }
    connect( wmss, SIGNAL( addRasterLayer( QString const &, QString const &, QString const & ) ),
             this, SLOT( addRasterLayer( QString const &, QStr
  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值