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

изменение координат объекта. объекты пропадают.

 
Начать новую тему   Ответить на тему    Список форумов 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 не замечал Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

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


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