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

непонятное поведение

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 4 След.
RSS
непонятное поведение, непонятное поведение SaveFrameToEmfEx
 
Цитата
mihalych72 написал:
делать отдельный TMapGisServer для нового TMapScreen?
Не понял вопроса. Если уже есть в приложении TMapGisServer, можно использовать его.
TMapGisServer может подключаться к нескольким разным ГИС Серверам.

Цитата
mihalych72 написал:
а как сделать подобное для удаленного гис-сервера
не важно, откуда открывается карта

Остальной части вопроса тоже не понял.
Надо получить фрагмент карты в виде изображения.
Что за объект TGTK_MapFrameRect?
Судя по всему, его назначение - сделать скриншот заданной области. Видимо, с экранным разрешением.

Есть масса встроенных функций ГИС-ядра, позволяющих выгрузить изображение указанного фрагмента карты в заданном разрешении и масштабе.
Например, cохранить в файл:
Скрытый текст


или выполнить отрисовку на устройство (в том числе в файл):
Скрытый текст
 
Цитата
Денис Вицко написал:
mvMap.SetViewSelected(false, clRed);  mvMap.SetObjSelected(MapFindByRect.MapSelect, clRed, true);
Ваш способ меня не устраивает.
мне нужно проверить все найденные объекты, и выделить только те, которые удовлетворяют критерию.а критерии проверяются через бд.
Изменено: mihalych72 - 01.11.2022 02:59:33
 
Цитата
mihalych72 написал:
Ваш способ меня не устраивает.
мне нужно проверить все найденные объекты, и выделить только те, которые удовлетворяют критерию.а критерии проверяются через бд.

Читайте выше:
Цитата
Денис Вицко написал:
Поиск может работать как по обобщенным условиям, так и совместно с прямо указанными объектами (SelectSample).До или после заполнения условий поиска по области Вы можете в MapFind.MapSelect добавить еще какие-то объекты с помощью метода  SelectSample .

Перебираете все объекты карты, нужные по вашему мнению заносите в TMapSelect с помощью метода SelectSample.
Либо, если все условия для выделения объектов находятся в БД, то рациональнее сначала там составить список подходящих объектов и уже по этому списку искать объекты на карте и их добавлять для выделения в SelectSample.

А далее выделение никак не меняется. Используете либо штатные возможности TMapView/TMapScreen:
Цитата
Денис Вицко написал:
mvMap.SetViewSelected(false, clRed);  mvMap.SetObjSelected(MapFindByRect.MapSelect, clRed, true);

Либо выделяете сами:
Цитата
Денис Вицко написал:
Вы можете выполнить выделение нескольких отдельных списков объектов, задав каждому свой цвет, с помощью метода procedure
TMapView.DoViewSelect(Select : TMapSelect; color:COLORREF);
Однако такое выделение придется самостоятельно "восстанавливать" после перерисовки карты.
 
Денис. Спасибо за помощь.
с поиском пока проблема нет.
проблемы с выделением есть, и они странные.
то работает как надо, то глючит.
по большому счету я сам виноват - не до конца понимаю как и что вызвать.
осваиваю...
 
Цитата
Денис Вицко написал:
Вы можете выполнить выделение нескольких отдельных списков объектов, задав каждому свой цвет, с помощью метода procedure TMapView.DoViewSelect(Select : TMapSelect; color:COLORREF);Однако такое выделение придется самостоятельно "восстанавливать" после перерисовки карты.
спасибо. проверю

Однако такое выделение придется самостоятельно "восстанавливать" после перерисовки карты. - не понимаю.
что именно восстанвливать?
повторять DoViewSelect ?

сейчас наткнулся на такое:
когда выполняется поиск, приходится объекты поиска разрушать и создавать заново.
если делать только Clear/ClearAll и сопутствующее - не всегда работает как надо.
не нашел метод, который сбрасывает критерии поиска в исходному. проще пересоздать объект.
Изменено: mihalych72 - 01.11.2022 12:42:20
 
Цитата
mihalych72 написал:
Однако такое выделение придется самостоятельно "восстанавливать" после перерисовки карты. - не понимаю.что именно восстанвливать?повторять DoViewSelect ?

Да. Про заданные извне выделения компонент не помнит. После любой перерисовки карты выделение будет потеряно, надо заново вызывать DoViewSelect.

Цитата
mihalych72 написал:
сейчас наткнулся на такое:

Как правило, условия поиска в исходном состоянии - это отсутствие ограничений, то есть все объекты всех открытых карт.
Далее, накладывая какие либо ограничения, можно ограничить выборку.

Например:
Цитата

// выключить все карты из поиска
MapSelect.MapSites[-1] := false;
// включить конкретную (1) карту - поиск только по ней
MapSelect.MapSites[-1] := false;

// либо
// Установить доступность только тех карт для участия в поиске/выделения, для которых доступен
// хотя бы один объект (была выполнена функция SelectSample)
MapSelect.SetSiteEnabledForSample;
 
Цитата
mihalych72 написал:
по большому счету я сам виноват - не до конца понимаю как и что вызвать.
осваиваю...

