 |
www.integro.ru ЦСИ ИНТЕГРО
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Владимир_И
Зарегистрирован: 19.07.2013 Сообщения: 13 Откуда: Самара
|
Добавлено: Сб 20 Июл 2013 20:57 Заголовок сообщения: Пересечение объектов |
|
|
Задача: есть объект, нужно найти все объекты из другого слоя, с которыми он пересекается. Функция:
QueryByObject с параметрами aRelationMask = aRelation = incrIntersected
выдает только те объекты, которые в результате пересечения могут изменить площадь исходного объекта. Таким образом, в результат не попадут объекты полностью накрывающие заданный объект. Т.е. функция ведет себя так, как операция пересечения объектов с панели инструментов InGeo. Но там такое поведение оправдано тем, что в результате мы хотим получить новый объект - результат пересечения. Но функция же QueryByObject не создает новых объектов, и должна, по идеи, показывать все объекты при пересечении которых результирующая площадь не равна нулю.
Проверено на InGeo 4.4.6, 4.4.10.
Кто подскажет, как мне найти все объекты, пересекающиеся с заданным? |
|
Вернуться к началу |
|
 |
Азаматов Азамат Хадисович
Зарегистрирован: 17.02.2005 Сообщения: 100 Откуда: г. Учалы, Респ. Башкортостан
|
Добавлено: Пн 22 Июл 2013 14:00 Заголовок сообщения: |
|
|
может и кривовато кодировано, но работает хорошо
Код: |
procedure SelectCrossedObjects(obj:string;crossedlar:string;res:TStringList);
var mq:IIngeoMapObjectsQuery;
larid,objid:widestring;
spi:integer;
mobj:IIngeoMapObject;
z,z1,z3:IIngeoContour;
i: Integer;
begin
if not gAddon2.ActiveDb.LayerExists(crossedlar) then
exit;
res.Clear;
z:=gAddon2.CreateObject(inocContour,0) as IIngeoContour;
mobj:=gAddon2.ActiveDb.MapObjects.GetObject(obj);
mq:=GAddon2.ActiveDb.MapObjects.QueryByRect(crossedlar,mobj.X1,mobj.Y1,mobj.X2,mobj.Y2,false);
// incrIntersected+incrContained+incrContains,incrIntersected+incrContained+incrContains);
z1:=nil;
for i := 0 to mobj.Shapes.Count - 1 do
begin
if mobj.Shapes.Item[i].DefineGeometry then
begin
z1:=mobj.Shapes.Item[i].Contour;
z.AddPartsFrom(z1);
break;
end;
end;
if z1=nil then
begin
ShowMessage('addn.SelectCrossedObjects no geometry forms!');
exit;
end;
while not mq.EOF do
begin
mq.Fetch(larid,objid,spi);
mobj:=gAddon2.ActiveDb.MapObjects.GetObject(objid);
for i := 0 to mobj.Shapes.Count - 1 do
begin
if mobj.Shapes.Item[i].DefineGeometry then
begin
z3:=mobj.Shapes.Item[i].Contour;
z.Clear;
z.AddPartsFrom(z1);
// ShowMessage('z='+FloatToStr(z.Square)+' z3='+FloatToStr(z3.Square));
try
z.Combine(inccAnd,z3);
// ShowMessage('z a='+FloatToStr(z.Square));
except
on e:Exception do continue;//ShowMessage('addn.SelectCrossedObjects combine error '+obj+' '+objid+':'+e.Message);
end;
if z.Square>0 then
begin
res.Add(objid);
end;
break;
end;
end;
end;
end;
| [/code] |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Вт 23 Июл 2013 13:45 Заголовок сообщения: Re: Пересечение объектов |
|
|
Владимир_И писал(а): | Задача: есть объект, нужно найти все объекты из другого слоя, с которыми он пересекается. Функция:
QueryByObject с параметрами aRelationMask = aRelation = incrIntersected
выдает только те объекты, которые в результате пересечения могут изменить площадь исходного объекта. Таким образом, в результат не попадут объекты полностью накрывающие заданный объект. Т.е. функция ведет себя так, как операция пересечения объектов с панели инструментов InGeo. Но там такое поведение оправдано тем, что в результате мы хотим получить новый объект - результат пересечения. Но функция же QueryByObject не создает новых объектов, и должна, по идеи, показывать все объекты при пересечении которых результирующая площадь не равна нулю.
Проверено на InGeo 4.4.6, 4.4.10.
Кто подскажет, как мне найти все объекты, пересекающиеся с заданным? |
Проверяли - работает.
aRelationMask = incrIntersected
aRelation = incrIntersected
Находит:
объекты, частично пересекающиеся с исходным;
объекты, лежащие внутри исходного;
объекты, внутри которых лежит исходный.
Проверяли и площадные и линейные.
Проверяли на 4.4.10 _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
Владимир_И
Зарегистрирован: 19.07.2013 Сообщения: 13 Откуда: Самара
|
Добавлено: Ср 24 Июл 2013 21:47 Заголовок сообщения: |
|
|
Прошу прощения!Поторопился!Видимо где-то в коде была ошибка. После того, как изменил логику и полностью переделал этот кусок, все стало работать. Жалко только, что я эту часть кода сразу утром убил и все написал по другому. Теперь не ясно где была ошибка.
Всем большое спасибо!
На ответ особо не надеялся - отпуска!
Лето в разгаре!  |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|