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

Как определить что два объекта на карте полностью равны

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

Использую компонент TMapCheckInside

 If (form_main.MapCheckInside1.CheckObjects = CHI_FIRSTIN) or
 (form_main.MapCheckInside1.CheckObjects = CHI_TOUCHIN) then
 begin

Два объекты находятся друг под другом и полностью равны.

Можно ли, использую вышеназванный компонент определить, что эти два объекта равны?
Изменено: Сергей Викторович - 19.08.2022 16:32:38
 
TMapCheckInside.CheckObjects, согласно описанию, вернет признак что объекты пересекаются, либо один входит в другой.
Ни то, ни другое не гарантирует, что метрика объектов совпадает.

Для определения совпадает ли метрика объектов или нет - предназначен метод TMapObj.CompareMetric

Цитата
//==========================================================­====================
// Проверить точки объектов на совпадение в заданном допуске
// ahobj - идентификатор второго объекта,
// delta - допуск в метрах на местности для сравнения координат точек объекта на совпадение
// Если число точек объектов совпадает и координаты отличаются в пределах заданного
// допуска, то возвращается ненулевое значение
// При ошибке возвращает 0
//==========================================================­====================
function TMapObj.CompareMetric(ahobj : HOBJ; adelta : double): Integer;
 
Цитата
Денис Вицко написал:
Для определения совпадает ли метрика объектов или нет - предназначен метод TMapObj.CompareMetric
Да, Денис спасибо.

Еще вопрос:

Объект 2 находится внутри объекта 1
и касается подобъекта объекта 2

Ни один из нижеперечисленных методов не детектирует это

If (form_main.MapCheckInside1.CheckSubjects = CHI_FIRSTIN) or
 (form_main.MapCheckInside1.CheckSubjects = CHI_TOUCHIN) or
 (form_main.MapCheckInside1.CheckObjects = CHI_TOUCHIN) then
 begin
...
 end;

Как определить что объект 1 находится внутри объекта 2
1.PNG (14.57 КБ)
 
CheckSubjects - это не свойство, а метод. То есть каждый раз, когда Вы его вызываете, выполняется процедура расчета.
Рекомендую возвращаемое этим методом значение присвоить переменной и далее сравнивать ее. В вашем случае процесс расчета взаимного положения объектов выполняется трижды!

Какое значение в итоге возвращает этот метод?

Если посмотреть исходный код метода, можно увидеть, какие значения он может вернуть (варианта CHI_TOUCHIN в нем не предусмотрено):

Код
//=================================================================
// Определение взаиморасположения объектов (включая подобъекты)
//=================================================================
function TMapCheckInside.CheckSubjects;
begin
  case mapCheckInsideObjectEx(FObjIn1.ObjHandle, FObjIn2.ObjHandle) of
     1 : Result := CHI_FIRSTIN;
    -1 : Result := CHI_FIRSTINSUBJ;
     2 : Result := CHI_SECONDIN;
    -2 : Result := CHI_SECONDINSUBJ;
     3 : Result := CHI_CROSS;
     4 : Result := CHI_NOCROSS;
  else
    Result := CHI_ERROR;
  end;
end;


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

Код
 // Запросить замкнутость объекта/подобъекта
 // info   - идентификатор объекта карты в памяти
 // number - номер подобъекта (для объекта - равен нулю)
 // Возвращает:  0 - не замкнут; не 0 - замкнут

function  mapGetExclusiveSubject(Obj : HObj; number : integer) : integer;
  stdcall external sGisAcces;
 
Денис, ваше замечание по поводу свойства и метода правильное,
и конечно будет учтено.
Но вы не ответили на вопрос, отмеченный на приложенном рисунке:
если объект 1 находиться внутри объекта 2 и касается подобъекта объекта 2,
можно ли это детектировать?
 
Цитата
Сергей Викторович написал:
Но вы не ответили на вопрос

Вы тоже не ответили на вопрос:
Цитата
Денис Вицко написал:
Какое значение в итоге возвращает этот метод?

Как я указал выше, метод TMapCheckInside.CheckSubjects не возвращает признак CHI_TOUCHIN ни при каких обстоятельствах.

Предполагаю, что вернется признак пересечения метрик объектов. Но это не факт.
Касание объектов подразумевает принадлежность одной или более соседних точек одного объекта контуру другого (при отсутствии пересечения).
Такое условие будет гарантированно выполняться только если точки участка так называемого соприкосновения одновременно являются точками метрики обоих объектов.
В противном случае точки одного объекта будут лежать на отрезке контура другого объекта только в определенной проекции, а при смене проекции контур "уедет" от анализируемых точек.

Могу ошибаться (так как задачи не знаю), но в Вашем случае "объект1 находится внутри объекта2" означает, что объект1 (без учета подобъектов) лежит внутри одного из внешних контуров объекта2 и при этом не лежит внутри внутренних подобъектов объекта2.

Могу порекомендовать использовать в цикле метод TMapCheckInside.FullCheckObjects, в ObjectIn1 поочередно задавая контуры объекта2. Для основного контура и внешних подобъектов (если объект2 будет мультиполигоном) должны быть результаты CHI_FIRSTIN или CHI_TOUCHIN, для внутренних - CHI_NOCROSS или CHI_TOUCHOUT.
Кстати, метод TMapCheckInside.FullCheckObjects рекомендуется еще и потом, что в нем можно задать величину допуска.
 
Цитата
Денис Вицко написал:
Предполагаю, что вернется признак пересечения метрик объектов. Но это не факт.
Именно так, спасибо большое, Денис.
Страницы: 1
Читают тему (гостей: 1)



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

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