Владимир Егоров,по идее так должно быть, с этим я благодаря Вам разобралась. Но пока у меня метод mapCreateAndAppendSiteForMap возращает 0. Причем идентификатор карты я получаю корректно, не равен 0.[TABLE][TR][TH][/TH][/TR][/TABLE]
Цитата
[TABLE][TR][TH]Цитата[/TH][/TR][TR][TD]Также пока не ясно, как сохранить пользовательскую карту с уже добавленными объектами?[/TD][/TR][/TABLE]Сохранить - в каком смысле? Скопировать куда-то ?
Я имею ввиду следующее. 1 шагом я физически создаю пользовательскую карту (по уже открытой карте), далее я на нее добавляю необходимые объекты и мне необходимо, чтобы потом другой пользователь мог открыть мою карту и наложить поверх своей и увидеть соответствующую обстановку (добавленные мной объекты).
Как я поняла, имея HSITE я могу добавить объекты на вновь созданную карту след. образом
Верно? Мне необходимо, чтобы при закрытии ПО эти объекты остались на этой карте.
Цитата
Под сохранить Вы наверное имеете в виду закрыть (mapCloseSIteForMap), потом физически его куда-то скопировать, и в другом месте другой пользователь должен его открыть уже с помощью mapOpenSiteForMap. Только главная карта должна быть такой-же. Ну или хотя бы в той же системе координат и на тот же район, а то у вас этот Sit улетит куда-то в тартарары наверное.
Может имена я как-то не корректно задаю mapName и rscName? Это ведь не созданные еще файлы и физически их нет на диске о момента отработки этого метода. Кстати, такой вопрос, а файл ресурсов (*.rsc) в результате выполнения данного метода mapCreateAndAppendSiteForMap копируется целиком с базовой карты? Т.е все коды объектов совпадают?
У Вас классификатор по этому пути лежит ? Классификатор, указываемый в mapCreateAndAppendSiteForMap используется для создания пользовательского слоя.
То есть: 1) Берётся главная карта, из неё берётся Система координат главной карты. 2) Берётся классификатор, указанный третьим параметром в mapCreateAndAppendSiteForMap 3) Если папка, указанная в пути к создаваемому слою существует, если существует классификатор, переданный третьим параметром, то внутри указанной папки создаётся пользоватеский слой (layer1.sit файл и сопутствующие ему файлы), туда копируется указанный классификатор. При этом пользовательский слой будет безразмерным, с системой координат как в главной карте, а габариты слоя будут меняться при добавлении объектов на слой.
Ура!!!! Получилось! Владимир Егоров спасибо Вам за помощь! С первым разобралась с Вашей помощью, теперь буду добавлять объекты на новую карту и проверять, как потом моя обстановка будет открываться. Надеюсь с этим вопросов не будет, хотя не уверенна(
Действительно, получается, я не верно задавала имя файла ресурсов. Изначально я думала, что я должна указать имя файла ресурсов, который должен быть создан (т.е я задавала имя файла которого еще нет), а сейчас я указала имя файла файла ресурсов уже который есть (т.е ресурсы основной карты).
Эх, в документации как-то не однозначно написано какие параметры задавать у данного метода. // Создать пользовательскую карту по открытой карте // hmap - идентификатор открытой векторной карты // mapname - полное имя файла карты // rscname - полное имя файла ресурсов // issitx - признак создания карты типа SITX // При ошибке возвращает ноль
Sit карта после создания пустая - на неё нужно добавлять объекты из классификатора, указанного при создании. Это пользовательская карта, слой, обстановка - часто используется для нанесения некоторых объектов из конкретного классификатора поверх основной карты. Про копирование Вам уже писали ранее :
Цитата
Александр Савелов: Вы можете использовать функцию mapCopySite, чтобы скопировать карту именно физическим переносом файлов на диске. Вероятно, Вам лучше подойдет следующий алгоритм: - создать новую карту (описано ранее); - скопировать объекты со старой карты на новую с помощью функции mapReadCopyObject (mapapi.h).
Пример реализации копирования объектов можно посмотреть в п.3.6.27 "Копирование объектов на другую карту с изменением системы координат" Руководства программиста (http://gistoolkit.ru/download/doc/gisdesigner_prog.pdf)
А можете еще скоординировать, как добавлять на пользовательскую карту объекты. Как я ранее делала не работает. Как мне получить идентификатор созданной ранее пользовательской карты?
HOBJ hObj = mapCreateSiteObject(hmap, hsite, IDDOUBLE2); // создаём пустой объект на карте (контейнер)
std::cout<<"hObj = "<<hObj<<std::endl;
mapRegisterObject(hObj, 10092, LOCAL_POINT);
mapAppendPointPlane(hObj, 6170267, 7411269, 0);
mapCommitObject(hObj); // записываем на карту
mapFreeObject(hObj); // освобождаем контейнер
ui->viewMap->Repaint();
Но на саму карту он не добавляется. Я этого не вижу. Хотя результат работы методов не равен 0.
В результате работы данного кода объекты добавляются на основную карту и сохраняются на ней, а мне необходимо, чтобы они на пользовательской карте сохранялись.
По идее в методе mapCreateSiteObject я указываю hSite (идентификатор открытой пользовательской карты в которой будет расположен создаваемый объект), как раз-таки созданной карты.
// Запросить количество объектов в пользовательской карте
// hMap - идентификатор открытой основной карты
// hSite - идентификатор открытой пользовательской карты
// При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetSiteObjectCount(HMAP hMap, HSITE hSite);
// Запросить количество объектов в пользовательской карте, исключая удаленные
// hMap - идентификатор открытой основной карты
// hSite - идентификатор открытой пользовательской карты
// При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetSiteRealObjectCount(HMAP hMap, HSITE hSite);
// Выбор объекта по номеру листа и последовательному номеру объекта
// (прямой доступ к объекту без перебора)
// hMap - идентификатор открытой карты,
// hSite - идентификатор открытой пользовательской карты,
// info - идентификатор существующего объекта,
// в котором будет размещен результат поиска;
// list - номер листа (для пользовательской карты всегда 1);
// object - последовательный номер объекта в листе
// (начиная с 1 до mapGetObjectCount(...) или mapGetSiteObjectCount(...)).
// Если объект имеет признак "удален" - возвращает 1 !
// При успешном выполнении возвращает значение info.
// При ошибке возвращает ноль
_MAPIMP HOBJ _MAPAPI mapReadObjectByNumber(HMAP hMap, HSITE hSite, HOBJ info,
long int list, long int object);
Лучше так проверять сколько каких объектов у вас на пользовательской карте. Почему он не виден - я не знаю. Может семантик не хватает или ещё чего. То что объект не виден ещё не означает что объекта нет на пользовательской карте.
И почему Вы решили что он на основной карте добавился ?