  | 
				www.integro.ru ЦСИ ИНТЕГРО   
				 | 
			 
		 
		 
	
		| Предыдущая тема :: Следующая тема   | 
	 
	
	
		| Автор | 
		Сообщение | 
	 
	
		oablohin
 
 
  Зарегистрирован: 04.12.2012 Сообщения: 2 Откуда: Екатеринбург
  | 
		
			
				 Добавлено: Вт 04 Дек 2012 16:04    Заголовок сообщения: изменение координат объекта. объекты пропадают. | 
				     | 
			 
			
				
  | 
			 
			
				Всем доброго времени суток!
 
Возникла необходимость пересчитать координаты объектов.
 
Для этого был написан вот такой простой метод:
 
 	  | Код: | 	 		  
 
        private void RecalculateObject(IIngeoApplication ingeoApplication, IIngeoMapObject mapObject)
 
        {
 
            foreach (IIngeoShape ingeoShape in mapObject.Shapes)
 
            {
 
                IIngeoContour calculatedContour = (IIngeoContour) ingeoApplication.CreateObject(TIngeoObjectClass.inocContour, null);
 
                foreach (IIngeoContourPart contourPart in ingeoShape.Contour)
 
                {
 
                    var calculatedPart = calculatedContour.Insert();
 
 
                    for (int i = 0; i < contourPart.VertexCount; ++i)
 
                    {
 
                        double originalX, originalY, convexity, calculatedX, calculatedY;
 
                        contourPart.GetVertex(i, out originalX, out originalY, out convexity);
 
 
                        CalculateCoords(originalX, originalY, out calculatedX, out calculatedY);
 
 
                        calculatedPart.InsertVertex(-1, calculatedX, calculatedY, convexity);
 
                    }
 
                    calculatedPart.Closed = contourPart.Closed;
 
                }
 
 
                ingeoShape.Contour.Clear();
 
                ingeoShape.Contour.AddPartsFrom(calculatedContour);
 
            }
 
        }
 
 | 	  
 
Вызывается этот метод так:
 
 	  | Код: | 	 		  
 
                    foreach (IIngeoArea ingeoArea in ingeoDb.Areas)
 
                    {
 
 
                        foreach (IIngeoMap ingeoMap in ingeoArea.Maps)
 
                        {
 
                            if (ingeoMap.MapType == TIngeoMapType.inmtVector)
 
                            {
 
                                foreach (IIngeoLayer ingeoLayer in ((IIngeoVectorMap) ingeoMap).Layers)
 
                                {
 
                                    IIngeoMapObjects context = ingeoDb.MapObjects;
 
 
                                    IIngeoMapObjectsQuery query = context.QueryByRect(new object[] {ingeoLayer.ID},
 
                                                                                      selectedArea.X1, selectedArea.Y1,
 
                                                                                      selectedArea.X2, selectedArea.Y2,
 
                                                                                      false);
 
                                    int count = 0;
 
                                    int totalCount = 0;
 
                                    while (!query.EOF)
 
                                    {
 
                                        IIngeoMapObject mapObject = null;
 
                                        try
 
                                        {
 
                                            mapObject = context.GetObject(query.ObjectID);
 
                                        }
 
                                        catch (Exception)
 
                                        {
 
                                            query.MoveNext();
 
                                            continue;
 
                                        }
 
 
                                        try
 
                                        {
 
                                            RecalculateObject(mapProvider.aMapX.Ingeo, mapObject);
 
                                            ++count;
 
                                            ++totalCount;
 
 
                                            if (count == 99)
 
                                            {
 
                                                context.UpdateChanges();
 
                                                context = ingeoDb.MapObjects;
 
                                                count = 0;
 
                                            }
 
 
                                        }
 
                                        catch (Exception ex)
 
                                        {
 
                                            MessageBox.Show(ex.Message);
 
                                            context.DropChanges();
 
                                            context = ingeoDb.MapObjects;
 
                                        }
 
 
 
                                        query.MoveNext();
 
                                    }
 
 
                                    if (totalCount > 0)
 
                                    {
 
                                         context.UpdateChanges();
 
                                        MessageBox.Show(string.Format("Слой {0} пересчитан!", ingeoLayer.Name));
 
                                    }
 
                                }
 
                            }
 
                        }
 
 
                    }
 
 | 	  
 
