QVector<LayerVisualInfo*> ChartTableGen::generateLayerVisualInfoForLayer(QString layerId) { QVector<LayerVisualInfo*> tmpLVI; int i=0; // level number LayerVisualInfo* tmpInfo; QString simpStr = "_level"; double e=0; double maxZoom=0; double minZoom=0; QString srcTableName; for (i = 0; i <= this->getSimpLevelCount(); i++) { tmpInfo = new LayerVisualInfo(); if (this->getSimpLevelCount() > 0) { e = this->getEpsilonForLevel(i); maxZoom = this->getZoomForLevel(i); } if (i == 0) { // level 0: no simplification, maximum zoom level (= max zoom in) if (this->getSimpLevelCount()==0) { // and if no other layers, ensure the whole zoom range cover minZoom = 0; } else { minZoom = getMaxZoomLevel(); } maxZoom = (double)LONG_MAX; // --> 2147483647 } else if (i == this->getSimpLevelCount()) { // level = max: heaviest simplification, minimum zoom level (= max zoom out) maxZoom = minZoom; minZoom = 0; } else { minZoom = this->getZoomForLevel(i + 1); } if (i == 0) { srcTableName = layerId; // level 0: original data set with no simplification } else { srcTableName = layerId + simpStr + QString::number(i); } tmpInfo->setLayerId(layerId); tmpInfo->setZoomMin(minZoom); tmpInfo->setZoomMax(maxZoom); tmpInfo->setStyleId(0); tmpInfo->setSimpLevel(i); tmpInfo->setEpsilon(e); tmpInfo->setSrcTableName(srcTableName); tmpLVI << tmpInfo; } // for return tmpLVI; }
size_t PowerOfSqrtTwoZoomConstraint::getNearestBlockSize(size_t blockSize, int &type, int &power, RoundingDirection dir) const { // std::cerr << "given " << blockSize << std::endl; size_t minCachePower = getMinCachePower(); if (blockSize < (1U << minCachePower)) { type = -1; power = 0; float val = 1.0, prevVal = 1.0; while (val + 0.01 < blockSize) { prevVal = val; val *= sqrt(2.f); } size_t rval; if (dir == RoundUp) rval = size_t(val + 0.01); else if (dir == RoundDown) rval = size_t(prevVal + 0.01); else if (val - blockSize < blockSize - prevVal) rval = size_t(val + 0.01); else rval = size_t(prevVal + 0.01); // SVDEBUG << "returning " << rval << endl; return rval; } unsigned int prevBase = (1 << minCachePower); unsigned int prevPower = minCachePower; unsigned int prevType = 0; size_t result = 0; for (unsigned int i = 0; ; ++i) { power = minCachePower + i/2; type = i % 2; unsigned int base; if (type == 0) { base = (1 << power); } else { base = (((unsigned int)((1 << minCachePower) * sqrt(2.) + 0.01)) << (power - minCachePower)); } // SVDEBUG << "Testing base " << base << endl; if (base == blockSize) { result = base; break; } if (base > blockSize) { if (dir == RoundNearest) { if (base - blockSize < blockSize - prevBase) { dir = RoundUp; } else { dir = RoundDown; } } if (dir == RoundUp) { result = base; break; } else { type = prevType; power = prevPower; result = prevBase; break; } } prevType = type; prevPower = power; prevBase = base; } if (result > getMaxZoomLevel()) result = getMaxZoomLevel(); return result; }