 |
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 не замечал  |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|