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

Объединение карт

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

Стоит задача создания непрерывного перехода при движении по картам из коллекции.
По результатам экспериментов возник вопрос, предназначена ли среда Панорамы для такой работы?
Рассматривается два варианта, пришедших в голову:
1. Создание временной карты в фоне с подгрузкой объектов соседних районов в общую карту ( классификаторы одинаковые)
2. Загрузка соседних карт в виде пула HMAP объектов с отрисовкой на экране видимых областей.
----------------------------------------------------------------------------------------------------------
При экспериментах над п.1. пришлось столкнуться с тем, что
Код
// обобщённое описание процесса объединения карт
    HMAP tmpMap = mapOpenMap( rscMaxName.toLatin1().data(), GENERIC_READ);
...
    mapGetMapInfoEx( tmpMap, 1, &mgr, &lrg);
...
    mapCloseMap( tmpMap);
...
    mgr.MaterialProjection = MERCATORMAP;//localToMapProjection( ccm.m_proj);
    mgr.EllipsoideKind = localToMapEllipsoid( ccm->m_ellips);
    mgr.HeightSystem = localToMapHeight( ccm->m_height);
    mgr.FlagRealPlace = 0;
    mgr.MapType = MERCATOR;
    mgr.CoordinateSystem = GEOCOORDINATE;
    mgr.ZoneNumber = 0;
...
    nextMap = mapCreateMapEx( compileMapName.toLatin1().data(), compileRscName.toLatin1().data(), &mgr, &lrg);
...
    //копирование объектов в целевую карту
...
    mapSetRegion( nextMap);
при задании различных (проекций)/(типов карты) конечного файла обобщённая карта перестаёт отображаться или же процесс отрисовки сопровождается проблемами рендеринга, при которых общая перерисовка всей области производится нормально, в то время как малые части со стороны присоединения к базовой карте не отрисовываются при соответствующих движениях.

Вопросы:
1. Можно ли объединять карты в общую копированием объектов из одной карты в другую и каким образом это лучше всего делать?
2. Какие параметры проекции карты, типа карты, системы координат совместимы/несовместимы для объединения копированием?
3. При работе с несколькими HMAP они будут отрисовываться с дырками между картами или же этого можно избежать?

Спасибо.
С уважением,
Лазарев Александр
 
Здравствуйте!

