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

Проблема с переносом рамки в другую проекцию

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
Проблема с переносом рамки в другую проекцию, Общий вопрос по mapChangeObjectMap на ГИС конструктор 11.10.3, Linux Mint 18 64bit
 
Доброго времени суток.

Я новенький в этой тематике, поиском пользовался, ответа не нашёл, но если где-то что-то пропустил, ткните носом, пожалуйста.
При тестировании переноса объектов из исходной проекции карты подольска (гаусса-крюгера) в проекцию меркатора следующим кодом:
Код
bool testConvert()
{
    bool result = false;
    if( m_hMap == 0) return result;

    MAPREGISTEREX   mgr;
    LISTREGISTER    lrg;
    if( mapGetMapInfoEx( m_hMap, 1, &mgr, &lrg))
    {
        static const int LOCAL_SIZE = 1024;
        char rscName[ LOCAL_SIZE] = {0};
        if( mapGetRscFileName( m_hRsc, rscName, LOCAL_SIZE - 1) != 0)// получение текущего имени файла классификатора
        {
            mgr.MaterialProjection = MERKATORMAP;
            QString newFileName = "/tmp/podolsk_test/podolsk.map";
            if( writeLocalMapTo( mapCreateMapEx( newFileName.toLatin1().data(), rscName, &mgr, &lrg)))
            {
                return true;
            }
        }
        else
        {
            qDebug() << "getting rsc filename was bad idea.";
        }
    }
    return false;
}

bool writeLocalMapTo(HMAP lhMap)
{
    if( lhMap != 0)
    {
        MAPREGISTEREX   mgr;
        LISTREGISTER    lrg;
        mapGetMapInfoEx( lhMap, 1, &mgr, &lrg);
        double X1 = mapGetMapX1( lhMap);
        double Y1 = mapGetMapY1( lhMap);
        double X2 = mapGetMapX2( lhMap);
        double Y2 = mapGetMapY2( lhMap);
        qDebug() << QString( "default: (%1, %2) - (%3, %4)").arg( X1).arg( Y1).arg( X2).arg( Y2);

        HSELECT hsel = mapCreateMapSelectContext( m_hMap);
        mapSelectObject( hsel, -1, 1);
        long objMaxCount = mapSeekSelectObjectCount( m_hMap, hsel);
        if( objMaxCount == 0) objMaxCount = 1;
        if( true)//test readcopy from mapapi doc
        {
            long listCount = mapGetSiteListCount( m_hMap, m_hMap);
            for( long i = 1; i <= listCount; i++)
            {
                long objCountInList = mapGetSiteObjectCountInList( m_hMap, m_hMap, i);// mapGetObjectCount( m_hMap, i);
                for( long j = 1; j <= objCountInList; j++)
                {
                    HOBJ lObj = mapCreateObject( m_hMap, 1, 0, 0);;
                    QCoreApplication::processEvents();
                    if( mapReadObjectByNumber( m_hMap, m_hMap, lObj, i, j) == 0)
                    {
                        qDebug() << "mapReadObjectByNumber failed!";
                        return false;
                    }
                    else
                    {
                        if( mapChangeObjectMap( lObj, lhMap, lhMap) == 0)
                        {
                            qDebug() << "mapChangeObjectMap failed!";
                            return false;
                        }
                        else
                        {
                            if( mapCommitObject( lObj) == 0)
                            {
                                qDebug() << "FAULT on commit copy";
                                return false;
                            }
                        }
                        if( true)
                        {
                          double Xx1 = mapGetMapX1( lhMap);
                          double Yx1 = mapGetMapY1( lhMap);
                          double Xx2 = mapGetMapX2( lhMap);
                          double Yx2 = mapGetMapY2( lhMap);

                          if( ( fabs( Yx1 - Y1) > MAP_COORDINATE_THRESHOLD)
                                  || ( fabs( Xx2 - X2) > MAP_COORDINATE_THRESHOLD))
                          {                                                                                             //здесь я узнал о том, что причиной является рамка карты
                              qDebug() << QString( "Converted: (%1, %2) - (%3, %4)").arg( Xx1).arg( Yx1).arg( Xx2).arg( Yx2);
                              const char* oN ame = mapObjectName( lObj);
                              long excode = mapObjectExcode( lObj);
                              QTextCodec* codec = QTextCodec::codecForName( "KOI8-R");
                              QString sName = codec->toUnicode( oName);
                              qDebug() << "Broken:" << sName << "(" << excode << ");";
                          }
                        }
                    }
                    mapFreeObject( lObj);
                }
            }
        }
        mapSetRegion( lhMap);// не помогает
        mapCloseData( lhMap);
        return true;
    }
    else
    {
        qDebug() << "create map fault... :(";
        return false;
    }
} 
В отладке видно следующее:
X1=6134152,202184489
X2=6173078,6093562869
Y1=7404058,4855427258
Y2=7437071,3973564254

