. Oleg Belenkov (Все сообщения пользователя)
Oleg Belenkov (Все сообщения пользователя)

Oleg Belenkov (Все сообщения пользователя)

Большинство функций, работающих с координатами, принимают и выдают значения в системе документа.Изначально система документа соответствует первой открытой карте.Ее можно изменить через вызов mapSetDocProjection.Если первой открыта карта в СК-42, то и все функции работают в СК-42.

Ошибка возникает в 7 знаке по долготе в градусах. Это соотвествует нескольким миллиметрам на местности.Она может возникать за счет пересчета датума с одной карты на другую (если в паспорте разные параметры датума)и за счет пересчета геодезических координат в плоские прямоугольные (обычно возрастает при выходе за границы зоны топокарты).

Функции mapGetMapPlanePoint, mapUpdateMapPointPlane работают в системе координат карты в метрах, что исключает любые искажения.

Формат SIT состоит из многих файлов.Подробнее здесь -[URL=https://gistoolkit.com/download/doc/mapapi.pdf]https://gistoolkit.com/download/doc/mapapi.pdf[/URL]

раздел 2.3 Структура пользовательских векторных карт

Возможно скопировали не все файлы карты.

Формат SITX всю карту хранит в одном файле.

Для импорта SXF можно применить функцию -[CODE] // Загрузить (импортировать) карту из файла SXF, TXF или DIR с // использованием Select с преобразованием топокарты к зоне документа // Файлы SXF и TXF могут хранить координаты в метрах, радианах или градусах // hmap - идентификатор открытой карты (рекомендуется указывать // для определения текущей зоны топокарты) или 0; // sxfname - имя загружаемого файла типа SXF, TXF или DIR; // rscname - имя файла классификатора, с которым загружается карта, // имя классификатора можно запросить из SXF (TXF) функцией GetRscNameFromSxf // или из карты; для файла DIR может быть 0; // mapname - имя создаваемой карты (обычно совпадает с именем SXF (TXF)) // или ноль или указатель на пустую строку (буфер размером MAX_PATH // c нулевым байтом равным нулю) или указатель на папку для размещения // карты. Если имя карты не задано или задана только папка, то карта // создается с именем SXF (TXF) и расширением ".sit". Если namemap // указывает на буфер достаточной длины (size), то в буфер записывается // имя созданной карты; // Для файла DIR тип общей карты - MPT (проект данных, включающий все // открытые карты из DIR) или MAP (многолистовая карта); // size - длина буфера, на который указывает переменная namemap, или 0. Обычно длина // равна MAX_PATH_LONG (1024); // handle - идентификатор окна диалога, которому посылаются уведомительные // сообщения (HWND для Windows, CALLBACK-Функция для Linux); // select - фильтр загружаемых объектов и слоев, если необходима выборочная // обработка данных; // frscfromsxf - значение флажка "разрешить использование // имени классификатора, указанного в файле sxf" // typesit - тип создаваемых карт в проекте MPT при импорте DIR (1- SIT; -1- SITX) // password - пароль для создания защищенного хранилища карты (SITX) // psize - длина пароля в байтах // transform - признак необходимости трансформировать загружаемую карту в систему координат hmap // (если hmap и transform не равно 0) // hevent - адрес функции обратного вызова для записи в протокол ошибок выполнени программы // eventparam - первый параметр функции обратного вызова // Для добавления открытой карты в документ необходимо вызвать функцию // mapAppendData(hmap, namemap). Если mapname содержит имя карты типа MAP и // она содержит хотя бы один лист, то при импорте данных выполняется создание // нового листа в карте MAP. В этом случае функция mapAppendData не должна вызываться. // При ошибке возвращает ноль

_VECIMP long int _VECAPI ImportFromAnySxfProEx(HMAP hmap, const WCHAR * namesxf, const WCHAR * namersc, WCHAR * namemap, long int size, HMESSAGE handle, HSELECT select, long int frscfromsxf, long int typesit, const WCHAR * password, long int psize, long int transform, EVENTLOG hevent, void * eventparam);[/CODE]Исходный код программы чтения SXF приведен в SDK -

Делаю предположение.Геодезическая задача ищет точку по кратчайшему расстоянию на дуге.Далее заменяем дугу прямыми линиями и берем пересечение.

Я бы предложил строить ортодромию с набором точек с шагом в 1 км, например.И уже искать пересечение для полученных объектов.Точность будет выше (в пределах 1 км, соответственно). [CODE]// Построение ортодромии // first - координаты первой точки в радианах // second - координаты второй точки в радианах // array - адрес массива координат построенной ортодромии, // размер массива равен count // count - количество точек для построения ортодромии (если точки размещены ближе 10-6 радиан, заполняет 2 точки) // Возвращает заполненное число точек в массиве // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapOrthodrome(DOUBLEPOINT * first, DOUBLEPOINT * second, DOUBLEPOINT * array, long int count);[/CODE]

Обсуждения похожей задачи:

[URL=https://gistoolkit.com/download/doc/preprintdoc.pdf]https://gistoolkit.com/download/doc/preprintdoc.pdf[/URL]Глава 13 ФОРМИРОВАНИЕ ФАЙЛОВ POSTSCRIPT И PDF

Контур отображается в порядке следования точек.Сначала все точки объекта (нулевой подобъект), затем точки первого подобъекта, затем точки второго подобъекта. Это справедливо для любого объекта.

Для разграничительных линий в каждой точке рисуется полуокружность слева по ходу линии.Если подобъектов нет, то все точки имеют левую полуокружность.Если за последней точкой подобъекта есть следующий подобъект ("разрыв" линии, хотя координаты первой точки следующего подобъекта должны совпадать с последней точкой предыдущего),то полуокружность отображается как правая.

Пример есть на тестовой карте в составе ГИС Оператор -. \Operator13\data\RedExample\battalion red\BattalionRed.sitx

В данном случае нулевой подобъект имеет 1 точку (сразу разрыв - правая полуокружность), затем первый подобъект из 3 точек (на второй точке левая полуокружность),затем третий подобъект из 1 точки (разрыв - правая полуокружность). Линия на рисунке идет справа налево.

[IMG WIDTH=1773 HEIGHT=683]https://public.gisinfo.ru/Forum/razgranliniya.png[/IMG]

Обновили тексты в semdef.cpp и semdef.h.Добавлен класс для формирования записи семантики - TSemanticRecord

for (int i = 1; i <= 10; i++)

if (semcount == 0) return 0;

return 1;>[/CODE]Вызов функции выглядит так:[CODE] case IMG_BARCHART10VALUE: [/CODE]Тексты обновлены в архиве sdk14.zip

Архив для Linux будет обновлен позже.Тексты ядра (включая semdef.cpp) являются общими для всех платформ.

[QUOTE]Илья Аникин написал: [QUOTE][URL=/forum/user/7/]Oleg Belenkov[/URL] написал:Примеры формирования есть в коде IMLAPI (см. sdk13.zip\imlapi)s57navy\imlmain.cpp Код_IMLIMP long int _IMLAPI imlPaintExampleEx(long int type, const IMGDRAW * parm, const IMGCONTEXT * context, HRSC hrsc, const char * semantic) . POLYDATAEX data;

data.Semantic = (char*)semantic;[/QUOTE] Насколько я понял, в вашем пример берется конкретная семнатика < 0xFF, 0x7F, 16. >. Откуда мне взять все эти циферки для семантики, которая интересует меня "Гос. принадлежность" код 1300?[/QUOTE]

Если нужно отрисовать в окошке отдельно реальный объект с учетом его семантик, то функции типа PaintExample не для этого.Если нужен пример знака, но с учетом некоторых семантик, то нужно задать запись семантики.Для ее формирования есть классы, описанные в sdk14.zip\include\semdef.h и mapsem.h. Реализация в sdk14.zip\mapacces\semdef.cpp и mapsem.cpp.

В sdk14.zip\imlapi\shape\shapesq.cpp есть пример заполнения семантик для отрисовки примера знака (Круговая диаграмма),с учетом кодов семантик, заданных в описании знака:[CODE]// --------------------------------------------------------// Заполнить запись семантики для отрисовки примера знака// --------------------------------------------------------int GetPieChart10Semantic(TLongString& buffer, const IMGDRAW* draw) [/CODE]В данном случае семантики типа Целое число (4 байта). Это не универсальный пример.

Для универсальности можно применить класс TSemnEdit. Добавить туда нужные записи и передать в структуру POLYDATAEX адрес записи (TSemnEdit::Address()).

📎📎📎📎📎📎📎📎📎📎