Ilwis::OperationImplementation::State SelectionRaster::prepare(ExecutionContext *ctx, const SymbolTable &st) { OperationImplementation::prepare(ctx,st); if ( _expression.parameterCount() != 2) { ERROR3(ERR_ILLEGAL_NUM_PARM3,"rasvalue","1",QString::number(_expression.parameterCount())); return sPREPAREFAILED; } IlwisTypes inputType = itRASTER; QString raster = _expression.parm(0).value(); if (!_inputObj.prepare(raster, inputType)) { ERROR2(ERR_COULD_NOT_LOAD_2,raster,""); return sPREPAREFAILED; } IRasterCoverage inputRaster = _inputObj.as<RasterCoverage>(); _inputAttributeTable = inputRaster->attributeTable(); quint64 copylist = itCOORDSYSTEM ; QString selector = _expression.parm(1).value(); parseSelector(selector, inputRaster); std::vector<QString> selectionBands = bands(inputRaster); _box = boundingBox(_inputObj.as<RasterCoverage>()); bool useOldGrf ; if ( _box.isNull() || !_box.isValid()){ _box = inputRaster->size(); useOldGrf = true; } else useOldGrf = false; if ( useOldGrf){ copylist |= itGEOREF | itRASTERSIZE | itENVELOPE; } int selectedAttributes = attributeNames().size(); if (selectedAttributes != 1) copylist |= itDOMAIN; _outputObj = OperationHelperRaster::initialize(_inputObj,inputType, copylist); if ( !_outputObj.isValid()) { ERROR1(ERR_NO_INITIALIZED_1, "output coverage"); return sPREPAREFAILED; } IRasterCoverage outputRaster = _outputObj.as<RasterCoverage>(); QString outputName = _expression.parm(0,false).value(); if ( outputName != sUNDEF) _outputObj->name(outputName); if ( selectedAttributes > 1) { QString url = INTERNAL_CATALOG + "/" + outputName; Resource resource(url, itFLATTABLE); _attTable.prepare(resource); } if ( selectedAttributes == 1 && _inputAttributeTable.isValid()){ QStringList names = attributeNames(); //outputRaster->datadefRef().domain(_inputAttributeTable->columndefinition(names[0]).datadef().domain()); outputRaster->setDataDefintions(_inputAttributeTable->columndefinition(names[0]).datadef().domain(), selectionBands, inputRaster->stackDefinition().domain()); }else outputRaster->setDataDefintions(inputRaster->datadef().domain(), selectionBands, inputRaster->stackDefinition().domain()); if ( (copylist & itGEOREF) == 0) { Resource resource(QUrl(INTERNAL_CATALOG + "/" + outputRaster->name() + "_grf_" + QString::number(outputRaster->id())),itGEOREF); resource.addProperty("size", IVARIANT(_box.size())); auto envelope = inputRaster->georeference()->pixel2Coord(_box); resource.addProperty("envelope", IVARIANT(envelope)); resource.addProperty("coordinatesystem", IVARIANT(inputRaster->coordinateSystem())); resource.addProperty("name", _outputObj->name()); resource.addProperty("centerofpixel",inputRaster->georeference()->centerOfPixel()); IGeoReference grf; grf.prepare(resource); outputRaster->georeference(grf); outputRaster->envelope(envelope); } return sPREPARED; }
bool RasterLayerDrawer::prepare(DrawerInterface::PreparationType prepType, const IOOptions &options) { if(!LayerDrawer::prepare(prepType, options)) return false; IRasterCoverage raster = coverage().as<RasterCoverage>(); if ( !_rasterImage){ setActiveVisualAttribute(PIXELVALUE); _visualAttribute = visualProperty(activeAttribute()); _rasterImage.reset(RasterImageFactory::create(raster->datadef().domain()->ilwisType(), rootDrawer(),raster,_visualAttribute,IOOptions())); if (!_rasterImage){ ERROR2(ERR_NO_INITIALIZED_2,"RasterImage",raster->name()); return false; } } if ( hasType(prepType, ptSHADERS) && !isPrepared(ptSHADERS)){ _texcoordid = _shaders.attributeLocation("texCoord"); _textureid = _shaders.uniformLocation( "tex" ); _prepared |= DrawerInterface::ptSHADERS; } if ( hasType(prepType, DrawerInterface::ptGEOMETRY) && !isPrepared(DrawerInterface::ptGEOMETRY)){ Envelope env = rootDrawer()->coordinateSystem()->convertEnvelope(raster->coordinateSystem(), raster->envelope()); _vertices.resize(6); _vertices[0] = QVector3D(env.min_corner().x, env.min_corner().y, 0); _vertices[1] = QVector3D(env.max_corner().x, env.min_corner().y, 0); _vertices[2] = QVector3D(env.min_corner().x, env.max_corner().y, 0); _vertices[3] = QVector3D(env.max_corner().x, env.min_corner().y, 0); _vertices[4] = QVector3D(env.max_corner().x, env.max_corner().y, 0); _vertices[5] = QVector3D(env.min_corner().x, env.max_corner().y, 0); _texcoords.resize(6); _texcoords = {{0,1},{1,1},{0,0}, {1,1},{1,0},{0,0} }; _prepared |= ( DrawerInterface::ptGEOMETRY); } if ( hasType(prepType, DrawerInterface::ptRENDER) && !isPrepared(DrawerInterface::ptRENDER)){ setActiveVisualAttribute(PIXELVALUE); _visualAttribute = visualProperty(activeAttribute()); _rasterImage->visualAttribute(_visualAttribute); _prepared |= ( DrawerInterface::ptRENDER); } if (_rasterImage->prepare((int)prepType)){ _texture.reset( new QOpenGLTexture(*(_rasterImage->image().get()))); _texture->setMinMagFilters(QOpenGLTexture::Nearest,QOpenGLTexture::Nearest); } return true; }
Ilwis::OperationImplementation::State Selection::prepare(ExecutionContext *, const SymbolTable &) { if ( _expression.parameterCount() != 2) { ERROR3(ERR_ILLEGAL_NUM_PARM3,"rasvalue","1",QString::number(_expression.parameterCount())); return sPREPAREFAILED; } IlwisTypes inputType = itRASTER; QString raster = _expression.parm(0).value(); if (!_inputObj.prepare(raster, inputType)) { ERROR2(ERR_COULD_NOT_LOAD_2,raster,""); return sPREPAREFAILED; } IRasterCoverage inputRaster = _inputObj.as<RasterCoverage>(); quint64 copylist = itCOORDSYSTEM; QString selector = _expression.parm(1).value(); selector = selector.remove('"'); int index = selector.indexOf("box="); Envelope box; if ( index != -1) { QString crdlist = "box(" + selector.mid(index+4) + ")"; _box = BoundingBox(crdlist); box = inputRaster->georeference()->pixel2Coord(_box); copylist |= itDOMAIN | itTABLE; std::vector<qint32> vec{_box.min_corner().x, _box.min_corner().y,_box.min_corner().z}; _base = vec; } index = selector.indexOf("polygon="); if ( index != -1) { //TODO: copylist |= itDOMAIN | itTABLE; } index = selector.indexOf("attribute="); if ( index != -1 ) { if (! inputRaster->attributeTable().isValid()) { ERROR2(ERR_NO_FOUND2,"attribute-table", "coverage"); return sPREPAREFAILED; } _attribColumn = selector.mid(index+10); copylist |= itRASTERSIZE | itGEOREF | itENVELOPE; } int indexindex = selector.indexOf("index="); if ( indexindex != -1) { copylist |= itDOMAIN | itGEOREF | itENVELOPE | itTABLE; _box = BoundingBox(inputRaster->size()); QString zvalues = selector.mid(6); bool ok; _zvalue = zvalues.toInt(&ok); if ( !ok || _zvalue < 0) { ERROR3(ERR_ILLEGAL_PARM_3, TR("layer index"), zvalues,"Selection"); return sPREPAREFAILED; } _box.min_corner().z = _zvalue; _box.max_corner().z = _zvalue; std::vector<qint32> vec{_box.min_corner().x, _box.min_corner().y,_box.min_corner().z}; _base = vec; } _outputObj = OperationHelperRaster::initialize(_inputObj,inputType, copylist); if ( !_outputObj.isValid()) { ERROR1(ERR_NO_INITIALIZED_1, "output coverage"); return sPREPAREFAILED; } IRasterCoverage outputRaster = _outputObj.as<RasterCoverage>(); if ( (copylist & itDOMAIN) == 0) { outputRaster->datadefRef() = _attribColumn != "" ? inputRaster->attributeTable()->columndefinition(_attribColumn).datadef() : outputRaster->datadefRef() = inputRaster->datadef(); } QString outputName = _expression.parm(0,false).value(); if ( outputName != sUNDEF) _outputObj->name(outputName); if ( (copylist & itGEOREF) == 0) { Resource resource(QUrl("ilwis://internalcatalog/georeference"),itGEOREF); resource.addProperty("size", IVARIANT(_box.size())); resource.addProperty("envelope", IVARIANT(box)); resource.addProperty("coordinatesystem", IVARIANT(inputRaster->coordinateSystem())); resource.addProperty("name", _outputObj->name()); resource.addProperty("centerofpixel",inputRaster->georeference()->centerOfPixel()); IGeoReference grf; grf.prepare(resource); outputRaster->georeference(grf); outputRaster->envelope(box); } if(indexindex != -1) { Size<> sz(outputRaster->size().xsize(),outputRaster->size().xsize(), 1); outputRaster->size(sz); } return sPREPARED; }
Ilwis::OperationImplementation::State AggregateRaster::prepare(ExecutionContext *, const SymbolTable & ) { QString raster = _expression.parm(0).value(); QString outputName = _expression.parm(0,false).value(); int copylist = itDOMAIN | itCOORDSYSTEM; if (!_inputObj.prepare(raster, itRASTER)) { ERROR2(ERR_COULD_NOT_LOAD_2,raster,""); return sPREPAREFAILED; } _method = toMethod(_expression.parm(1).value()); if ( _method == NumericStatistics::pLAST) { ERROR2(ERR_ILLEGAL_VALUE_2, "parameter value", " aggregation method"); return sPREPAREFAILED; } bool ok; quint32 groupSz = _expression.parm(2).value().toInt(&ok); if (!ok) { QString blist = _expression.parm(2).value(); blist.remove("{"); blist.remove("}"); QStringList dims = blist.split(" "); if ( dims.size() > 0) { for(int i=0; i < dims.size(); ++i) { quint32 val = dims[i].toInt(&ok); if ( ok) { _groupSize[i] = val; }else break; } } }else { _groupSize[0] = groupSz; _groupSize[1] = groupSz; } if ( !ok || groupSize() < 2) { ERROR2(ERR_ILLEGAL_VALUE_2, "aggregation group size", QString::number(groupSize())); return sPREPAREFAILED; } _grouped = _expression.parm(3).value().toLower() == "true"; if ( !_grouped) copylist |= itGEOREF; _outputObj = OperationHelperRaster::initialize(_inputObj,itRASTER, copylist); if ( !_outputObj.isValid()) { ERROR1(ERR_NO_INITIALIZED_1, "output rastercoverage"); return sPREPAREFAILED; } QString outputBaseName = outputName; int index = 0; if ( (index = outputName.lastIndexOf(".")) != -1) { outputBaseName = outputName.left(index); } IRasterCoverage inputRaster = _inputObj.as<RasterCoverage>(); IRasterCoverage outputRaster = _outputObj.as<RasterCoverage>(); if ( outputName != sUNDEF) _outputObj->name(outputName); outputRaster->coordinateSystem(inputRaster->coordinateSystem()); BoundingBox box(inputRaster->size()); if ( _grouped) { int xs = box.xlength(); int ys = box.ylength(); int zs = box.zlength(); int newxs = xs / groupSize(0); int newys = ys / groupSize(1); int newzs = zs / groupSize(2); box = BoundingBox(Size<>(newxs, newys, newzs)); } if ( _expression.parameterCount() == 5 || _grouped) { Envelope envlope = inputRaster->envelope(); Resource resource(QUrl("ilwis://internalcatalog/georeference"),itGEOREF); resource.addProperty("size", IVARIANT(box.size())); resource.addProperty("envelope", IVARIANT(envlope)); resource.addProperty("coordinatesystem", inputRaster->coordinateSystem()->id()); resource.addProperty("name", outputBaseName); resource.addProperty("centerofpixel",inputRaster->georeference()->centerOfPixel()); IGeoReference grf; if (grf.prepare(resource)) { mastercatalog()->addItems({resource}); outputRaster->georeference(grf); } outputRaster->envelope(envlope); outputRaster->size(box.size()); } initialize(outputRaster->size().linearSize()); return sPREPARED; }