Xx1=6134152,202184489
Xx2=7457816
Yx1=332362
Yx2=7437071,3973564254

Пробовал создавать объект рамки в коде и вставлять её, наблюдал такую же картину. Не могу понять, что я делаю не так, вроде всё, как написано в документации.
Спасибо.
 
Немного не понял цель действий. Вы хотите изменить проекцию объектов карты, и оставить их в той же карте?
 
Цель действий - изменение исходной проекции Гаусса-Крюгера на Меркатора с созданием новой карты ессно, а не замене в текущей.
Кстати, забыл написать, что при запрете переноса рамки последующая попытка формирования матрицы высот приводит к получению сообщений об ошибке. Якобы отсутствуют объекты с абсолютной высотой. И карта высот не генерируется.
Изменено: Александр Лазарев - 11.01.2017 12:18:38
 
Судя по отсутствию дополнительных комментариев, я могу сделать вывод, что, по всей видимости, изложенный код корректен.
Хотелось бы конечно увидеть, что вопрос без внимания не оставлен, и что в ближайшее время проблема будет разрешена.
 
Здравствуйте!

Для корректного выполнения преобразования рекомендуется сначала заполнить информацию о районе работ исходя из типа карты с помощью функции mapRegisterFromMapType:
Код
 // Заполнение справочных данных в зависимости от типа карты
 // Структуры MAPREGISTEREX, LISTREGISTER описаны в mapcreat.h
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapRegisterFromMapType(int maptype, MAPREGISTEREX *mapreg);
Пример использования (для типа карты "Обзорно-географическая"):
Код
mapRegisterFromMapType(GEOGRAPHIC, &mgr);
mgr.MaterialProjection = MERCATORMAP;
 
Я пробовал такой вариант, он не работал. Проверил ещё раз - то же самое, тип карты выставлял TOPOGRAHIC.
 
Для более предметного обсуждения проблемы необходимо конкретизировать:
1) Тестовый пример для воспроизведения и данные.
Например:
- исходный код, описанный выше с конкретизацией параметров, чтобы мы имели идентичный «тест»;
- карта Подольска, входящая в инсталляцию.
2) Какие численные результаты работы функции ошибочны и по какой причине.
Спасибо!
Изменено: Александр Савелов - 17.01.2017 13:48:23
 
1. Я вам наваял тестовое приложение на базе приложенного выше кода. В состав архива закинул использованную карту подольска из состава дистрибутива.
Но здесь нет возможности прикрепить свой архив.
2. В окне приложения видно какие параметры отличаются и на каком элементе это происходит. А уж причину то я как раз и хочу выяснить.

Архив проекта
Изменено: Александр Лазарев - 17.01.2017 16:54:18 (Добавил внешний источник. Архив самоудалится через 10 дней после последнего скачивания.)
 
Ну, т.е. явных косяков, судя по всему, я там не написал. Правильно ли я понимаю? Какие-нибудь подвижки имеются?
Спасибо.
 
Здравствуйте!

В данном случае габариты карты не обновляются в паспорте (файлы .sit, .map). Для обновления габаритов в паспорте необходимо установить флаг FlagRealPlace в структуре MAPREGISTEREX (mapcreat.h):
Код
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++ "ФОРМУЛЯР РАЙОНА РАБОТ" ++++++++++++++++++++
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++

typedef struct MAPREGISTEREX
{
  ...
  int         FlagRealPlace          ; // Вид карты: 0 - MAP (многолистовая с рамками),
                                                  // 1 - SIT (безразмерный лист), 2 - SITX (один файл), -1 - SIT c рамкой, -2 - SITX с рамкой
  ...
}
  MAPREGISTEREX;

Пример:
Код
mapRegisterFromMapType( GEOGRAPHIC, &mgr);
mgr.MaterialProjection = MERCATORMAP;
mgr.FlagRealPlace = 1;

QString newFileName = "/tmp/podolsk_test/podolsk.map";
if( writeLocalMapTo( mapCreateMapEx( newFileName.toLatin1().data(), rscName, &mgr, &lrg)))
      return true;
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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