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

Выделение объекта не визульными компонентами. Контроль за границами пользовательской карты

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
Выделение объекта не визульными компонентами. Контроль за границами пользовательской карты, Выделение объекта не визульными компонентами. Контроль за границами пользовательской карты
 

Добрый день. Подскажите, пожалуйста, 2 вещи.

1.       Есть фоновая карта небольшой площади, например, Ногинска. Создается пользовательская карта поверх Ногинска, на которую наносятся объекты, выходящие за пределы Ногинска. Получается некрасиво – пользовательская карта растягивается, образуются края без фона. Можно ли средствами вашего мат обеспечения осуществлять контроль за регионом отрисовки.

Нашла команду SetRegion(hMap), hMap – фоновая карта. Не помогло.

Вручную можно, запросив паспорт карты, контролировать.

2.       Нужно выделить (с помощью подцветки или аниматора) объект на карте из программы, без использования визуальных компонентов типа диалогов поиска. Объекты – графические объекты (не из классификатора), есть их номера по порядку.  

Пыталась сделать что-то типа :

QDMapSelect * select = new QDMapSelect(ui.DMapView);

select->SelectSample(true, "1", 31);

Animator = new QDMapAnimator(ui.DMapView1, select);

 
Здравствуйте!

2. Если есть возможность использовать компоненты  ГИС Конструктор, то привожу измененный текст функции  Action_Animation()  из примера myfirst для выделения на карте одного объекта по номеру на  карте (номер взят из диалога выбора объекта):

void MainForm1::Action_Animation()
{
if (Animator != NULL)
delete Animator;
QDMapSelect * select = new QDMapSelect(ui.DMapView1);

QTextCodec *codec = QTextCodec::codecForName("koi8-r");
char *listName = codec->fromUnicode(ui.DMapView1->GetMapListName()).data();
select->SelectSample(true, listName, 103830);

Animator = new QDMapAnimator(ui.DMapView1, select);
}

Если  есть необходимость использовать только интерфейс MAPAPI, то  соответствующие примеры можно посмотреть в 3.6.11 "Управление составом  отображения объектов электронной карты" Руководства программиста (http://gistoolkit.ru/download/doc/gisdesigner_prog.pdf).
 
Здравствуйте!

1. При нанесении объектов пересчитываются габариты района.
Возможно, проблема связана с тем, что верхний левый угол отображения хранится в пикселах.
Для избежания этого можно хранить положение окна в метрах и восстанавливать его после нанесения объектов
(для примера функции SetMapLeftTopPlane и GetMapLeftTopPlane из исходных текстов qdmwina.cpp, каталог /usr/share/gisdesigner/examples/sources).

Дополнительно Вы не могли прикрепить пару скриншотов ("до" и "после"), чтобы убедиться, что мы говорим об одном и том же.
Спасибо!
 
Добрый день!
По поводу первого вопроса - я так и делала, как вы посоветовали. На фоновой карте выделить получилось Объекты я пытаюсь выделить на пользовательской карте..
(я указала номер листа "1" и номер по порядку "31" конкретного объекта в SelectSample). Имя листа пользовательской карты совпадает с фоновым?
Второй вопрос. Это скриншот после нанесения объектов. Объекты в левом верхнем углу не попали на карту. До - просто карта на весь экран. Спасибо за ответы. SetMapLeftTopPlane и GetMapLeftTopPlane не нашла, только SetMapLeftTop и SetMapLeftTop. Попробую.

Изменено: Денис Вицко - 08.06.2022 09:29:37 (исправил вставку картинок)
 
Цитата
Елена написал:
2.       Нужно выделить (с помощью подцветки или аниматора) объект на карте из программы, без использования визуальных компонентов типа диалогов поиска. Объекты – графические объекты (не из классификатора), есть их номера по порядку.   Пыталась сделать что-то типа :QDMapSelect * select = new QDMapSelect(ui.DMapView);select->SelectSample(true, "1", 31);Animator = new QDMapAnimator(ui.DMapView1, select);
Здравствуйте!

Привожу пример выделения с помощью подцветки:

Код
QDMapSelect * select = new QDMapSelect(ui.DMapView);
select->SelectSample(true, "1", 31);

ui.DMapView->SetObjSelected(select, RGB(255,0,0), true);

 
По поводу контроля за границами пользовательской карты. Сделала так, как вы предлагали.

Фоновая карта + пользовательская реализованы с помощью QDmapView. Перед прорисовкой объектов на пользовательской карте запрашиваю положение

double leftPlane,topPlane;
mapView->GetMapLeftTopPlane(&leftPlane, &topPlane);

После прорисовки восстанавливаю
mapView->SetMapLeftTopPlane(&leftPlane, &topPlane);

Все замечательно. Пока не доходит до изменения масштаба.

mapView->SetViewScale(val);
mapView->SetMapLeftTopPlane(&leftPlane, &topPlane);

Изменяются характеристики HScrollBar. А именно, он позволяет прокрутить фоновую карту за ее границы и увидеть мои объекты на той части пользовательской карте, которая выходит за границы  фоновой. Пыталась менять setValue, setMinimum, setMaximum для HScrollBar как в примете , на который вы сослались (для примера функции SetMapLeftTopPlane и GetMapLeftTopPlane из исходных текстов qdmwina.cpp, каталог /usr/share/gisdesigner/examples/sources). . Не получается. Ноль HScrollBar теперь соответствует не краю фоновой карты, а выходит за ее пределы. Подскажите, что конкретно нужно сделать для mapView. Переоткрыть?
Как привязать ноль НScrollbar к краю карты (к leftPlane).  
Изменено: Елена - 11.06.2019 12:46:13
 
Или нужно что-либо с пользовательской картой делать на время изменения масштаба основной? Подскажите.
 
Здравствуйте!

Вы не могли бы, пожалуйста, сделать два скриншота отображения карты ("до" и "после" нанесения объекта), чтобы мы могли лучше представить описываемую Вами проблему. Спасибо!
 
До и после нанесения объекта - первая картинка. Синие точки нанесены на пользовательскую карту.  Скроллер - на краю фоновой карты. Выходящие за пределы фоновой карты синие точки не видны, не дает скроллер. Вторая картинка - после масштабирования набора карт. Вылазят те точки пользовательской карты,  которые были за пределами фоновой,  нуль скроллера теперь на краю пользовательской карты.  
[img]file:///d:/1.png[/img]https://ibb.co/BfBm24J
https://ibb.co/Gs9Mvt5[img]file:///d:/1.png[/img]
 
Здравствуйте!

Для решения данной задачи можно создать пользовательскую карту с рамкой, соответствующей рамке карты Ногинска.
Для этого необходимо использовать функцию mapCreateMap (mapapi.h):
Код
// Создать новый район (новую векторную карту)
// mapname - полное имя файла карты
// rscname - полное имя файла ресурсов
// Возвращает идентификатор открытой векторной карты
// Структуры MAPREGISTER и LISTREGISTER описаны в mapcreat.h
// При ошибке возвращает ноль

_MAPIMP HMAP _MAPAPI mapCreateMapEx(const char * mapname, const char * rscname,
                                    MAPREGISTEREX * mapreg, LISTREGISTER * listreg);
_MAPIMP HMAP _MAPAPI mapCreateMap(const char *mapname, const char *rscname,
                                  MAPREGISTER *map, LISTREGISTER *sheet);
При заполнении структуры LISTREGISTER необходимо указать рамку карты Ногинска.
Для того, чтобы создать пользовательскую карту с рамкой, в поле FlagRealPlace структуры MAPREGISTER (или MAPREGISTEREX) (mapcreat.h) необходимо задать соответствующее значение (например, "-1" для создания карты SIT c рамкой):
Код
typedef struct MAPREGISTEREX
{
  ...
  int         FlagRealPlace          ; // Вид карты: 0 - MAP (многолистовая с рамками),
                                       // 1 - SIT (безразмерный лист), 2 - SITX (один файл), -1 - SIT c рамкой, -2 - SITX с рамкой
  ...
}
  MAPREGISTEREX;
Примеры создания карты можно посмотреть в разделе 3.6.2 "Создание новой карты и плана" Руководства программиста ГИС Конструктор (http://gistoolkit.ru/download/doc/gisdesigner_prog.pdf).
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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