  | 
				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    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Прошу прощения!Поторопился!Видимо где-то в коде была ошибка. После того, как изменил логику и полностью переделал этот кусок, все стало работать. Жалко только, что я эту часть кода сразу утром убил и все написал по другому. Теперь не ясно где была ошибка.
 
Всем большое спасибо!
 
На ответ особо не надеялся - отпуска!
 
Лето в разгаре!   | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
  | 
   
 
		 |