Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Пересечение объектов

 
Начать новую тему   Ответить на тему    Список форумов 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]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Михаил Власов



Зарегистрирован: 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    Заголовок сообщения: Ответить с цитатой

Прошу прощения!Поторопился!Видимо где-то в коде была ошибка. После того, как изменил логику и полностью переделал этот кусок, все стало работать. Жалко только, что я эту часть кода сразу утром убил и все написал по другому. Теперь не ясно где была ошибка.
Всем большое спасибо!
На ответ особо не надеялся - отпуска!
Лето в разгаре! Very Happy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB