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

Delphi XE5 - выделение объектов по полигону

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Delphi XE5 - выделение объектов по полигону
 
Пример FindObj

Делаю выделение объектов (нажимаю прямоугольничек).

Если начальная точка выбрана за пределами карты - то выделение не делается  -  showmessage('Объект не создан!');.
И потом красный прямоугольник остается и не удаляется.

Я не могу понять, почему так происходит...  

Может быть есть простой метод выделить все оъекты внутри прямоугольника ?


============================================================­====
if MapSelectRect1.Selection
   then begin
     // Создать пустой объект
     mo11.CreateObjectByExCode(0, KM_IDFLOAT2, 1000000002, OL_SQUARE);
     // Установить метрику созданного объекта

     MapSelectRect1.PPlace := PP_PLANE;

     
     MapPoint1.PlaceInp := PP_PLANE;
     MapPoint1.SetPoint(MapSelectRect1.SelectedRect.X1, MapSelectRect1.SelectedRect.Y1);
     mo11.Metric.Append(0,MapPoint1.point);
     MapPoint1.SetPoint(MapSelectRect1.SelectedRect.X1, MapSelectRect1.SelectedRect.Y2);
     mo11.Metric.Append(0,MapPoint1.point);
     MapPoint1.SetPoint(MapSelectRect1.SelectedRect.X2, MapSelectRect1.SelectedRect.Y2);
     mo11.Metric.Append(0,MapPoint1.point);
     MapPoint1.SetPoint(MapSelectRect1.SelectedRect.X2, MapSelectRect1.SelectedRect.Y1);
     mo11.Metric.Append(0,MapPoint1.point);
     mo11.Commit;

     
     MapFindObject1.MapSelect.SiteNumber := 0;   // основная карта
     MapFindObject1.MapSelect.UnselectSeekArea(-1);  // сбросим область если была

     if mo11.Key = 0
       then begin
         showmessage('Объект не создан!');
         exit; // объекта карты нет
       end;
     MapFindObject1.Active    := false;
     MapFindObject1.FindPoint := false;

     // установим область по созданному ранее объекту
     MapFindObject1.MapSelect.SelectSeekArea(-1,mo11,0, 1, 2, 1, 0);

     k:=mo11.Delete;
     Assert(k>0);
1.PNG (112.92 КБ)
2.PNG (116.36 КБ)
3.PNG (84.89 КБ)
4.PNG (97.64 КБ)
5.PNG (103.82 КБ)
 
Текст примера не изучал. Хочу понять логику вопроса.
1. Взяли штатный пример из инсталляции.
2. Выбрали область за пределами карты.
И тут не работает. Я правильно понял?
 
именно так !

если выделение начать с внутренней точки на карте - работает.

Или может есть какой то иной способ выделить объекты внутри прямоугольника ?
 
Пример посмотрим. Интерактивных способов много, но все они заканчиваются установлением параметров поиска по заданной области и перебором найденных объектов.
В какой версии вы работаете?
 
Здравствуйте!
Функция SelectSeekArea может работать с объектом, который не обязан реально существовать в карте. Достаточно наличие метрики. Поэтому рекомендуется убрать запись объекта (Commit).
Метрика области поиска, которая передается в SelectSeekArea должна быть замкнута.
Рекомендуется изменить Ваш код следующим образом:
Код
if MapSelectRect1.Selection 
then begin 
// Создать пустой объект 
mo11.CreateObjectByExCode(0, KM_IDFLOAT2, 1000000002, OL_SQUARE); 

// Установить метрику созданного объекта 
MapSelectRect1.PPlace := PP_PLANE; 

MapPoint1.PlaceInp := PP_PLANE; 
MapPoint1.SetPoint(MapSelectRect1.SelectedRect.X1, MapSelectRect1.SelectedRect.Y1); 
mo11.Metric.Append(0,MapPoint1.point); 
MapPoint1.SetPoint(MapSelectRect1.SelectedRect.X1, MapSelectRect1.SelectedRect.Y2); 
mo11.Metric.Append(0,MapPoint1.point); 
MapPoint1.SetPoint(MapSelectRect1.SelectedRect.X2, MapSelectRect1.SelectedRect.Y2); 
mo11.Metric.Append(0,MapPoint1.point); 
MapPoint1.SetPoint(MapSelectRect1.SelectedRect.X2, MapSelectRect1.SelectedRect.Y1); 
mo11.Metric.Append(0,MapPoint1.point); 

// замкнуть контур
MapPoint1.SetPoint(MapSelectRect1.SelectedRect.X1, MapSelectRect1.SelectedRect.Y1); 
mo11.Metric.Append(0,MapPoint1.point); 

//mo11.Commit; 

MapFindObject1.MapSelect.SiteNumber := 0; // основная карта 
MapFindObject1.MapSelect.UnselectSeekArea(-1); // сбросим область если была 

//if mo11.Key = 0 
//then begin 
//showmessage('Объект не создан!'); 
//exit; // объекта карты нет 
//end; 

MapFindObject1.Active := false; 
MapFindObject1.FindPoint := false; 

// установим область по созданному ранее объекту 
MapFindObject1.MapSelect.SelectSeekArea(-1,mo11,0, 1, 2, 1, 0); 

//k:=mo11.Delete; 
//Assert(k>0);


Пример в инсталляции исправим
Изменено: Роман Твердов - 28.04.2016 11:14:11
 
спасибо !

Все работает с замкнутым контуром ...
 
и от меня спасибо, тоже не понимал почему не работает если не коммитнуть объект (надо было замыкать контур)
Страницы: 1
Читают тему (гостей: 1)



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

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