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

Как посчитать площадь пересечения

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Как посчитать площадь пересечения, TMapCheckInside
 
Здравствуйте!

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

Вышеназванные способы решаются следующим кодом:

If form_main.MapCheckInside1.FullCheckObjects(0) = CHI_CROSS then
SquareObject  := CalcCrossObjectSquare(form_main.mvMap.MapHandle, form_main.MapObj1.ObjHandle, form_main.MapObj2.ObjHandle);

If (form_main.MapCheckInside1.FullCheckObjects(0) = CHI_SECONDIN) or
(form_main.MapCheckInside1.FullCheckObjects(0) = CHI_TOUCHIN) then
SquareObject  := form_main.MapFind1.MapObj.Square;

А вот случай, если второй объект светлосерый овал находится снаружи первого прямоугольника,
при этом нужно вычислить площадь от этого овала, которая для наглядности закрашена темносерым цветом, и находится внутри прямоугольника,
да еще в светлосером овале есть подобъект.

Просьба подсказать, как в таком случаи вычислить площадь овала, которая закрашена темносерым цветом?
Если приведете код, то конечно, еще лучше.
5.bmp (126.81 КБ)
4.bmp (126.81 КБ)
3.bmp (126.81 КБ)
2.bmp (72.73 КБ)
1.bmp (72.73 КБ)
 
Цитата
Сергей Викторович написал:
А вот случай, если второй объект светлосерый овал находится снаружи первого прямоугольника,при этом нужно вычислить площадь от этого овала, которая для наглядности закрашена темносерым цветом, и находится внутри прямоугольника, да еще в светлосером овале есть подобъект.
Вы имеете ввиду площадь пересечения объекта "бублик" с объектом прямоугольник?
 
Да мне тоже интересно, в примерах (cross,ovl) такого не видел.
А как хотелось бы что-то вроде такого:
Код
sel ect st_intersection(o.geometry, p.geometry), st_area( st_intersection(o.geometry, p.geometry)  )
fr om oval o join prm p
 
Эту проблему по любому нужно будет решить.
Как что-то получиться, отпишусь.
 
Цитата
Сергей Викторович написал:
Эту проблему по любому нужно будет решить.Как что-то получиться, отпишусь.
Еще один ответ нашего специалиста:

Для нахождения пересечений площадных объектов используется функция cntOverlapTest (из cntapi.h).

// Анализ пересечений двух площадных объектов (obj1 и obj2)
// (обрабатывает мультиполигоны)
//   func - условия формирования областей
//          1 - создать объекты областей объекта obj1, расположенные снаружи obj2
//          2 - создать объекты областей объекта obj2, расположенные снаружи obj1
//          3 - создать объекты непересекающихся областей мультиполигонов obj1 и obj2
//          4 - создать объекты пересекающихся областей мультиполигонов obj1 и obj2
//          5 - создать объекты областей, покрытых обоими объектами obj1 и obj2
//   parm - параметры обработки
//   сode - внутренний код для записи областей (от 1)
//          если сode = 0, то сode = SQUARESERVINCODE
// При ошибке возвращает 0
//------------------------------------------------------------------
_VECIMP long int _VECAPI cntOverlapTest(HOBJ obj1, HOBJ obj2, long int func,
                                        PROCESSPARM & parm, long int code);

Пример вызова:

 long int (WINAPI * func)(HOBJ obj1, HOBJ obj2, long int func, PROCESSPARM& parm, long int code);    
 func = (long int (WINAPI *)(HOBJ obj1, HOBJ obj2, long int func, PROCESSPARM& parm, long int code))
           mapLoadLibrary(MAPVECEXLIB, &lib, "cntOverlapTest");

 PROCESSPARM parm;
 parm.Map  = TempSit;
 parm.Map2 = doc;
 parm.Site2 = sit;
 parm.Precision = precision;

 // Найти области пересечения двух площадных объектов
 (*func)(info1, info2, 4, parm, SquareCode);
 
Попытался использовать cntOverlapTest, не получилось.

Delphi обертка


Вызов функции
Код
procedure TfrmOvl.Button2Click(Sender: TObject);
var
  param: PROCESSPARM;
  map: HMAP;
  res: Integer;
begin
  map := mvMap.MapHandle;

  FillChar(param, sizeOf(param), 0);
  param.Map := map;
  param.Site := map;

  param.Precision := 0.01;

  if temp.SeekObject(mvMap.MapName, StrToInt(edTemplet.Text)) = 0
    then begin
      ShowMessage('Объект шаблон не найден!');
      exit;
    end;
  if objIn.SeekObject(mvMap.MapName, StrToInt(edObjIn.Text)) = 0
    then begin
      ShowMessage('Обрабатываемый объект не найден!');
      exit;
    end;

  res := cntOverlapTest(temp.ObjHandle, objIn.ObjHandle, 4, param, 0 );
end;


Возвращает 0 и пересечения не создает.
Наверное где-то ошибку сделал (что-то с описанием параметров может),
посмотрите пожалуйста.
Библиотеки х32 обновил
Страницы: 1
Читают тему (гостей: 1)



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

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