Метод  CalculateCoords работает надежно, все координаты пересчитывает верно. 
 
Размеры территории я выставил такие, что и исходные, и пересчитанные объекты попадают в нее (на самом деле по-разному экспериментировал, проблема сохраняется).
 
Ведет себя это так: отлично пересчитывает некоторое (довольно продолжительное) время, объекты передвигаются, куда им и положено. А затем, когда слой почти полностью пересчитан, большая часть объектов исчезает. Буквально, были на карте в окне ИнГео, обновил окно - и пропали. Осталась лишь малая их часть, причем внутри каких-то квадратных секторов.
 
Подозреваю, что это связано со структурой данных ИнГео, где объекты хранятся по секторам.
 
Как лечить?
 
Заранее спасибо за внимание. | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		APopov
 
 
  Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
  | 
		
			
				 Добавлено: Ср 05 Дек 2012 18:11    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Из нашего опыта:
 
при работе с ингео объектами через .NET в дебаг режиме у нас изредка наблюдалось обнуление X или Y  у некотрых координат (код тоже был не сложный), мы грешим на сборщик мусора или на сбои Interop-ов, которые мистическим образом портят память под массивом координат.
 
 
функция AddPartsFrom в старых версиях ингео глюкала и мы сейчас ею не прользуемся - написали костыль с аналогичной функциональностью.
 
 
В вашем случае попробуйте не очищать старые контуры и добавлять новые преобразованные, а преобразуйте "на месте" :
 
 	  | Код: | 	 		  contourPart.GetVertex(i, out originalX, out originalY, out convexity); 
 
CalculateCoords(originalX, originalY, out calculatedX, out calculatedY); 
 
contourPart.SetVertex(i, calculatedX, calculatedY, convexity); 
 
 | 	  
 
будет даже быстрее _________________ ОАО "Самара-Информспутник",
 
   инженер-программист Попов Артем | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		oablohin
 
 
  Зарегистрирован: 04.12.2012 Сообщения: 2 Откуда: Екатеринбург
  | 
		
			
				 Добавлено: Чт 06 Дек 2012 09:49    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Оказалось, проблема действительно в структуре хранения пространственных данных Ингео.
 
Звонок в службу поддержки Интегро помог найти рецепт: после изменения размеров территории необходимо базу данных пропустить через оптимизатор БД Ингео, и только после этого пересчитывать координаты.
 
 	  | Цитата: | 	 		  
 
Из нашего опыта: 
 
при работе с ингео объектами через .NET в дебаг режиме у нас изредка наблюдалось обнуление X или Y у некотрых координат (код тоже был не сложный), мы грешим на сборщик мусора или на сбои Interop-ов, которые мистическим образом портят память под массивом координат. 
 
 
функция AddPartsFrom в старых версиях ингео глюкала и мы сейчас ею не прользуемся - написали костыль с аналогичной функциональностью. 
 
 
В вашем случае попробуйте не очищать старые контуры и добавлять новые преобразованные, а преобразуйте "на месте" : 
 
Код:
 
contourPart.GetVertex(i, out originalX, out originalY, out convexity); 
 
CalculateCoords(originalX, originalY, out calculatedX, out calculatedY); 
 
contourPart.SetVertex(i, calculatedX, calculatedY, convexity); 
 
 
будет даже быстрее
 
 | 	  
 
Спасибо за информацию, приму к сведению.
 
P.S.Особых глюков в работе с Ингео через .Net не замечал   | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
  | 
   
 
		 |