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

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

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Oleg Belenkov
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 383 След.
Не меняется масштаб карты, Версия ГИС Оператор 11.13.7
 
Обеспечение картами выполняют топографические службы соответствующих ведомств.
Сохранение долготы усл. знака происходит не точно
 
Большинство функций, работающих с координатами, принимают и выдают значения в системе документа.
Изначально система документа соответствует первой открытой карте.
Ее можно изменить через вызов mapSetDocProjection.
Если первой открыта карта в СК-42, то и все функции работают в СК-42.

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

Функции mapGetMapPlanePoint, mapUpdateMapPointPlane работают в системе координат карты в метрах, что исключает любые искажения.
C#, Linux, Sit карты
 
Формат SIT состоит из многих файлов.
Подробнее здесь -
[URL=https://gistoolkit.com/download/doc/mapapi.pdf]https://gistoolkit.com/download/doc/mapapi.pdf[/URL]

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

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

Формат SITX всю карту хранит в одном файле.
Чтение карты SXF
 
Для импорта 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 -

[URL=https://gisinfo.ru/download/?id=279]https://gisinfo.ru/download/?id=279[/URL]
Координаты по пеленгам
 
Делаю предположение.
Геодезическая задача ищет точку по кратчайшему расстоянию на дуге.
Далее заменяем дугу прямыми линиями и берем пересечение.

Я бы предложил строить ортодромию с набором точек с шагом в 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://gisweb.ru/forum/messages/forum26/topic9256/message69484/9256-pechat-otcheta-v-formate-a3#message69484]https://gisweb.ru/forum/messages/forum26/topic9256/message69484/9256-pechat-otcheta-v-formate-a3#mes...[/URL]

[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

Пример формирования семантики теперь выглядит так:
[CODE]// --------------------------------------------------------
// Заполнить запись семантики для отрисовки примера знака
// --------------------------------------------------------
int GetBarChart10ValueSemantic(TSemanticRecord& semrecord, const IMGDRAW* draw)
{
 int semcount = 0;
 int value[10] = { 10, 5, 7, 13, 8, 12, 6, 14, 4, 6 };

 for (int i = 1; i <= 10; i++)
 {
   IMGLONG* parm = (IMGLONG*)imlDrawParm(draw, i * 2 + 3);
   if (parm)
   {
     int semcode = parm->Value;
     if (semcode)
     {
       semrecord.Append(semcode, value[i - 1]);
       semcount++;
     }
     else
       break;
   }
 }

 if (semcount == 0)
   return 0;

 return 1;
}[/CODE]
Вызов функции выглядит так:
[CODE] case IMG_BARCHART10VALUE:
  {
    TSemanticRecord semrecord;

    // Заполнить семантику ...
    if (GetBarChart10ValueSemantic(semrecord, parm) != 0)
      data.Semantic = (char*)semrecord.Address();

    count[0] = 1;
    points[0].x = (points[0].x + points[1].x) / 2;
    points[0].y = (points[0].y + points[1].y) / 2;
    return BarChart10Value(&data, parm, context, 0, 0);
  }[/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;

                              // Ident    Length    Code  Type Scale  Value
  unsigned char Semantic[] = { 0xFF, 0x7F,  16, 0,  136, 0,  2,   0,   100, 0, 137, 0,  2,   0,   170, 0};

  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)
{
 buffer.Clear();

 int semcount = 0;

 struct SEMRECORD
 {
   SEMANTIC head;
   struct SEMBLOCK
   {
     unsigned short int code;
     SEMLONG  item;
   }
   block[10];
 }
 semantic;

 memset(&semantic, 0, sizeof(semantic));
 semantic.head.Clear();

 int value[10] = { 10, 5, 7, 13, 8, 12, 6, 14, 4, 6 };

 for (int i = 1; i <= 10; i++)
 {
   IMGLONG* parm = (IMGLONG*)imlDrawParm(draw, i * 2 + 2);
   if (parm)
   {
     int semcode = parm->Value;
     if (semcode)
     {
       semantic.block[i - 1].code = semcode;
       semantic.block[i - 1].item.Type = 4;
       semantic.block[i - 1].item.Value = value[i - 1];
       semcount++;
     }
     else
       break;
   }
 }

 if (semcount == 0)
   return 0;

 semantic.head.SetLength(semantic.head.GetLength() + semcount * sizeof(semantic.block[0]));
 buffer.addValue((char*)&semantic, semantic.head.GetLength());
 return 1;
}[/CODE]
В данном случае семантики типа Целое число (4 байта). Это не универсальный пример.

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

Для исключения линковки методов класса из других библиотек нужно включать в код #include "mapmacro.h"

[CODE]#include "mapmacro.h"
#include "mapsem.h"

POLYDATAEX  data;
TSemnEdit semedit;

semedit.Append(1300, 3); // код - 1300 (признак цвета), 3 - зеленый ...

data.Semantic = semedit.Address();

...
[/CODE] И включить в проект файлы mapsem.cpp, semdef.cpp.
Пересоздание рамки карты
 
Если создать новую рамку, то одних сообщений (по рамке) не будет, но могут быть сообщения по объектам, выходящим за рамку.
Сообщение по координатам рамки можно игнорировать (принимать к сведению).
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 383 След.



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

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