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
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 рекомендуется еще и потом, что в нем можно задать величину допуска.