На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Создание растровых тайлов

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
Создание растровых тайлов
 
Здравствуйте. При использовании функции mapPaintByFrameToXImage для создания тайлов под WMTS в тайлах верхнего уровня часть надписи, попадающая на один тайл, не попадает на соседний по горизонтали.

Пример (ссылки на Яндекс.Диск).
1й уровень
2й уровень (начало надписи есть)
2й уровень (продолжение надписи отсутствует)

С чем это может быть связанно?
 
Здравствуйте!

Уточните, пожалуйста, следующие моменты:
  • используемую версию ГИС Конструктор и операционную систему;
  • возможно ли прислать небольшой пример кода для анализа и, при возможности, тестовую карту.
Спасибо!
 
Версия библиотек ГИС Конструктор для QT Designer x64 12, ОС Ubuntu 16.04.
Разработка ведётся на операционной системе Ubuntu 18.04.
Карту не могу предоставить.

Код.
Код
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;
    }
}

Было замечено что объект подписи пропадает на соседнем тайле если подпись находится большей частью на первом тайле (Подпись выравнена по горизонтали по левому краю). Если сдвинуть подпись вправо то она начинает отображаться на соседнем тайле.

 
Карта
Подложка
 
Здравствуйте!

Уточните, пожалуйста:
  • используете ли Вы крайнюю версию ГИС Конструктор для Ubuntu 16.04 с нашего сайта? (https://gisinfo.ru/download/download_linux.htm#5). Если нет, есть ли возможность попробовать на крайней версии?
  • для воспроизведения проблемы не могли бы Вы уточнить рамки в метрах тайлов, которые Вы прислали в качестве скриншотов, и масштаб отображения карты.
Спасибо!
 
Приветствую!

Предположу, что габариты подписи не пересекаются с областью запрашиваемой при отрисовке. Почему так может быть? Вариантов много. Например, неправильно заполнена метрика у подписи. Бывает что только одна точка метрики задана, бывает, что метрика заполнена справа налево, а у подписи стоит признак "строго горизонтально". Обычно исправление метрики решает проблему, но надо подбирать на масштабах.

В общем случае, задачу я решить не смог, поэтому для минимизации ошибок, запрашиваю область больше чем требуемый тайл, а потом разбиваю на тайлы и "обрезаю" лишнее.

С уважением,
Матвеев П.В.
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности