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

Не считает пересечение оверлейная функция

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 4 След.
RSS
Не считает пересечение оверлейная функция, TMapOverlay
 
Цитата
Александр Кружков написал:
cntOverlapTest
Изменено: Сергей Викторович - 17.05.2021 16:09:25
 
Цитата
Andrey Gheleznyakov написал:
Пример использования функции cntOverlapTest приведено в примере \MapOverlay.
procedure TfrmOvl.btnCntTestClick(Sender: TObject);
var
 parm1 : TPROCESSPARM;
 hsitenew : HSITE;
 ll,tt,retfunc : integer;
begin

 ll := frmOvl.Left + 10;
 tt := frmOvl.Top + btnFindCrossObj.Top + 120;
 temp.Style := OS_NOVIEW;
 objIn.Style := OS_NOVIEW;

 if (temp.Key = 0) or (objIn.Key = 0)
   then begin
     ShowMessagePos('Выберите на карте шаблон и обрабатываемый объект!', ll, tt);
     exit;
   end;
 // создадим временную карту для размещения результата пересечения
 // можно создавать и постоянную
 hsitenew := mapCreateAndAppendTempSite(mvMap.MapHandle, nil);
 if (hsitenew = 0)
   then begin
     ShowMessage('Временная карта для размещения результата не создана!');
     exit;
   end;

 fillchar(parm1, sizeof(TPROCESSPARM), 0);
 parm1.Map := mvMap.MapHandle;
 parm1.Site2 := hsitenew;

 RetFunc := ovlObj.cntOverlapTest(4, @parm1, 0);

 if (RetFunc = 0)
   then begin
     ShowMessage('Ошибка при создании пересечений!');
     exit;
   end;

  mvMap.Repaint;

end;

Где здесь объект пересечения, чтобы посчитать его площадь?
Изменено: Сергей Викторович - 17.05.2021 16:08:08
 
Объекты пересечения записываются в карту parm1.Site2.

//------------------------------------------------------------------
// ПАРАМЕТРЫ ОБРАБОТКИ ПЕРЕСЕЧЕНИЙ МЕТРИКИ ОБЪЕКТОВ
//------------------------------------------------------------------
typedef struct PROCESSPARM
...
HMAP     Map2;              // Идентификатор открытых данных для записи результата
HSITE    Site2;             // Новая карта для записи обработанных объектов
Изменено: Александр Кружков - 17.05.2021 17:16:50
 
Для использования cntOverlapTest в режиме х32 требуется версия инструментария не ниже 13.3.3.2
 
Цитата
Andrey Gheleznyakov написал:
Для использования cntOverlapTest в режиме х32 требуется версия инструментария не ниже 13.3.3.2
Понятно, проверим.
Изменено: Сергей Викторович - 18.05.2021 12:09:18
 
Цитата
Александр Кружков написал:
Объекты пересечения записываются в карту parm1.Site2.
Понятно, дальше уже дело наше, найти объект пересечения и вычислить его площадь?
 
Да, на указанной карте буду созданы все пересечения. С ними можно работать через компонент поиска TMapFind
 
Пример вызова новой функции:

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

OverlapTest(4, MapView.MapHandle, 0, 0, MapView.MapSites[1].SiteHandle, 0, 0, 0, 0, 0, 0);

2.Если открыта карта исходная в MapView1 и открыта карта для результатов пересечений в MapView2, то для получения всех пересечений двух объектов в виде служебного объекта параметры вызова будут следующими:

OverlapTest(4, MapView1.MapHandle, MapView2.MapHandle, 0, 0, 0, 0, 0, 0, 0, 0);

 
Сделали так:

procedure RaschetSanitObjects;
Var
k : integer;
res : integer;
parm1 : TPROCESSPARM;
hsitenew : maptype.HSITE;
retfunc : integer;
MapCount : integer;
ObjSiteCount : integer;
begin

