1、采集时,创建RasterImageLayer时,dataprovider延迟初始化;
2、采集时,不通过渲染器渲染;
This commit is contained in:
tangchao0503
2026-05-27 17:40:41 +08:00
parent 5dc589aee0
commit 43acd5ba01
3 changed files with 35 additions and 18 deletions

View File

@ -2667,7 +2667,7 @@ void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refres
if (isAddImage) if (isAddImage)
{ {
newImage(ml, RasterImageLayer::RendererType::Multiband, node); newImage(ml, RasterImageLayer::RendererType::Multiband, node, refresh);
} }
} }

View File

@ -8,32 +8,46 @@
RasterImageLayer::RasterImageLayer(RasterLayer* layer, RendererType type) RasterImageLayer::RasterImageLayer(RasterLayer* layer, RendererType type)
: m_layer(layer) : m_layer(layer)
, m_rendererType(type) , m_rendererType(type)
, m_rendererInitialized(false)
{ {
}
void RasterImageLayer::ensureRenderer()
{
if (m_rendererInitialized) return;
if (!m_layer) return; if (!m_layer) return;
RasterDataProvider* provider = nullptr; RasterDataProvider* provider = nullptr;
if (m_layer->dataProvider()) { if (m_layer->dataProvider())
{
provider = m_layer->dataProvider(); provider = m_layer->dataProvider();
} else if (m_layer->openDataProvider()) { }
else if (m_layer->openDataProvider())
{
provider = m_layer->dataProvider(); provider = m_layer->dataProvider();
} }
if (!provider) return; if (!provider) return;
switch (type) { switch (m_rendererType)
case RendererType::Multiband: { {
auto* multiRenderer = new MultibandRasterRenderer(provider); case RendererType::Multiband:
m_renderer.reset(multiRenderer); {
multiRenderer->setParams(m_multibandParams); auto* multiRenderer = new MultibandRasterRenderer(provider);
break; m_renderer.reset(multiRenderer);
} multiRenderer->setParams(m_multibandParams);
case RendererType::Singleband: { break;
auto* singleRenderer = new SinglebandRasterRenderer(provider); }
m_renderer.reset(singleRenderer); case RendererType::Singleband:
singleRenderer->setParams(m_singlebandParams); {
break; auto* singleRenderer = new SinglebandRasterRenderer(provider);
} m_renderer.reset(singleRenderer);
singleRenderer->setParams(m_singlebandParams);
break;
}
} }
m_rendererInitialized = true;
} }
RasterImageLayer::~RasterImageLayer() RasterImageLayer::~RasterImageLayer()
@ -43,6 +57,7 @@ RasterImageLayer::~RasterImageLayer()
QImage RasterImageLayer::render() QImage RasterImageLayer::render()
{ {
ensureRenderer();
if (!m_renderer) return QImage(); if (!m_renderer) return QImage();
return m_renderer->render(); return m_renderer->render();
} }
@ -50,7 +65,7 @@ QImage RasterImageLayer::render()
void RasterImageLayer::setMultibandParams(const MultibandRenderParams& params) void RasterImageLayer::setMultibandParams(const MultibandRenderParams& params)
{ {
m_multibandParams = params; m_multibandParams = params;
if (m_rendererType == RendererType::Multiband) { if (m_rendererInitialized && m_rendererType == RendererType::Multiband) {
auto* r = static_cast<MultibandRasterRenderer*>(m_renderer.get()); auto* r = static_cast<MultibandRasterRenderer*>(m_renderer.get());
r->setParams(params); r->setParams(params);
} }
@ -59,7 +74,7 @@ void RasterImageLayer::setMultibandParams(const MultibandRenderParams& params)
void RasterImageLayer::setSinglebandParams(const SinglebandRenderParams& params) void RasterImageLayer::setSinglebandParams(const SinglebandRenderParams& params)
{ {
m_singlebandParams = params; m_singlebandParams = params;
if (m_rendererType == RendererType::Singleband) { if (m_rendererInitialized && m_rendererType == RendererType::Singleband) {
auto* r = static_cast<SinglebandRasterRenderer*>(m_renderer.get()); auto* r = static_cast<SinglebandRasterRenderer*>(m_renderer.get());
r->setParams(params); r->setParams(params);
} }

View File

@ -22,6 +22,7 @@ public:
RasterImageLayer(RasterLayer* layer, RendererType type); RasterImageLayer(RasterLayer* layer, RendererType type);
~RasterImageLayer(); ~RasterImageLayer();
void ensureRenderer();
QImage render(); QImage render();
RasterLayer* layer() const { return m_layer; } RasterLayer* layer() const { return m_layer; }
@ -41,4 +42,5 @@ private:
std::unique_ptr<RasterRendererBase> m_renderer; std::unique_ptr<RasterRendererBase> m_renderer;
MultibandRenderParams m_multibandParams; MultibandRenderParams m_multibandParams;
SinglebandRenderParams m_singlebandParams; SinglebandRenderParams m_singlebandParams;
bool m_rendererInitialized = false;
}; };