bool RasterCoverageConnector::loadData(IlwisObject* data, const IOOptions& options ){ quint32 bandindex = sourceRef().hasProperty("bandindex") ? sourceRef()["bandindex"].toUInt(): iUNDEF; auto layerHandle = gdal()->getRasterBand(_handle->handle(), bandindex != iUNDEF ? bandindex + 1 : 1); if (!layerHandle) { ERROR2(ERR_COULD_NOT_LOAD_2, "GDAL","layer"); return false; } RasterCoverage *raster = static_cast<RasterCoverage *>(data); UPGrid& grid = raster->gridRef(); quint32 linesPerBlock = grid->maxLines(); qint64 blockSizeBytes = grid->blockSize(0) * _typeSize; char *block = new char[blockSizeBytes]; quint64 totalLines =grid->size().ysize(); std::map<quint32, std::vector<quint32> > blocklimits; //blocklimits; key = band number, value= blocks needed from this band if ( bandindex == iUNDEF) blocklimits = grid->calcBlockLimits(options); else{ for(int i = 0; i < std::ceil((double)totalLines / linesPerBlock); ++i) blocklimits[bandindex].push_back(i); } for(const auto& layer : blocklimits){ quint64 linesLeft = totalLines - grid->maxLines() * layer.second[0]; //std::min((quint64)grid->maxLines(), totalLines - grid->maxLines() * layer.second[0]); if ( _colorModel == ColorRangeBase::cmNONE || raster->datadef().domain()->valueType() == itPALETTECOLOR){ // palette entries are just integers so we can use the numeric read for it layerHandle = gdal()->getRasterBand(_handle->handle(), layer.first + 1); int inLayerBlockIndex = layer.second[0] % grid->blocksPerBand(); // for(const auto& index : layer.second) { quint32 offsetIndex = bandindex == iUNDEF ? layer.first : (layer.first - bandindex); loadNumericBlock(layerHandle, index, inLayerBlockIndex, linesPerBlock, linesLeft, block, raster,offsetIndex ); if(!moveIndexes(linesPerBlock, linesLeft, inLayerBlockIndex)) break; } }else { // continous colorcase, combining 3/4 (gdal)layers into one int inLayerBlockIndex = layer.second[0] % grid->blocksPerBand(); // for(const auto& index : layer.second) { loadColorBlock(layer.first,index,inLayerBlockIndex,linesPerBlock,linesLeft,block,grid); if(!moveIndexes(linesPerBlock, linesLeft, inLayerBlockIndex)) // ensures that the administration with respect how much needs to be done is inorder break; } } } delete [] block; _binaryIsLoaded = true; return true; }
IlwisObject *InternalIlwisObjectFactory::createRasterCoverage(const Resource& resource, const IOOptions &options) const { if ( !resource.isValid()) { ERROR1(ERR_NO_INITIALIZED_1,"resource"); return 0; } RasterCoverage *gcoverage = createFromResource<RasterCoverage>(resource, options); if (!createCoverage(resource, gcoverage, options)) return 0; Size<> sz; QString typenm = resource["size"].typeName(); if ( typenm == "Ilwis::Size<quint32>"){ sz = resource["size"].value<Size<>>(); } else if (typenm == "QSize") { sz = resource["size"].toSize(); } else if (typenm == "QString") { QStringList parts = resource["size"].toString().split(" "); if ( parts.size() >= 2) sz = Size<>(parts[0].toInt(), parts[1].toInt(), 1); if ( parts.size() == 3) sz.zsize(parts[2].toInt()); } gcoverage->gridRef()->prepare(gcoverage, sz); IGeoReference grf; QString tpnam = resource["georeference"].typeName(); if (tpnam == "Ilwis::IGeoReference") grf = resource["georeference"].value<Ilwis::IGeoReference>(); else if( tpnam == "QString" && resource["georeference"].toString() != sUNDEF) { Resource newresource = resource.property2Resource("georeference", itGEOREF); if ( newresource.isValid()) { if (!grf.prepare(newresource)) return 0; } } else if ( tpnam == "qulonglong"){ if(!grf.prepare(resource["georeference"].value<quint64>())) return 0; } else{ Envelope bounds = gcoverage->envelope(); if ( bounds.isValid() && !bounds.isNull()){ grf = new GeoReference(); grf->create("corners"); grf->name("subset_" + gcoverage->name()); grf->coordinateSystem(gcoverage->coordinateSystem()); QSharedPointer< CornersGeoReference> spGrf = grf->as< CornersGeoReference>(); spGrf->internalEnvelope(bounds); grf->size(sz); if (!grf->compute()){ ERROR1(ERR_COULDNT_CREATE_OBJECT_FOR_1, "Georeference"); return 0; } } } if ( grf.isValid()) gcoverage->georeference(grf); if ( sz.isValid()) gcoverage->size(sz); return gcoverage; }