Пользуйтесь справочными материалами,
примерами из состава GIS ToolKit

Можно также подать заявку на обучение.
В этом году плановые курсы по GIS ToolKit уже прошли, но могут быть и дополнительные по мере набора группы на обучение.
 
Денис. Вопрос такой:
когда мне нужно найти объект на карте по Key, как мне лучше искать:
так?
fMapFind.MapSelect.SetSelectKey( aKey, aKey);

или так?
fMapFind.MapSelect.KeyObject( StrToInt( aKey) := true;

я делаю по первому варианту, а сброс делаю fMapFind.MapSelect.SetSelectKey( -1, -1)
но я видел в других проектах поиск делали через fMapFind.MapSelect.KeyObject.
сбрасывать фильтр для новых поисков тогда так: fMapFind.MapSelect.KeyObject( StrToInt( aKey) := false ?

сейчас сброс фильтра делаю пересозданием объекта MapFind.

такой код не всегда помогал:
procedure TGTK_MapFindHelper.Reset( aClearSemantic: boolean = True);
begin
 { сброс поиска объектов.
   этот метод нужно вызывать перед началом нового поиска. }
fMapFind.Active := false;
fMapFind.FindPoint := false;
fMapFind.MapSelect.ClearAll;
fMapFind.MapSelect.ClearSampleAll;
// fMapFind.MapObj.Style := OS_NORMAL;

 // включить объекты по внешнему коду и локализации
// fMapFind.MapSelect.Excode[-1,OL_SQUARE] := true;

fMapFind.MapSelect.SiteNumber := 0;   // основная карта
fMapFind.MapSelect.SetSelectKey( -1, -1);   // доступ ко всем объектам (по ключам)
fMapFind.MapSelect.UnselectSeekArea(-1);  // сбросим область если была
 if aClearSemantic
  then fMapFind.MapSelect.ClearSemantic;
end;
 
при поиске и выделении обнаружилось следующее:
сейчас делаю так (кусок кода):        // ищем объект на карте по xMapObjKey

       if xFinderMapObjKey.Find_ByKey( xMapObjKey) then begin
         // объект найден
         // ищем все ПТ, прилегающие к найденному объекту xMapObjKey
         xFinderPT:= TGTK_MapFindHelper.Create( mvMap);
         try
           // ищем оъекты ПТ, пересекающие найденный объект по xMapObjKey
           if xFinderPT.Select then begin
             // перебираем найденные ПТ
             while NOT xFinderPT.EOF do begin
               // проверяем пересечение ПТ и объекта xMapObjKey
               MapCheckInside_Find_MKD.ObjectIn1 := xFinderMapObjKey.MapFindObj;
               MapCheckInside_Find_MKD.ObjectIn2 := xFinderPT.MapFindObj;
               case MapCheckInside_Find_MKD.CheckObjects of
                 // объекты должны только пересекаться
                 CHI_CROSS: begin
                       // сохраняем
                       // выделяем объект на карте
                       xFinderPT.SelectSample( true);   // это макрос -> fMapFind.MapSelect.SelectSample(...)
                       xFinderPT.MapFindObj.Center;

                       // фиксируем ПТ в МКД
                       xSZTPDataMKD.AddPT( Format( 'ПТ = %d',[ xFinderPT.MapFindObj.Key]),
                                           xFinderPT.MapFindObj.Key,
                                           xFinderPT.MapFindObj.Square);
               
                       Memo1.Lines.Add(
                         format(  #13#10'--[ ПТ ]----------------'
                                 +#13#10'Key = %d (%s)'
                                 +#13#10'ExCode (классификатор) = %d'
                                 +#13#10'Площадь = %f',
                                 [ xFinderPT.MapFindObj.Key,
                                   xFinderPT.MapFindObj.KeyName,
                                   xFinderPT.MapFindObj.ExCode,
                                   xFinderPT.MapFindObj.Square]));
                     end;
               end;//case//
               xFinderPT.Next;
             end;//while//
           end;
           // выделяем все найденные ПТ
           xFinderPT.MapFindObj.ColorImage := clYellow;
           xFinderPT.MapFindObj.ThickLine := 5;
           mvMap.SetViewSelected( false, xFinderPT.MapFindObj.ColorImage);//clGreen);
           mvMap.SetObjSelected( xFinderPT.MapFind.MapSelect, xFinderPT.MapFindObj.ColorImage, true);
           finally//              xFinderPT.Free;    <---- проблема тут          end;
       end;
       finally
         xFinderMapObjKey.Free;
     end;

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

в итоге получилось сделать выделение найденных объектов разными цветами без DoViewSelect.
Изменено: mihalych72 - 01.11.2022 21:03:48
 
Цитата
mihalych72 написал:
Денис. Вопрос такой:когда мне нужно найти объект на карте по Key, как мне лучше искать:так?
Добрый день!
Рекомендуем пройти обучающий курс Геоинформационные технологии Панорама. Инструментарий разработчика GisToolKit (Windows).
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



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

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