Добрый день!
Функцию [URL=http://help.gisinfo.ru/showresult.php?file=sitapi.htm&search=mapPutMapPassportRecord#1]mapPutMapPassportRecord[/URL] можно использовать, когда у Вас есть в двоичном виде параметры паспорта карты.
Пустой буфер передать нельзя.
Для создания карты лучше использовать
Скрытый текст |
---|
[CODE] // Создать новую векторную карту // 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 // Возвращает идентификатор открытой векторной карты // При ошибке возвращает ноль
_MAPIMP HMAP _MAPAPI mapCreateMapExp(const WCHAR * mapname, const WCHAR * rscname, MAPREGISTEREX * mapreg, LISTREGISTER * listreg, SHEETNAMES * sheetnames, const WCHAR * mainname, const WCHAR * password, long int size, long int * error, HMAP hmap, HSITE hsite);[/CODE] |
Если возникают трудности с заполнением структур справочных данных, можно их заполнить по коду EPSG (например, 4326):
Скрытый текст |
---|
[CODE] // Запросить параметры проекции и системы координат по коду EPSG // Если код EPSG задает геодезическую или геоцентрическую систему координат, // то устанавливается проекция Широта\Долгота и соответствующие // параметры эллипсоида и датум // Если код EPSG задает плоскую прямоугольную систему координат, // то все параметры устанавливаются из базы EPSG // epsgcode - код EPSG, для СК-42 зоны 2-32 : 28402-28432, для СК-95 зоны 4-32: 20004-20032 // mapreg - параметры системы координат и проекции // datum - параметры пересчета с эллипсоида рабочей системы координат к WGS84 // ellipsoid - параметры пользовательского эллипсоида для рабочей системы координат // Для геодезических систем координат возвращает 2, для геоцентрических - 3, // для плоских прямоугольных - 1 // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetParametersForEPSG(long int epsgcode, MAPREGISTEREX * mapreg,DATUMPARAM * datum, ELLIPSOIDPARAM * ellipsoid);[/CODE] |
или по типу карты:
Скрытый текст |
---|
[CODE] // Заполнение справочных данных в зависимости от типа карты // Структуры MAPREGISTEREX, LISTREGISTER описаны в mapcreat.h // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapRegisterFromMapType(int maptype, MAPREGISTEREX *mapreg);[/CODE] |
[QUOTE]
Алексей Аминодов-Борисов написал:
Насколько я понимаю, если основной карты нет (потому что не нужно), то hMap в аргументах можно указать 0.[/QUOTE]
Нет. Основная карта есть всегда. Эта та, что открыта первой (или единственной).
Для единственной открытой карты первые два параметра могут совпадать, либо можно не задать HSITE, но основная карта указывается всегда обязательно!
1. Создать экземпляр класса работы с объектом (по окончании использования не забыть mapFreeObject):
Скрытый текст |
---|
[CODE] // Cоздать пустой объект пользовательской карты // hMap - идентификатор открытой основной карты // hSite - идентификатор открытой пользовательской карты, в которой будет расположен // создаваемый объект (для первой карты равен hMap) // kind - формат метрики // text - признак метрики с текстом (для объектов типа "подпись") // pointcount - зарезервировать память под число точек (ускоряет первичное заполнение метрики из массива) // После вызова функций типа What...() и Seek...() все параметры // полученного объекта могут измениться (text,kind и т.п.) // Для каждого полученного и больше не используемого // идентификатора HOBJ необходим вызов функции mapFreeObject() // При ошибке возвращает ноль
_MAPIMP HOBJ _MAPAPI mapCreateSiteObjectEx(HMAP hMap, HSITE hSite, long int kind = IDDOUBLE2, long int text = 0, long int pointcount = 0); _MAPIMP HOBJ _MAPAPI mapCreateSiteObject(HMAP hMap, HSITE hSite, long int kind = IDDOUBLE2, long int text = 0);[/CODE] |
2. Зарегистрировать объект нужным кодом, например 112010010 с локализацией LOCAL_VECTOR (даже если потом условный знак переназначается через семантику КЭУЗ, этот шаг все равно лучше не игнорировать):
Скрытый текст |
---|
[CODE] // Сформировать описание нового объекта по внешнему коду и локализации // или изменить код существующего объекта на карте // info - идентификатор объекта карты в памяти // excode - внешний код объекта (числовой), // local - локализация (LOCAL_LINE, LOCAL_POINT...) // Обычно вызывается после mapCreateObject(...) и добавления семантики // (если она есть) // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapRegisterObject(HOBJ info, long int excode, long int local);[/CODE] |
3. Добавить и заполнить семантику:
Скрытый текст |
---|
[CODE] // Добавить новую характеристику в семантику объекта // info - идентификатор объекта карты в памяти // code - внешний код характеристики // value - адрес строки,содержащей новое значение // в символьном виде, числа с плавающей точкой могут иметь // разделителем только символ точка "." // size - длина добавляемой строки в байтах или ноль // Для семантики числового типа значения будут преобразовываться в двоичный вид // Если такая семантика была и она не повторяемая - значение заменяется // При успешном выполнении возвращает последовательный номер созданной характеристики // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapAppendSemantic(HOBJ info, long int code, const char * value, long int size);
// Добавить характеристику в семантику объекта в кодировке UTF-16 // info - идентификатор объекта карты в памяти // code - внешний код характеристики // value - значение характеристики в кодировке UTF-16 // size - длина добавляемой строки в байтах, если нужно добавить подстроку, // или ноль - размер будет определен автоматически до замыкающего нуля // Если текст содержит латинские символы от 0x0001 до 0x007E // или кириллицу (0x0400 - 0x045F) и на компьютере // установлена русская Windows (OEM 866 или 1251), то текст // автоматически запишется в ANSI, иначе строка сохранится в UTF-16 // Для семантики числового типа значения будут преобразовываться в двоичный вид // Если такая семантика была и она не повторяемая - значение заменяется // При успешном выполнении возвращает последовательный номер созданной характеристики // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapAppendSemanticUn(HOBJ info, long int code, const WCHAR * value, long int size);[/CODE] |
4. Заполнить метрику одной из функций:
Скрытый текст |
---|
[CODE] // Добавить в конец метрики объекта точку // info - идентификатор объекта карты в памяти // b,l - координаты точки в радианах в системе WGS84 // subject - номер подобъекта (если = 0, обрабатывается объект) // Возвращает номер добавленной точки в подобъекте (с 1) // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapAppendPointGeoWGS84(HOBJ info, double b, double l, long int subject);
_MAPIMP long int _MAPAPI mapAppendPointGeoWGS843D(HOBJ info, double b, double l, double h, long int subject);
// Добавить в конец метрики объекта точку // info - идентификатор объекта карты в памяти // x,y - координаты точки в метрах в системе координат документа // subject - номер подобъекта (если = 0, обрабатывается объект) // Для изменения координаты Н необходимо далее выполнить функцию SetHPlane(...) // Возвращает номер добавленной точки в подобъекте (с 1) // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapAppendPointPlane(HOBJ info, double x, double y, long int subject = 0);
// Добавить в конец метрики объекта точку в прямоугольной системе в метрах на местности в проекции карты // info - идентификатор объекта карты в памяти // x,y - координаты точки в метрах в системе координат документа // subject - номер подобъекта (если = 0, обрабатывается объект) // Для изменения координаты Н необходимо далее выполнить функцию SetHPlane(...) // Возвращает номер добавленной точки в подобъекте (с 1) // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapAppendMapPointPlane(HOBJ info, double x, double y, long int subject = 0);
// Добавить в конец метрики объекта точку // info - идентификатор объекта карты в памяти // x,y - координаты точки в метрах в системе координат документа // h - высота (абсолютная или относительная) в метрах // subject - номер подобъекта (если = 0, обрабатывается объект) // Тип высоты определяется функциями mapGetHeightType и mapSetHeightType // Возвращает номер добавленной точки в подобъекте (с 1) // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapAppendPointPlane3D(HOBJ info, double x, double y, double h, long int subject = 0);
// Добавить в конец метрики объекта точку и измерение (свойство) в точке // info - идентификатор объекта карты в памяти // x,y - координаты точки в метрах в системе координат документа // h - высота (абсолютная или относительная) в метрах // m - измерение в формате double (для типа метрики IDDOUBLE4) // f - измерение в формате __int64 (для типа метрики IDDOUBLE4F) // subject - номер подобъекта (если = 0, обрабатывается объект) // Тип высоты определяется функциями mapGetHeightType и mapSetHeightType // Возвращает номер добавленной точки в подобъекте (с 1) // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapAppendPointPlane4D(HOBJ info, double x, double y, double h, double m, long int subject); _MAPIMP long int _MAPAPI mapAppendPointPlane4F(HOBJ info, double x, double y, double h, __int64 f, long int subject); [/CODE] |
5. Сохранить объект:
Скрытый текст |
---|
[CODE] // Сохранить данные об объекте в карту // info - идентификатор объекта карты в памяти // isnewobject - признак записи нового объекта (аналог mapCommitObjectAsNew) // isload - признак записи объекта без пересчета семантики-формула (аналог mapCommitObjectForLoad) // isorder - признак записи объектов в порядке поступления (аналог mapCommitObjectByOrder) // error - код ошибки (см. maperr.rh) // Номер листа в районе должен быть установлен // Предыдущее состояние объекта сохраняется в резервных // файлах и может быть восстановлено // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapCommitObjectPro(HOBJ info, long int isnewobject, long int isload, long int isorder, long int * error); _MAPIMP long int _MAPAPI mapCommitObject(HOBJ info);[/CODE] |
6. Освободить экземпляр класса работы с объектом карты:
Скрытый текст |
---|
[CODE] // Удалить описание объекта векторной карты из памяти // info - идентификатор объекта карты в памяти // Для сохранения объекта на карте необходимо // до вызова mapFreeObject(...) выполнить функцию // mapCommitObject(...) // При ошибке возвращает ноль
_MAPIMP void _MAPAPI mapFreeObject(HOBJ info);[/CODE] |
[QUOTE]
Алексей Аминодов-Борисов написал:
А часть ключа в этом классификаторе, как известно, влияет на семантику и на внешний вид знака. Будет ли это работать?
P.P.S. Насколько я понимаю, в классификаторе operator.rsc за код КЭУЗ отвечает семантика 11525. Будет ли справедливым такой вывод, что для формирования знака достаточно передать в точечный объект эту семантику?[/QUOTE]
При установке корректного значения кода КЭУЗ в указанную семантику объект при сохранении будет автоматически перекодирован. Но, как говорилось выше, зарегистрировать объект всё же необходимо после создания (или очистки) объекта.
[QUOTE]
Алексей Аминодов-Борисов написал:
Кстати, какие должны быть kind и pointcount для векторного знака? Насколько я понимаю, pointcount = 2, a kind = IDDOUBLE2.[/QUOTE]
Размерность метрики можно не указывать при создании объекта. По умолчанию она будет установлена как IDDOUBLE2.
Векторный объект может иметь две или одну точку метрики. Если объект в классификаторе описан как не имеющий направления и не масштабируемый по метрике, то вторая точка, которая за это отвечает, не нужна.