form_main.MapFind1.Center;
ShowMessage ('найден объект шаблон = '+form_main.MapFind1.MapObj.ObjName); // Здесь все хорошо

ExCode := 10000040;
ShowMessage ('ExCode = '+IntToStr(ExCode));

form_main.MapObj1.Style := OS_SELECT;
form_main.MapObj2.Style := OS_SELECT;
form_main.MapObj3.Style := OS_SELECT;

// создадим временную карту для размещения результата пересечения
hsitenew := mapCreateAndAppendTempSite(form_main.mvMap.MapHandle, nil);  // Здесь все хорошо
fillchar(parm1, sizeof(TPROCESSPARM), 0);
parm1.Map := form_main.mvMap.MapHandle;
parm1.Site2 := hsitenew;

// ищем обрабатываемый объект
form_main.MapFind2.Active := false;
form_main.MapFind2.FindPoint := false;
form_main.MapFind2.MapSelect.Clear;
form_main.MapFind2.MapObj.Style := OS_SELECT;
form_main.MapFind2.MapSelect.SelectSeekArea(-1,form_main.MapFind1.MapObj,1,0,0,0,0);
form_main.MapFind2.MapSelect.Excode[-1,OL_SQUARE] := false;
form_main.MapFind2.MapSelect.Excode[ExCode,OL_SQUARE] := true;
form_main.MapFind2.Active := true;
form_main.MapFind2.First;
form_main.MapFind2.Center;
ShowMessage ('найден обрабатываемый объект = '+form_main.MapFind2.MapObj.ObjName);  // Здесь все хорошо

While not form_main.MapFind2.Eof do
begin

RetFunc := form_main.ovlObj.cntOverlapTest(4, @parm1, 0);

ShowMessage ('RetFunc = '+IntToStr(RetFunc));  // Здесь все хорошо равно 1

form_main.MapFind3.Active := false;
form_main.MapFind3.FindPoint := false;
form_main.MapFind3.MapSelect.Clear;
form_main.MapFind3.MapObj.Style := OS_SELECT;
form_main.MapFind3.MapSelect.Excode[-1,OL_SQUARE] := false;
form_main.MapFind3.MapSelect.Excode[1000000002,OL_SQUARE] := true;
form_main.MapFind3.Active := true;
form_main.MapFind3.First;
form_main.MapFind3.Center;

ShowMessage ('найден объект пересечения= '+form_main.MapFind3.MapObj.ObjName); // Здесь ищется объект ВЫДЕЛЕНИЕ ПЛОЩАДНЫХ,
т.к. похоже именно этот условный знак используется ядром для указания на объект пересечения?

ShowMessage ('площадь пересечения= '+FloatToStr(form_main.MapFind3.MapObj.Square)); // Но здесь почему площадь равна нулю?

If RetFunc = 0 then
break;

ObjSiteCount := mapGetSiteObjectCount(form_main.mvMap.MapHandle,form_main.mvMap.MapSites[1].SiteHandle);

ShowMessage ('ObjSiteCount = '+IntToStr(ObjSiteCount)); // Здесь тоже не понятно почему на временной пользовательской карте 2 объекта, хотя пересечение создает только один объект?

form_main.MapFind2.Next;
end;
form_main.mvMap.MapSites.MapSites[1].DeleteSite;

end;

Что я не понимаю?
 
При смешивании способа работы с картой (где компоненты, где прямые вызовы АПИ ГИС-ядра mapCreateAndAppendTempSite) могут получаться такие артефакты, при которых компоненты не могут узнать, что изменился состав карт и т.п. ПРичина может быть в этом. Например не совсем очевидно для какой карты устанавливаются условия поиска. Попробуйте для form_main.MapFind3.MapSelect.SiteNumber установить явно номер карты, для которой ищете. Также в MapSelect надо указать на каких картах ищете, так как после создания временной карты искать будет уже по двум.
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



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

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