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