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

Выделение объекта поиска (Qt AXКомпонент или mapApi)

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Выделение объекта поиска (Qt AXКомпонент или mapApi)
 
Доброго времени суток.
Подскажите пожалуйста, что-то в тупик зашел в изысканиях своих
1. Почему-то в ашниках ничего не находится по поиску OS_SELECT, TxObjectStyle, TxObjectStyleSelect (в том числе в maptype.h)
2. Как просто выделить найденный поиском объект?

Пробую делать так, визуально ничего не происходит
while ( ! axMapFind->dynamicCall("Eof()").toBool() ){
 ...
 axMapFindObject->setProperty( "StyleSelect", 2 );
 axMapFindObject->setProperty( "Style", 3 );

 А на это реагирует.. и центрует по середине экрана
 axMapFindObject->dynamicCall( "Center()" );
..
}
 
По пункту 1. "Почему-то в ашниках ничего не находится по поиску OS_SELECT, TxObjectStyle, TxObjectStyleSelect (в том числе в maptype.h)".
Все эти типы относятся к надстройке GIS ToolKit Active над ГИС-ядром (которое описано в том числе и maptype.h)

В инсталляцию GIS ToolKit Active входит набор примеров. Для поиска и выделения посмотрите пример FindObj
 
Под Qt не нашел пример с поиском и выделением.. ткните носом пожалуйста, если он есть.

По первому пункту ответ вообще не понял. У нас куплен GIS ToolKit Active Free и в ашниках нет того, что я описал
 
В инсталляцию входят примеры для сред Visual Studio и Embarcadero (Delphi, C++ Builder), написанные на языках C++, C#, Basic. В этих примерах можно посмотреть порядок использования объектов и классов. Есть справка axGisToolKit12.chm и документ GisToolKitAX12 Руководство программиста.doc (в них есть информация по OS_SELECT, TxObjectStyle, TxObjectStyleSelect).
Ниже приведу выдержку из другой документации:

//===================================================

// Выбор и настройка состава отображаемых объектов

//===================================================

procedure TMyForm.miSelectViewClick(Sender: TObject);

begin

// Для вступления в силу параметров селекции

MapView.Selecting := true;  // данную команду можно выполнить один раз

                                              // либо настроить в компоненте с помощью инспектора        //объектов Delphi

// Вызовем диалог

if MapSelectDialog.Execute(MapView.ViewSelect, false) = true

    then MapView.Repaint;

end;

//===================================================

//===================================================

Другой важной особенностью любой ГИС является возможность масштабировать изображение карты. В нашем примере это реализовано за счет перехвата нажатия мыши и использования свойства MapView.ViewSelect, отвечающее за текущий масштаб отображения карты.

//===================================================

// Нажали мышью в точке карты

//===================================================

procedure TMyForm.MapViewMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

NewScale : integer;

spoint   : TPoint;

begin

if MapView.MapView = false

    then exit;

// Будем действовать в зависимости от текущего режима

if miScale.Checked = true

   // активен режим масштабирования в точке

   then begin

       // вычислим новый масштаб

       NewScale := MapView.ViewScale;

       if Button = mbLeft // по левой кнопке приблизим карту

          then NewScale := MapView.ViewScale div 2;

       if Button = mbRight // по правой кнопке отдалим карту

          then NewScale := MapView.ViewScale * 2;

       // установим масштаб в точке

       MapPoint.PlaceInp := PP_PICTURE;

       MapPoint.Y        := MapView.MapTop + Y;

       MapPoint.X        := MapView.MapLeft + X;

       MapView.ScaleInPoint(NewScale,MapPoint.point);

       // установим курсор в новую позицию но с теми же координатами в карте

      MapPoint.PlaceOut := PP_PICTURE;

      spoint.X := trunc(MapPoint.X) - MapView.MapLeft;

      spoint.Y := trunc(MapPoint.Y) - MapView.MapTop;

      spoint   := MapView.ClientToScreen(spoint);

      SetCursorPos(spoint.X, spoint.Y);

      exit;

   end;

end;

//===================================================

//===================================================

При визуальной работе с картой у пользователя обязательно возникнет желание узнать, какие объекты карты находятся в той или иной ее точке (учитывая тот факт, что карта – это многослойный "пирог"). Реализация этой задачи состоит из следующих этапов: определения координат нажатия мыши (искомой точки карты) и последовательный перебор объектов карты в точке с известными координатами. Самый простой способ реализации – воспользоваться методом SelectObjectInPoint компонента TMapObj (отвечает за информацию о конкретном объекте карты) .

//===================================================

// Нажали мышью в точке карты

//===================================================

const

iFindRadius = 5; // радиус поиска в пикселях

procedure TMyForm.MapViewMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if MapView.MapView = false

    then exit;

// Будем действовать в зависимости от текущего режима

// поиск в точке с помощью TMapObj

if miInPointDlg.Checked = true

  then begin

    MapObj.Style     := OS_NOVIEW;     // если было выделение то снимем его

    MapObjFind.Style := OS_NOVIEW; // если было выделение то снимем его

    if MapObj.SelectObjectInPoint(X, Y, iFindRadius, dlMinCommon) <> 0

       then begin

          // выведем название объекта

          stMap.Panels[3].Text := MapObj.ObjName;

          // выделим объект морганием

          MapObj.Style := OS_SELECT;

       end;

    exit;

  end;

end;

//===================================================

//===================================================

Данный метод позволяет не только перебрать все объекты в точке, но и просматривать и редактировать подробную информацию о текущем объекте карты. Существует второй вариант решения этой задачи, более сложный, но он даёт полный контроль над процессом перебора объектов карты и способов их визуального выделения. Этот способ также описан в примере и использует связку из двух ГИС компонент: TMapFind (отвечает за организацию поиска в карте) и TMapObj.

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

axMapFindObject->dynamicCall( "SetColorImage(QColor)", QColor( 255,255,255,100 ) );
axMapFindObject->dynamicCall( "SetColorImageUp(QColor) ", QColor( Qt::green ) );
axMapFindObject->setProperty( "StyleSelect", 3 );
axMapFindObject->setProperty( "Style", 2 );

Помогите, пожалуйста, добиться чтобы маргал только контур объекта, или выделение было полупрозрачным.
Посмотрите, пожалуйста, GIS ToolKit Active 12 Free .. в ашниках для С++ нет типов TxObjectStyleSelect, TxObjectStyle .. приходится инты подбирать
Изменено: Денис Вицко - 08.06.2022 09:33:46 (исправил вставку картинок)
 
Цитата
Валерий Валериевич написал:
Посмотрите, пожалуйста, GIS ToolKit Active 12 Free .. в ашниках для С++ нет типов TxObjectStyleSelect, TxObjectStyle .. приходится инты подбирать

Всё есть, только не в "ашниках".

Перечислимый тип TxObjectStyle
Перечислимый тип TxObjectStyleSelect

Посмотрите реализацию в примере: ...\GISToolActive12\Example\MS2012\C#\Myfirst\ (см. First.cs).
Страницы: 1
Читают тему (гостей: 1)



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

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