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

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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 412 След.
Добавление на карту собственных изображений, Добавление на карту собственных изображений
 
Эти стрелочки были созданы в Редакторе классификатора.
Базовый способ работы с картой - применение классификатора объектов и их атрибутов и управление их видом через изменение атрибутов.
Программист не должен задумываться над управлением цветом, размером и т.п. Это задача проектировщика цифрового классификатора.
Возможность интерактивно ввести сложный знак мы предоставили. Исходные тексты в SDK.
Добавление на карту собственных изображений, Добавление на карту собственных изображений
 
Чтобы узнать как рисуется любой знак можно выбрать мышкой на карте соответствуюший объект (знак) и в диалоге Выбор объекта перейти в закладку Вид.
В данном случае Вы увидите: Программируемый вид, библиотека - shape.iml, функция - Знак с длиной и поворотом по семантике.
Если войдете в Параметры, то увидите 3 позиции: сам знак - стрелочка, семантика - угол поворота - 6666, длина в мм - 7788.
При изменении значений этих семантик будут меняться угол поворота и длина знака.
Если в параметрах установить другие номера семантик, то вид будет зависеть от них.
Если вместо стрелочки задать другое изображение (например, самолет), то будет другой знак.
Будут влиять и другие служебные семантики - ЦВЕТ ЗНАКА, МАСШТАБ ЗНАКА (SEMIMAGESCALE 31001, SEMIMAGECOLOR 31002) и т.д.

