void LayerManager::addInfoLayer(const QString& sobjid) { quint64 objid = sobjid.toULongLong(); for (auto& cov : _mapInfoExtraLayer) { if (cov->vproperty("id") .toULongLong() == objid) return; } ICoverage cov; if (!cov.prepare(objid, {"mustexist", true})) { return; } auto iter = _createLayers.find(TypeHelper::type2name(cov->ilwisType())); if (iter != _createLayers.end()) { auto createFunc = (*iter).second; QString layername = cov->name(); CoverageLayerModel *layer = static_cast<CoverageLayerModel *>(createFunc(this, 0, layername, cov->description(),IOOptions())); layer->coverage(cov); _mapInfoExtraLayer.emplace_back(layer); } }
SelectionBase::ExpressionPart::ExpressionPart(const ICoverage& coverage, const QString& p){ QString part = p.trimmed(); _isValid = false; int index; if ( (index = part.indexOf("envelope("))!= -1) { _envelope = QString(part).replace("envelope", "box"); _isValid = _envelope.isValid(); _type = ptENVELOPE; if ( coverage->ilwisType() == itRASTER && _envelope.isValid()){ IRasterCoverage raster = coverage.as<RasterCoverage>(); _box = raster->georeference()->coord2Pixel(_envelope); //setEnvelopePolygon(raster); } } else if ((index = part.indexOf("boundingbox("))==0){ _box = QString(part).replace("boundingbox", "box"); _isValid = _box.isValid(); _type = ptBOX; }else if ( (index = part.indexOf("polygon(")) != -1){ _polygon.reset(GeometryHelper::fromWKT(part,0)); _isValid = _polygon.get() != 0; _type = ptPOLYGON; }else if ( part.indexOf("attributes(")!= -1) { index = part.indexOf("("); int len = part.lastIndexOf(")") - index - 1; QString lst = part.mid(index + 1, len); QStringList attribs = lst.split(","); for(auto attrib : attribs){ if ( coverage->attributeTable()->columnIndex(attrib) != iUNDEF) { _attributes.push_back(attrib); _isValid = true; } } _type = ptATTRIBUTE; } else if (part.indexOf("rasterbands(")!=-1){ index = part.indexOf("("); int len = part.lastIndexOf(")") - index - 1; QString lst = part.mid(index + 1, len); QStringList indexes = lst.split(","); IRasterCoverage raster = coverage.as<RasterCoverage>(); for(auto ind : indexes){ if (raster->stackDefinition().index(ind) != iUNDEF){ _bands.push_back(ind); _isValid = true; } } _type = ptBANDS; }else if ((index = part.indexOf("featuretype("))==0){ QString ft = part.mid(index + 1); if ( ft == "point") _geometryType = itPOINT; if ( ft == "line") _geometryType = itLINE; if ( ft == "polygon"){ _geometryType = itPOLYGON; } _isValid = true; }else { std::map<QString,LogicalOperator> operators = {{"==", loEQ},{"<=",loLESSEQ},{">=", loGREATEREQ},{"<",loLESS},{">", loGREATER},{"!=",loNEQ}}; int index1 = part.indexOf("\""); if ( index1 == -1) index1 = 10000; int index2 = 0; for(auto op : operators){ if ((index2 = part.indexOf(op.first)) != -1){ if ( index2 < index1) { _operator = op.second; QString rights = part.mid(index2 + op.first.size()).trimmed(); _rightSide = rights.remove("\'"); QString leftSide = part.left(index2).trimmed(); if ( leftSide.toLower() == "pixelvalue"){ _leftSide = iUNDEF; _isValid = true; }else { if ( (_leftSide = coverage->attributeTable()->columnIndex(leftSide)) == iUNDEF){ _isValid = false; }else { ColumnDefinition coldef = coverage->attributeTable()->columndefinition(_leftSide); QVariant val = coldef.datadef().domain()->impliedValue(_rightSide); _rightSide = val; } } _type = ptATTRIBUTESELECTION; break; } } } } }
void LayersRenderer::synchronize(QQuickFramebufferObject *item) { try { bool needPrepare = false; LayersView *gdrawer = static_cast<LayersView *>(item); _viewPortSize = QSize(gdrawer->width(), gdrawer->height()); _windowSize = gdrawer->window()->size(); _rootDrawer->pixelAreaSize(_viewPortSize); while(gdrawer->_attributerequests.size() > 0){ auto pair = gdrawer->_attributerequests.front(); gdrawer->_attributerequests.pop_front(); QVariant var = _rootDrawer->attributeOfDrawer(pair.first, pair.second); gdrawer->_copiedAttributes[pair.first.toLower() + "|" + pair.second.toLower()] = var; needPrepare = true; } for(const Ilwis::OperationExpression& expr : gdrawer->_commands){ quint64 id = commandhandler()->findOperationId(expr); if ( id != i64UNDEF) { QScopedPointer<OperationImplementation> oper(commandhandler()->create( expr)); if ( !oper.isNull() && oper->isValid()) { ExecutionContext ctx; SymbolTable symTable; QVariant v = qVariantFromValue((void *) _rootDrawer); ctx._additionalInfo["rootdrawer"] = v; if ( oper->execute(&ctx, symTable)){ Symbol sym = symTable.getSymbol("layerdrawer"); if ( sym.isValid()){ Ilwis::Geodrawer::DrawerInterface *drawer = static_cast<Ilwis::Geodrawer::DrawerInterface *>(sym._var.value<void *>()); if ( drawer){ ICoverage cov = drawer->attribute("coverage").value<ICoverage>(); if ( gdrawer->_manager) gdrawer->_manager->addDataSource(cov->source().url(),cov->ilwisType(),drawer); } } } } needPrepare = true; } } gdrawer->_commands = std::deque<OperationExpression>(); while( gdrawer->_attributeQueue.size() > 0){ auto pair = gdrawer->_attributeQueue.front(); gdrawer->_attributeQueue.pop_front(); for(QVariantMap::const_iterator iter = pair.second.begin(); iter != pair.second.end(); ++iter) { _rootDrawer->drawerAttribute(pair.first.toLower(),iter.key(), iter.value()); } needPrepare = true; } if ( needPrepare){ _rootDrawer->prepare(Ilwis::Geodrawer::DrawerInterface::ptALL,Ilwis::IOOptions()); emit synchronizeDone(); } } catch ( const ErrorObject& ){ } catch ( const std::exception ex){ } }