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

MAPAPI - как открыть *.sit файл, если нет *.map файла

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
MAPAPI - как открыть *.sit файл, если нет *.map файла
 
Добрый день, есть набор файлов, представляющих карту.

m50.sit
m50.shd
m50.sda
m50.sse
m50.rsc

Мне необходимо открыть m50.sit и получить его HSITE для дальнейшей работы через API. Как это сделать? В заголовочнике sitapi.h есть только функции mapOpenSiteForMap, которые требуют в интерфейсе HMAP уже открытой карты, но карты MAP у меня нет.
 
Функция mapOpenSiteForMap используется в случаях, когда одна карта уже открыта одной из функций ниже.
При открытии первой карты получается идентификатор HMAP (он же используется в качестве HSITE).

 // Открыть данные с автоматическим определением их типа
 // (векторные,растровые,матричные...)
 // name - имя открываемого файла (MAP, SIT, MTW, RSW, MPT) в кодировке UNICODE
 // mode - режим чтения/записи (GENERIC_READ, GENERIC_WRITE или 0)
 // GENERIC_READ - все данные только на чтение, при этом не открываются
 // файлы \Log\name.log и \Log\name.tac - протокол работы и журнал транзакций
 // error - после выполнения функции переменная содержит код ошибки
 //        (когда HMAP равен 0) или 0; коды ошибок приведены в maperr.rh
 // password - пароль доступа к данным из которого формируется 256-битный код
 //            для шифрования данных (при утрате пароля данные не восстанавливаются)
 // size     - длина пароля в байтах !!!
 // Передача пароля необходима, если при создании карты он был указан.
 // Если пароль не передан, а он был указан при создании,
 // то автоматически вызывается диалог scnGetMapPassword из mapscena.dll (gisdlgs.dll)
 // Если выдача сообщений запрещена (mapIsMessageEnable()), то диалог
 // не вызывается, а при отсутствии пароля происходит отказ открытия данных
 // При ошибке возвращает ноль

_MAPIMP HMAP _MAPAPI mapOpenAnyDataPro(const WCHAR *name, long int mode,
                                      long int *error,
                                      const WCHAR *password, long int size);

_MAPIMP HMAP _MAPAPI mapOpenAnyData(const WCHAR *name, long int mode = 0,
                                   long int *error = 0);

_MAPIMP HMAP _MAPAPI mapOpenDataUn(const WCHAR * name, long int mode = 0);

 // Открыть векторные данные (аналогично mapOpenData)
 // Возвращает идентификатор открытой векторной карты
 // mapname - имя файла карты MAP(многолистовая), SIT (пользовательская),
 //           SITX (хранилище данных с поддержкой шифрования данных)
 // mode - режим чтения/записи (GENERIC_READ, GENERIC_WRITE, или 0)
 // GENERIC_READ - все данные только на чтение, при этом не открываются
 // файлы \Log\name.log и \Log\name.tac - протокол работы и журнал транзакций
 // password - пароль доступа к данным из которого формируется 256-битный код
 //            для шифрования данных (при утрате данные не восстанавливаются)
 // size     - длина пароля в байтах !!!
 // Передача пароля необходима, если при создании карты он был указан.
 // Если пароль не передан, а он был указан при создании,
 // то автоматически вызывается диалог scnGetMapPassword из mapscena.dll (gisdlgs.dll)
 // Если выдача сообщений запрещена (mapIsMessageEnable()), то диалог
 // не вызывается, а при отсутствии пароля происходит отказ открытия данных
 // При ошибке возвращает ноль

_MAPIMP HMAP _MAPAPI mapOpenMapPro(const WCHAR *name,long int mode,
                                  const WCHAR *password, long int size);
_MAPIMP HMAP _MAPAPI mapOpenMapUn(const WCHAR *mapname, long int mode = 0);
 
Я пытаюсь перенести объект с одной карты на другую, уже существующую (m50.sit), но у меня ни чего не получается. Я думал это из-за того, что я как то не правильно открываю HSITE, но видимо это не так.
Посмотрите, пожалуйста, код ниже:
const int sheet_number = 1;
Код
HMAP  hmap_src  = mapOpenMap(src_map_path.c_str(), GENERIC_READ);
HOBJ  hobj      = mapCreateObject(hmap_src);
HSITE hsite_dst = mapOpenMap(dst_map_path, GENERIC_WRITE);

const int objcount = mapGetObjectCount(hmap_src, sheet_number);

for (int i = 0; i < objcount; i++)
{
    if (0 != mapReadObjectByNumber(hmap_src, hmap_src, hobj, sheet_number, i))
    {
        if (0 != mapChangeObjectMap(hobj, hmap_src, hsite_dst))
        {
            mapCommitObject(hobj);
        }
    }

} 
mapChangeObjectMap возвращает 0.
Каким образом понять что именно не так? Есть ли какая то возможность получить код ошибки?
Изменено: Александр Волков - 10.01.2018 14:36:02
 
Должно быть не mapChangeObjectMap(hobj, hmap_src, hsite_dst), а mapChangeObjectMap(hobj, hsite_dst, hsite_dst)
 
спасибо! не уловил это из документации! Вопрос решен.
Остался только один маленький, есть ли какой то аналог getlasterror? чтобы можно было хоть что то понять, что именно делаешь не так )
 
Для данной функции коды ошибок не формируются.
Тут могут быть 2 проблемы:
1) на входе неполный объект (нет метрики),
2) на выходе не найдена карта (Ваш случай: hsite_dst нет в hmap_src).
 
Цитата
Oleg Belenkov написал:
Для данной функции коды ошибок не формируются.
Тут могут быть 2 проблемы:
1) на входе неполный объект (нет метрики),
2) на выходе не найдена карта (Ваш случай: hsite_dst нет в hmap_src).
спасибо
Страницы: 1
Читают тему (гостей: 1)



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

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