Добрый день. Ситуация следующая у меня имеется набор карт в формате rsw с привязкой по координатам, которые я буду использовать как подложку. Каталог карт я реализовал как древовидный список т.е. Страна - Область - Город. Вопрос, пользователь допустим выбрал какой-то город и далее после открытия я хочу создать программно пользовательскую карту в формате sitx и наложить её поверх подложки. Есть ли возможность реализовать данный функционал? И какими API функции мне необходимы для реализации?
// Создать новую векторную карту // mapname - полное имя файла карты (MAP, SIT, SITX) // rscname - полное имя файла ресурсов (RSC) // Возвращает идентификатор открытой векторной карты // Структуры MAPREGISTEREX и LISTREGISTER описаны в mapcreat.h // sheetnames - название (UTF-16) листа карты, номенклатуры и файлов даных (для многолистовой карты), // для пользовательской карты (не ограниченной рамкой) название листа и номенклатуры совпадает, // а название файлов данных совпадает с названием паспорта карты // mainname - главное название (UTF-16) многолистовой карты (MAP), // для пользовательской карты совпадает с названием листа карты // (Запросить главное название карты можно функцией mapGetSiteNameUn) // password - пароль доступа к данным из которого формируется 256-битный код // для шифрования данных (при утрате пароля данные не восстанавливаются) // (поддерживается для карт с расширением SITX - хранилище в одном файле) или 0 // size - длина пароля в байтах (!) или 0 // hmap, hsite - идентификатор карты, из которой может быть скопирован пароль доступа к данным // error - поле для получения кода ошибки или 0; коды ошибок приведены в maperr.rh // После завершения использования карты необходимо освободить ресурсы функцией mapCloseData // Возвращает идентификатор открытой векторной карты // При ошибке возвращает ноль
Если все необходимые данные СК и проекции у вас корректно заполнены в rsw можно их использовать для создания карты. Для этого к уже открытому растру надо добавить новую пользовательскую карту:
Код
// Создать пользовательскую карту по открытой карте
// hmap - идентификатор открытых данных
// mapname - полное имя файла карты в кодировке UNICODE
// rscname - полное имя файла ресурсов в кодировке UNICODE
// Структура CREATESITEUN описана в maptype.h
// Возвращает идентификатор открытой пользовательской карты
// После завершения использования карты необходимо освободить ресурсы функцией mapCloseData
// При ошибке возвращает ноль
_MAPIMP HSITE _MAPAPI mapCreateAndAppendSiteUn(HMAP hmap, const WCHAR * mapname, const WCHAR * rscname,
CREATESITEUN * createsite);
hmap - идентификатор открытых данных (в данном случае Вашего растра)
Если карта нужна только на период работы приложения, можно создать временную пользовательскую карту (автоматически удаляется после закрытия):
Код
// Создать временную пользовательскую карту по открытой карте
// hmap - идентификатор открытых данных
// rscname - полное имя файла ресурсов, если равно 0 - выбирается
// из открытой карты
// inmemory - признак создания карты в оперативной памяти или 0
// Файлы карты размещаются в рабочей директории системы
// и имеют уникальные имена, генерируемые автоматически
// При закрытии пользовательской карты все файлы данных автоматически удаляются
// Если параметр inmemory не равен 0, то все данные хранятся только в оперативной памяти
// и освобождаются при закрытии карты
// Возвращает идентификатор открытой пользовательской карты
// При ошибке возвращает ноль
_MAPIMP HSITE _MAPAPI mapCreateAndAppendTempSitePro(HMAP hMap, const WCHAR *rscname, long int inmemory);
// Создать пользовательскую карту по открытой карте // hmap - идентификатор открытых данных // mapname - полное имя файла карты в кодировке UNICODE // rscname - полное имя файла ресурсов в кодировке UNICODE // Структура CREATESITEUN описана в maptype.h // Возвращает идентификатор открытой пользовательской карты // После завершения использования карты необходимо освободить ресурсы функцией mapCloseData // При ошибке возвращает ноль
Структура CREATESITEUN описана в maptype.h Если нет необходимости менять параметры системы координат и т.п., то проще воспользоваться функцией
// Создать пользовательскую карту по открытой карте // hmap - идентификатор открытой векторной карты // mapname - полное имя файла карты // rscname - полное имя файла ресурсов // issitx - признак создания карты типа SITX // При ошибке возвращает ноль
_MAPIMP HSITE _MAPAPI mapCreateAndAppendSiteForMapUn(HMAP hmap, const WCHAR* mapname, const WCHAR* rscname, long int issitx = 0);
Александр Махин написал: А если мне необходимо указать лишь масштаб. Тогда как?
Можно в этом случае создать карту по основной карте (тогда все параметры будут скопированы из основной карты в новую) - с помощью mapCreateAndAppendSiteForMapUn, а затем просто изменить базовый масштаб новой карты:
Цитата
// Изменить базовый масштаб пользовательской карты // hMap - идентификатор открытой основной карты // hSite - идентификатор открытой пользовательской карты // При отображении в базовом масштабе пользовательской карты // размер условных знаков на карте будет соответствовать их размеру // в классификаторе RSC // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapSetSiteScale(HMAP hMap, HSITE hSite, long int scale);
Если хотите заполнить все параметры для создаваемой карты самостоятельно, то считать их из основной карты (или растра) можно с помощью:
Цитата
// Запросить паспортные данные векторной карты // Структуры MAPREGISTER и LISTREGISTER описаны в mapcreat.h // hmap - идентификатор открытых данных // sheetnumber - номер листа карты для // которого запрашиваются паспортные данные // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetMapInfoPro(HMAP hmap, long int sheetnumber, MAPREGISTEREX *map, LISTREGISTER *sheet, SHEETNAMES * sheetnames); _MAPIMP long int _MAPAPI mapGetMapInfoEx(HMAP hmap, long int sheetnumber, MAPREGISTEREX *map, LISTREGISTER *sheet);
После чего по полученным данным заполнить структуру CREATESITEUN и воспользоваться mapCreateAndAppendSiteUn.
Либо, используя полученные параметры (скорректировав их при необходимости), можно создать новую карту как SIT или SITX (см. MAPREGISTEREX.FlagRealPlace), закрыть её и затем добавить к основной:
Скрытый текст
Цитата
// Создать новую векторную карту // mapname - полное имя файла карты (MAP, SIT, SITX) // rscname - полное имя файла ресурсов (RSC) // Возвращает идентификатор открытой векторной карты // Структуры MAPREGISTEREX и LISTREGISTER описаны в mapcreat.h // sheetnames - название (UTF-16) листа карты, номенклатуры и файлов даных (для многолистовой карты), // для пользовательской карты (не ограниченной рамкой) название листа и номенклатуры совпадает, // а название файлов данных совпадает с названием паспорта карты // mainname - главное название (UTF-16) многолистовой карты (MAP), // для пользовательской карты совпадает с названием листа карты // (Запросить главное название карты можно функцией mapGetSiteNameUn) // password - пароль доступа к данным из которого формируется 256-битный код // для шифрования данных (при утрате пароля данные не восстанавливаются) // (поддерживается для карт с расширением SITX - хранилище в одном файле) или 0 // size - длина пароля в байтах (!) или 0 // hmap, hsite - идентификатор карты, из которой может быть скопирован пароль доступа к данным // error - поле для получения кода ошибки или 0; коды ошибок приведены в maperr.rh // После завершения использования карты необходимо освободить ресурсы функцией mapCloseData // Возвращает идентификатор открытой векторной карты // При ошибке возвращает ноль
// Закрыть все данные электронной карты // hmap - идентификатор открытых данных // Идентификатор HMAP становится недействительным !
_MAPIMP void _MAPAPI mapCloseData(HMAP hMap);
// Добавить данные к открытой карте (карту, растр, матрицу) // hMap - идентификатор открытых данных // name - имя открываемого файла (MAP, SIT, MTW, MTQ, RSW, MPT) // mode - режим чтения/записи (GENERIC_READ, GENERIC_WRITE или 0) // Возвращает идентификатор типа данных (FILE_MAP - для векторной // карты, FILE_RSW - для растра, FILE_MTW - для матрицы, FILE_MTL - для // матрицы слоев, FILE_MTQ - для матрицы качеств), данные добавляются в // список последними, если данные уже были открыты, число открытых данных // (карт, растров, матриц) не меняется // transform - признак трансформирования пользовательской карты // к ранее открытым данным (если проекции разные): // 0 - не трансформировать данные (преобразовывать "на лету"), // 1 - трансформировать данные при открытии и сохранить карту // в новой проекции, // -1 - задать вопрос пользователю. // В серверной версии (-1) обрабатывается, как 0. // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapAppendData(HMAP hMap, const char *name, long int mode = 0); _MAPIMP long int _MAPAPI mapAppendDataEx(HMAP hMap, const char *name, long int mode = 0, long int transform = -1);
Цитата
Александр Махин написал: Я пишу на C# c использованием GisToolKit Free ActiveX 14.0.3.0
Посмотрите пример использования компонентов для создания карт: \GIS ToolKit Active Free 14\Example\MS2015\C#\Newmap\Newmap.sln