Программно - это тип IMG_LIBRARY. Тексты всех программируемых знаков на IMLAPI в SDK -
[URL=https://gisinfo.ru/download/?id=310]https://gisinfo.ru/download/?id=310[/URL]

Там же и номер функции можно увидеть и параметры.
[CODE]#define IMG_MARKALONGLINE 1 // ЗНАК ВДОЛЬ ЛИНИИ
#define IMG_HORIZONTALSHADE      2  // ГОРИЗОНТАЛЬНАЯ ШТРИХОВКА
#define IMG_MIRRORMARKALONGLINE  3  // ЗЕРКАЛЬНЫЙ ЗНАК ВДОЛЬ ЛИНИИ
#define IMG_MARKINTOLINE         4  // ЗНАК ВНУТРИ ЗЕРКАЛЬНОЙ ЛИНИИ
#define IMG_TURNMARK             5  // ЗНАК, С ПОВОРОТОМ - УГОЛ В СЕМАНТИКЕ
#define IMG_UNIVERSALTEXT        6  // ТЕКСТ С ПАРАМЕТРАМИ ИЗ СЕМАНТИКИ
#define IMG_SCALEVECTOR          7  // МАСШТАБИРУЕМЫЙ ВЕКТОРНЫЙ
#define IMG_THICKENLINEEX        8  // УТОЛЩЕННЫЙ ЛИНЕЙНЫЙ
#define IMG_MIDDLETHICKENLINEEX  9  // УТОЛЩЕННЫЙ ЛИНЕЙНЫЙ В СЕРЕДИНЕ
#define IMG_MARKANDNOTE         10  // Знак с выноской
#define IMG_SHADOWOBJECT        11  // Объект с тенью
#define IMG_COLORSHADOWOBJECT   12  // Объект с цветной тенью
#define IMG_DOUBLETHICKENLINE   14  // УТОЛЩЕННЫЙ ЛИНЕЙНЫЙ ПО ВСЕЙ ЛИНИИ
#define IMG_POLYARC             15  // ДУГА ПО ЛОМАННОЙ
#define IMG_THICKENDOTLINE      16  // УТОЛЩЕННЫЙ ПУНКТИР
#define IMG_TURNANDLENGTHMARK   17  // ЗНАК С ПОВОРОТОМ И ДЛИНОЙ ПО СЕМАНТИКЕ
#define IMG_LENGTHANDANGLELINE  18  // ЛИНИЯ С ПОДПИСЬЮ ДЛИНЫ
#define IMG_GRADIENTCIRCLE      19  // ОКРУЖНОСТЬ ПО ДВУМ ТОЧКАМ С ГРАДИЕНТНОЙ ЗАЛИВКОЙ
#define IMG_SCALELIMITEDIMAGE   20  // ЗНАК, РИСУЕМЫЙ ПРИ ЗАДАННЫХ МАСШТАБАХ
#define IMG_QUARTER             21  // ПРИПОДНЯТЫЙ МНОГОУГОЛЬНИК
#define IMG_IMAGEVIEW           22  // ОТОБРАЖЕНИЕ ГРАФИЧЕСКИХ ФАЙЛОВ[/CODE]
У всех функций параметры в IMGDRAW. В данном случае - IMGVECTOREX и два IMGLONG.Но проще и технологичнее применять знаки через классификатор RSC.
Ошибки и пожелания. Часть 3
 
[QUOTE]Леонид Мещерин написал:
    Профессиональная ГИС "Панорама" версия 15.1.2.71    Здравствуйте.
В данной версии не корректно работает выделение объектов по условному знаку и выделить произвольно указанные. Закономерности не нашел, но выделяет через раз, одни объекты выделяет, другие нет. Всегда по разному.[/QUOTE]
Может речь идет о подсветке выделенных объектов.
Выделение (фиолетовым цветом) может быть с разрядкой. Когда на экране выделены тысячи объектов, то часть из них не подсвечивается, чтобы ускорить перерисовку окна.
Например, после выделения первых 5 000 дальше будет подсвечиваться каждый 25-ый, если отключено выделение с разрядкой в меню Параметры.
Если включено, то после первых 500 выделяется каждый 5-ый и т.д.
Но обрабатываться будут все объекты, соответствующие условиям отбора.

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

Если наблюдаемый объект по-прежнему не выделен, то это может быть связано с дублированием уникальных номеров объектов. Но подсветка по условному знаку не работает с номерами объектов. И пропуски объектов при дублировании номеров будут стабильными для одних и тех же объектов. Остается вариант с разрядкой.
Использование mapSetDocProjectionPro, Пример использования mapSetDocProjectionPro
 
[CODE]// The parameters for coordinate transformation
typedef union LOCALTRANSFORM
{
 LOCALTRANSFORM() { memset(this, 0, sizeof(LOCALTRANSFORM)); }

 // Параметры преобразования сдвиг, масштаб, поворот
 OFFSETSCALEROTATE Rotate;

 // Параметры афинного преобразования
 AFFINCOEFBASE     Affine;

 // Зарезервировано 80 байт, не менять
 double            Total[10];
}
 LOCALTRANSFORM;[/CODE][CODE]// Параметры преобразования сдвиг, масштаб, поворот
typedef struct OFFSETSCALEROTATE
{
 double Angle;  // угол поворота в радианах
 double Scale;  // масштаб
 double dX;     // смещение по X
 double dY;     // смещение по Y
}
 OFFSETSCALEROTATE;[/CODE][CODE]LOCALTRANSFORM loctransform;

loctransform.Rotate.Angle = 25. * M_PI / 180.;   // Поворот системы координат на 25 градусов
loctransform.Rotate.Scale = 1.;
[/CODE]
Как-то так.

Или так:[CODE] /*********************************************************
 *                                                        *
 *     ФУНКЦИИ НАСТРОЙКИ ОТОБРАЖЕНИЯ ЭЛЕКТРОННОЙ КАРТЫ    *
 *                     С ПОВОРОТОМ                        *
 *                                                        *
 *********************************************************/

// Функция настройки отображения карты с поворотом
//  hmap     - идентификатор открытых данных
//  angle    - угол поворота карты в плане с вершиной в
//             юго-западном углу карты (от -Pi до Pi)
//  fixation - угол сектора фиксации поворота отображения карты
//             относительно предыдущего положения (от 0 до Pi/6)
// Угол fixation используется для минимизации дрожания изображения
// при движении по повернутой карте по прямой (или почти по прямой),
// когда при последовательном вызове функции подаются близкие
// значения угла поворота (angle). В случае, если разность между
// текущим углом поворота и требуемым будет меньше fixation,
// то новый угол поворота не устанавливается
// hpaint - идентификатор контекста отображения для многопоточного вызова
// Автоматически вызывает функцию mapSetRegion для обновления габаритов документа
// Возвращает значение установленного угла поворота
// При ошибке возвращает 0

_MAPIMP double _MAPAPI mapSetupTurn(HMAP hmap, double angle, double fixation);
_MAPIMP double _MAPAPI mapSetupTurnEx(HMAP hmap, double angle, double fixation, HPAINT hPaint);

// Активен ли поворот ?
// hmap - идентификатор открытых данных
// Возвращает (1 - активен, 0 - нет)

_MAPIMP long int _MAPAPI mapTurnIsActive(HMAP hmap);

// Запросить угол поворота
// hmap - идентификатор открытых данных
// Возвращает значения от -Pi до Pi

_MAPIMP double _MAPAPI mapGetTurnAngle(HMAP hmap);[/CODE]
Ошибка при запуске примера скрипта на Python, \GisTool15\Example\python\findobj\findobj.py
 
Может не по делу, но на всякий случай.
Если посмотреть дамп для gis64acces.dll, то видим:
[CODE]Imports from MSVCP140.dll

Imports from VCRUNTIME140.dll

Imports from VCRUNTIME140_1.dll

Imports from api-ms-win-crt-string-l1-1-0.dll

Imports from api-ms-win-crt-convert-l1-1-0.dll

Imports from api-ms-win-crt-math-l1-1-0.dll

Imports from api-ms-win-crt-stdio-l1-1-0.dll

Imports from api-ms-win-crt-filesystem-l1-1-0.dll

Imports from api-ms-win-crt-environment-l1-1-0.dll

Imports from api-ms-win-crt-heap-l1-1-0.dll

Imports from api-ms-win-crt-utility-l1-1-0.dll

Imports from api-ms-win-crt-time-l1-1-0.dll

Imports from api-ms-win-crt-runtime-l1-1-0.dll[/CODE]Это библиотеки из состава GTK и они тоже должны быть доступны. -> Could not find module 'gis64acces.dll' (or one of its dependencies).
Аналогично для gis64rsctools.dll
Отображения названия и поиск населенных пунктов в растровых картах
 
Если функция вернула нулевые значения габаритов в метрах, значит они нулевые.
Подбирать единицы измерения и пересчитывать не нужно.

Функция примерно такая:
[CODE] TMap * map = mapGetMap(hMap, hSite);
     frame.X1 = map->X1m();
     frame.Y1 = map->Y1m();
     frame.X2 = map->X2m();
     frame.Y2 = map->Y2m();

     if (map->NeedTranslate() != 0)
     {
       // Пересчитать габариты в рабочую проекцию
       ((TMapAccess*)hMap)->TranslateFrameFromMap(frame, map->GetTranslate());
     }

[/CODE]
Например, если карта создана программно в сеансе работы приложения, запись с отключением журнала транзакций (ускоренно),
отображения не было, вызова функций типа mapSaveSite не было, то габариты еще нулевые, хотя объекты уже записывались.
Или карта создана программно с ограничением территории рамкой, но координаты рамки не были установлены - они нулевые. И т.п.

Но, скорее всего, открыты совместно карты и растры с ошибочными или несовместимыми параметрами систем координат. Пример ошибочных параметров системы координат: имеем топокарту (UTM/Гаусса-Крюгера) с координатой Y  в 7-ой зоне (с 7 000 000), а в паспорте указана 1-я зона и осевой меридиан - 3 градуса или 0.
Пример несовместимых систем координат: первая фоновая топокарта карта в 7-ой зоне, а другая - в 15-ой. А система координат документа автоматически установлена по первой открытой карте.
Преобразования координат за границами 3-ех зон от зоны документа (на самом деле дальше, но это уже ошибка) будут давать линию меридиана по границе крайней допустимой зоны, а габариты соответственно будут нулевыми.
Если работа (речь только о топокартах!) ведется на территории в пределах 3-ех зон (ширина зоны условно около 500 км), но проявляются такие ошибки, то скорее всего в паспорте карты мусор.
Тогда нужно вбить правильные параметры и забыть про лишние пересчеты.
Проверьте каждый набор данных, открыв его совместно с любым геопорталом - не сидит, значит ошибка в данных. Подбор пересчетов не поможет.
Отображения названия и поиск населенных пунктов в растровых картах
 
Смысл текста не могу понять.
И задачу не понимаю.

Попробую угадать.
Есть некая карта на некоторую территорию И есть другие карты с объектами, которые могут быть на этой территории и за ее пределами.
Нужно отбирать только те объекты с других карт, которые расположены на фоне базовой карты.
Тогда можно запросить габариты фоновой карты в момент перед запуском операции поиска (зачем их хранить и в какой системе они будут получены - датчик случайных чисел).
И использовать эти габариты в качестве условия поиска в комбинации с другими параметрами отбора объектов.

[CODE] // Запросить габариты пользовательской карты в системе координат документа
 // hMap   - идентификатор открытой основной карты
 // hSite  - идентификатор открытой пользовательской карты
 // list   - номер листа для многолистовой карты или 0
 // dframe - координаты прямоугольной области района
 // place  - система координат (PP_PLANE, PP_GEO, PP_PICTURE)
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetSiteBorder(HMAP hMap, HSITE hSite, DFRAME *dframe, long int place);

 // Установить в контексте параметры поиска объектов по прямоугольной области
 // hselect - контекст поиска об'ектов
 // dframe  - габариты области поиска в метрах
 // distance - расстояние поиска в метрах (симметрично расширяет область dframe)
 // filter  - учитывать/не учитывать(1/0) фильтр объектов,
 //           параметры фильтра должны быть установлены заранее в контексте поиска
 // inside  - границы поиска объектов по области :
 //           1 - внутри области, 2 - целиком внутри области, 0 - по расстоянию
 // visible - с учетом/без учета (1/0) видимости объектов на карте
 // action   - порядок поиска объектов :
 //            0 - последовательный поиск по мере запроса объектов (может принудительно восприниматься как 1
 //                для ускорения поиска по большим картам),
 //            1 - предварительный многопоточный отбор всех объектов
 //            (главному окну приложения посылается WM_PROGRESSBARUN - maptype.h),
 //            ускоряет многократный запрос отобранных объектов, НО ПОСЛЕ ЭТОГО ПОИСК БУДЕТ ИДТИ ТОЛЬКО ПО КАРТЕ,
 //            НА КОТОРОЙ СОЗДАН HSELECT
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapSelectSeekAreaFrame(HSELECT hselect, DFRAME *dframe, double distance = 0.0, long int filter = 0,
                                               long int inside = 1, long int visible = 0, long int action = 0);


[/CODE]
В этом случае координаты будут в текущей системе документа и всегда будут согласованы.
Ничего лишнего в коде не должно быть.
Заполнение сложных подписей из классификатора
 
Данная подпись реализована через векторный знак, который отображает значения 4-ех семантик.
В КЭУЗ дана картинка с комментариями по заполнению строк, но этим строкам не назначены свои стандартные коды семантик (характеристик).

Текст в начале знака, слева от разделительной линии, содержит Материал постройки - в семантике 5400 (Произвольная надпись). Например: "зем".
Текст сверху разделительной линии содержит значения Длина плотины в метрах - Ширина по верху - в семантике 11541 (Верхняя часть подписи). Например: "170 - 4"
Текст снизу разделительной линии содержит значение Высота плотины в метрах - в семантике 11542 (Нижняя часть подписи). Например: "3.5"
Текст в конце знака, справа от разделительной линии, содержит значение Длина водосливной части плотины в метрах - в семантике 15 (Длина части объекта). Например: 140.

Мы обновим классификатор и добавим новые семантики, чтобы не гадать о назначении строк.

Чтобы нанести такую подпись, нужно указать положение знака на карте (с любым текстом или без текста), затем заполнить соответствующие семантики.
НАНЕСЕНИЕ ЗАПОЛНЯЮЩИХ ЗНАКОВ НА ПОЛИГОНЫ, *
 
Да, будет бессрочным.
Масштабирование карты согласно выделенной зоне
 
[CODE]// -----------------------------------------------------------------
// Функция изменения масштаба по координатам фрагмента в метрах
// Возвращает: 0 - масштаб не изменился, 1 - масштаб изменился
// -----------------------------------------------------------------
int TMapWindow::ChangeScaleByFrame(DFRAME * dframe)
{
 // Габариты окна в пикселах
 RECT   rect = GetClientRect();

 double x1   = dframe->X1;
 double y1   = dframe->Y1;
 double x2   = dframe->X2;
 double y2   = dframe->Y2;

 DOUBLEPOINT center;
 center.X    = (x1 + x2)/2.0;
 center.Y    = (y1 + y2)/2.0;

 mapPlaneToPicture((HMAP)MapDoc, &x1, &y1);
 mapPlaneToPicture((HMAP)MapDoc, &x2, &y2);

 int dw = ROUND(x2 - x1);
 if (dw < 0)
   dw = -dw;
 else
   if (dw == 0)
     dw = 1;

 int dh = ROUND(y1 - y2);
 if (dh < 0)
   dh = -dh;
 else
   if (dh == 0)
     dh = 1;

 // Расчет коэффициента изменения масштаба
 double change  = (double)(rect.RT - rect.LT - 64) / (double)dw;
 double change2 = (double)(rect.DN - rect.UP - 64) / (double)dh;

 if (change > change2)
   change = change2;

 double scale = mapGetRealShowScale((HMAP)MapDoc);
 scale = scale/ change;

 // Установить курсор в центр окна
 SetProcess(IDP_SCALECENTRE, 1);

 // Установить масштаб для показа объекта в рамках окна
 int ret = SetMapScale(scale, 1);

 // Установить окно в центр габаритов объекта
 ViewPlanePoint(¢er);

 return ret;
}[/CODE]
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 412 След.



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

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