Следующие моменты могут оказаться полезными при реализации Вашей задачи:
(в тексте используются ссылки на документ "ГИС Панорама. Руководство программиста": http://gistoolkit.ru/download/doc/mapapi.pdf)
- можно выбрать одну карту в качестве базовой и добавлять остальные карты к ней (п. 4.2.1 "Открытие и закрытие карт");
- для оптимизации можно использовать "ленивое открытие": добавлять карту, только если она попала в зону видимости;
- если проекция добавляемой карты отличается от проекции базовой, она будет трансформирована "на лету" к проекции базовой карты;
- при работе с большим числом карт в памяти будут находиться только те данные, которые необходимы в данный момент для отрисовки.
 
Цитата
Александр Савелов написал:
Здравствуйте!

Следующие моменты могут оказаться полезными при реализации Вашей задачи:
(в тексте используются ссылки на документ "ГИС Панорама. Руководство программиста":  http://gistoolkit.ru/download/doc/mapapi.pdf )
- можно выбрать одну карту в качестве базовой и добавлять остальные карты к ней (п. 4.2.1 "Открытие и закрытие карт");
- для оптимизации можно использовать "ленивое открытие": добавлять карту, только если она попала в зону видимости;
- если проекция добавляемой карты отличается от проекции базовой, она будет трансформирована "на лету" к проекции базовой карты;
- при работе с большим числом карт в памяти будут находиться только те данные, которые необходимы в данный момент для отрисовки.
Спасибо, я сделал так как вы предложили и оно заработало, но:
1. В описании в заголовочном файле нет указаний на поддержку кодгрузки map, это нужно исправить, скорее всего.
 
Здравствуйте!

Описание функций уточнили - обновленные файлы войдут в следующую версию ГИС Конструктор. Спасибо!
 
Столкнулся с проблемой специфического толка:
Функцией ImportFromAnySxf я устанавливаю в свою коллекцию карты и добавляю их к текущему отображению функцией mapAppendDataEx.
В момент необходимости удаления части карт я открываю временную (закрыв предыдущий HMAP и открыв новый). Карты после этого удаляю простым стиранием в файловой системе.
Если после этих манипуляций я пытаюсь снова установить данные из архива, соответствовавшего ранее удалённым файлам, командой ImportFromAnySxf, то получаю следующий результат:
1. папка с заданным путём создаётся нормально
2. классификатор копируется, а сама карта не создаётся.
3. от Панорамы идут сообщения такого вида: "Ошибка создания файла" [имя файла результата карты] "Файл или каталог не существует"
 
Здравствуйте!

Вы не могли бы уточнить - в чем будет заключаться разница при вызове ImportFromAnySxf до удаления карты из коллекции и после.
Если это возможно, прикрепите, пожалуйста, небольшой пример вызова ImportFromAnySxf, который приводит к некорректному поведению программы.
 
Цитата
Александр Савелов написал:
Здравствуйте!

Вы не могли бы уточнить - в чем будет заключаться разница при вызове ImportFromAnySxf до удаления карты из коллекции и после.
Если это возможно, прикрепите, пожалуйста, небольшой пример вызова ImportFromAnySxf, который приводит к некорректному поведению программы.
В том то и проблема, что вызов используется один и тот же с абсолютно теми же параметрами и разница лишь в том, что при первом вызове и отображении всё импортируется, а при втором уже не может.
У меня сложилось впечатление, что имена установленных подгруженных карт сохраняются в кэше библиотеки и при попытке установить карты, которые соответствуют уже загруженным (по мнению библиотеки), мне и сообщается об ошибке.
Код
if( ImportFromAnySxf( 0, sxfName,
                         rscName,
                         mapName,
                         mapName.length(), 
                         (MSGHANDLER)&msgImportHandler, 0) == 0) { сообщение об ошибке }

msgImportHandler - пустышка без какого-либо серьёзного функционала
 
Возможно, при удалении карты производится удаление и каталога, в котором она находилась.
ImportFromAnySxf ожидает, что каталог, в которой будет производится импорт, уже создан. Это может быть причиной ошибки "Файл или каталог не существует".
 
Цитата
Александр Савелов написал:
Возможно, при удалении карты производится удаление и каталога, в котором она находилась.
ImportFromAnySxf ожидает, что каталог, в которой будет производится импорт, уже создан. Это может быть причиной ошибки "Файл или каталог не существует".
Перед установкой карты путь создаётся вручную и это всё видно в процессе установки.
Вот кусок кода обработки без редактуры:
Код
                        QString mapName = fliInt.absolutePath() + "/" + pureNomNames.at( k - 2);//dir
                        QDir dr( mapName);
                        dr.mkdir( mapName);
                        mapName += "/" + pureNomNames.at( k - 2) + ".map";
                        if( ImportFromAnySxf( 0, nomNames.at( k - 2).toLatin1().data(),
                                              m_rscName.at( i).toLatin1().data(),
                                              mapName.toLatin1().data(), mapName.length(), (MSGHANDLER)&msgImportHandler, 0) == 0)
                        {
                            if( m_supervisor != NULL)
                                m_supervisor->actionInfo( eventInfo::BE_WR_BROKENMAP, MessageStack::instance().translate( eventInfo::BE_WR_BROKENMAP));
                        }

Изменено: Александр Лазарев - 18.08.2017 12:57:58
 
Для уточнения причины проблемы предлагаю упростить тестовый пример и сделать его общим.
Исходя из описания я использовал следующий простой пример:
Код
  char *sxfPath = getenv("SXF_PATH");
  assert(sxfPath != NULL);

  char *rscPath = getenv("RSC_PATH");
  assert(rscPath != NULL);

  char outPath[MAX_PATH_LONG];  outPath[0] = 0;
  StrCopy(outPath, "/tmp/out/out.sitx", sizeof(outPath));

  long isImported = ImportFromAnySxf(0, sxfPath, rscPath, outPath, sizeof(outPath), NULL, 0);
  assert(isImported != 0);

  // Удаление содержимого каталога /tmp/out

  isImported = ImportFromAnySxf(0, sxfPath, rscPath, outPath, sizeof(outPath), NULL, 0);
  assert(isImported != 0);
На данном тексте поведение функции ImportFromAnySxf корректно. Уточните, пожалуйста, соответствует ли это Вашему случаю?
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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