bool GenerateTileMatrix(HMAP handle, DFRAME tileMatrixFrame, int level, int pictureTileSize)
{
int matrixSize = static_cast<int>(std::pow(2, level));
auto tileMatrixSize = tileMatrixFrame.X2 - tileMatrixFrame.X1;
auto mapTileSize = tileMatrixSize / matrixSize;
DFRAME tileFrame;
for(int i = 0; i < matrixSize; i++)
{
tileFrame.X2 = tileMatrixFrame.X2 - mapTileSize * i;
tileFrame.X1 = tileFrame.X2 - mapTileSize;
for(int j = 0; j < matrixSize; j++)
{
tileFrame.Y1 = tileMatrixFrame.Y1 + mapTileSize * j;
tileFrame.Y2 = tileFrame.Y1 + mapTileSize;
QStringList ssProviderUrl;
ssProviderUrl << initialTilesPath_
<< mapName_ << "/wmts/"
<< defaultLayerName_ << "/"
<< defaultStyleName_ << "/"
<< defaultTileMatrixSetName_ << "/"
<< QString::number(level + topLevel_) << "/"
<< QString::number(i);
QString path = ssProviderUrl.join("");
if(!Utilities::checkPath(path))
{
qDebug() << path << " not created!" ;
}
ssProviderUrl << "/"
<< QString::number(j)
<< "."
<< tileFormat_.toLower();
auto qsfp = ssProviderUrl.join("");
if(!fileExists(qsfp))
{
try
{
bool fc = drawContents(handle, pictureTileSize, pictureTileSize, &tileFrame, qsfp, tileFormat_);
if(!fc)
{
QImage image(QSize(pictureTileSize,pictureTileSize), QImage::Format_ARGB32);
image.fill(Qt::GlobalColor::white);
char* format = tileFormat_.toAscii().data();
image.save(qsfp, format);
//qDebug() << resSave;
}
}
catch(const std::exception& ex)
{
qDebug() << "ex";
}
}
numGeneratedTiles+=1;
progress(numGeneratedTiles);
#if 0
if(progressBar_ != nullptr)
progressBar_->setValue(progressBar_->value()+1);
#endif
if(isCanceled)
{
return false;
}
}
if(isCanceled)
{
return false;
}
}
auto _scale = (std::abs(tileFrame.X2 - tileFrame.X1)) / (scalePitch * pictureTileSize);
TileMatrixModel* tm = new TileMatrixModel(level + topLevel_, matrixSize, pictureTileSize, _scale, tileMatrixFrame.Y1, tileMatrixFrame.X2);
tileMatrixes_.append(tm);
emit tileMatrixModelGenerated(tm);
return true;
}
bool drawContents(HMAP hMap, int cw, int ch, DFRAME* frame, const QString& filePath, const QString& fileFormat)
{
bool result = false;
if (hMap)
{
// Количество бит, выделяемое на одну точку изображения карты
int mapdepth = 32;
// Дополнить до mapdepth байт
long allignwidth = cw * (mapdepth / 8);
long size = allignwidth * ch;
char *bits = ::AllocateTheMemory(size);
if (bits)
{
memset(bits, 0x0, size);
XIMAGEDESC Ximagedesc;
Ximagedesc.Point = bits; // Адрес начала области пикселов
Ximagedesc.Width = cw; // Ширина строки в пикселах
Ximagedesc.Height = ch; // Число строк
Ximagedesc.Depth = mapdepth; // Размер элемента в битах
Ximagedesc.CellSize = mapdepth / 8; // Размер элемента(пиксела) в байтах
Ximagedesc.RowSize = cw * Ximagedesc.CellSize; // Ширина строки в байтах
result = mapPaintByFrameToXImage(hMap, &Ximagedesc, frame, cw, ch, 0) != 0;
if (result)
{
if(fileFormat.toLower() == "png")
{
result = quantizePng((uchar *)bits, cw, ch, filePath, fileFormat);
if(!result)
{
result = saveQimage((uchar *)bits, cw, ch, QImage::Format_ARGB32, filePath, fileFormat);
if(!result)
{
qDebug() << "File " << filePath << " not saved.";
}
}
}
else
{
result = saveQimage((uchar *)bits, cw, ch, QImage::Format_RGB32, filePath, fileFormat);
if(!result)
{
qDebug() << "File " << filePath << " not saved.";
}
}
}
FreeTheMemory(bits);
}
return result;
}
}
|