美文网首页
结合源码分析QgisInterface的addVectorLay

结合源码分析QgisInterface的addVectorLay

作者: NullUser | 来源:发表于2022-06-16 10:58 被阅读0次

1. addVectorLayer接口调用

1). QgisInterface提供接口addVectorLayer用以添加矢量图层,该接口由QgisAppInterface实现

QgisInterface::addVectorLayer()
↓ 实现
QgisAppInterface::addVectorLayer()

2).QgisAppInterface::addVectorLayer()内调用QgisApp::addVectorLayer()

QgisInterface::addVectorLayer(...)
↓ 实现
QgisAppInterface::addVectorLayer(...)
└─qgis->addVectorLayer(...)

3).调用QgisApp的私有函数addLayerPrivate(...),该函数接收图层类型,用以创建不同类型的图层,如:QgsVectorLayer、QgsMeshLayer、QgsRasterLayer

QgisInterface::addVectorLayer(...)
↓ 实现
QgisAppInterface::addVectorLayer(...)
└─qgis->addVectorLayer(...)
    └─addLayerPrivate(...)

2.QgisApp::addLayerPrivate()

1).addLayerPrivate通过QgsProviderRegistry解析uri

template<typename T>
T *QgisApp::addLayerPrivate( QgsMapLayerType type, const QString &uri, const QString &name, const QString &providerKey, bool guiWarnings )
{
......
  QVariantMap uriElements = QgsProviderRegistry::instance()->decodeUri( providerKey, uri );
......
}

在QgsProviderRegistry::decodeUri(...)内部通过providerKey找到QgsProviderMetadata对象指针,再通过该指针调用QgsProviderMetadata::decodeUri()

QVariantMap QgsProviderRegistry::decodeUri( const QString &providerKey, const QString &uri )
{
  QgsProviderMetadata *meta = findMetadata_( mProviders, providerKey );
  if ( meta )
    return meta->decodeUri( uri );
  else
    return QVariantMap();
}

2).往下判断是否可以查询子图层(?)

  const bool canQuerySublayers = QgsProviderRegistry::instance()->providerMetadata( providerKey ) &&
                                 ( QgsProviderRegistry::instance()->providerMetadata( providerKey )->capabilities() & QgsProviderMetadata::QuerySublayers );

  T *result = nullptr;
  if ( canQuerySublayers )
  {......}
  else
  {......}

3).不可以查询子图层时,通过QgsMapLayerFactory::createLayer构造图层对象,QgsMapLayerFactory::createLayer见createLayer源码分析

......
  if ( canQuerySublayers )
  {......}
  else
  {
   QgsMapLayerFactory::LayerOptions options( QgsProject::instance()->transformContext() );
    options.loadDefaultStyle = false;
    result = qobject_cast< T * >( QgsMapLayerFactory::createLayer( uri, name, type, options, providerKey ) );
  }

4). 将图层图像通过QgsProject::addMapLayer添加到图层中

result = qobject_cast< T * >( QgsMapLayerFactory::createLayer( uri, name, type, options, providerKey ) );
if(result)
{
......
      QgsProject::instance()->addMapLayer( result );

      askUserForDatumTransform( result->crs(), QgsProject::instance()->crs(), result );
      postProcessAddedLayer( result );
}

相关文章

网友评论

      本文标题:结合源码分析QgisInterface的addVectorLay

      本文链接:https://www.haomeiwen.com/subject/azafvrtx.html