Снова Оверлейные операции

0 голосов
спросил 24 Окт, 06 от filippov70 (5,320 баллов) в категории Программные продукты Esri

В продолжение моей темы Оверлейные операции

При большом количестве полигонов, которыми нужно вырезать области в исходном, при попытке удалить  feature "полигона-дырки" происходит эксепшн вот такой

[System.Runtime.InteropServices.COMException] = {"Error HRESULT E_FAIL has been returned from a call to a COM component."}

Source = "ESRI.ArcGIS.Geodatabase"

StackTrace = "   at ESRI.ArcGIS.Geodatabase.IFeature.Delete()\r\n   at ConverterCadastr.clsConvert.CutOrJoinPart(IFeature pFeature, IFeature pPartFeature) in D:\\DOC\\Visual Studio 2005\\Projects\\clsConvert.cs:line 381"

TargetSite = {Void Delete()}

_HResult = -2147467259

_xcode = -532459699

А вот код


        private bool CutOrJoinPart (IFeature pFeature,  IFeature pPartFeature)
        {
            try
            {
                IRelationalOperator pRelOp = (IRelationalOperator)pFeature.Shape;
                ITopologicalOperator pTopoOp = (ITopologicalOperator)pFeature.Shape;

                if (pRelOp != null && pTopoOp != null)
                {
                    IGeometry pHostGeometry = pFeature.Shape as IGeometry;
                    IGeometry pSlaveGeometry = pPartFeature.Shape as IGeometry;

                    if (pRelOp.Contains(pSlaveGeometry) == true || (pRelOp.Crosses(pSlaveGeometry) == true))
                    {
                            pHostGeometry = pTopoOp.Difference(pSlaveGeometry);
                            pFeature.Shape = pHostGeometry;
                            pFeature.Store();
                            pPartFeature.Delete();//вот тутаAngry
                            return true;                 

а вызов этой процедуры происходит так

                   for (Int32 l = 0; l < h; l++)
                    {
                        if (FeatureArray[0] != null && FeatureArray[l + 1] != null)
                        {
                            if (CutOrJoinPart(FeatureArray[0], FeatureArray[l + 1]) == true)
                            {
                               
                            }
                            else
                            {

                            }
                        }

Работат при малом количестве "полигонов дырок"

Censored

3 Ответы

0 голосов
ответил 26 Окт, 06 от Гость (210,080 баллов)
Вы знаете , я сталкивался примерно с такой же проблемой. Правда у меня возникало сообщение о невозможности выполнения оверлейных операций со сложной геометрией. Я решил эту проблему следующим образом ->  разобрал полигоны на внешние и внутренние кольца , создал из них полигоны и уже с ними выполнял оверлейные процедуры.
Желаю удачи.
0 голосов
ответил 27 Окт, 06 от filippov70 (5,320 баллов)
Большое спасибо.

Да, я тоже думаю что фичи из "полигонов дырок" делать не надо
Понавырезать в исходном полигоне ими и задать нужной фичи эту геометрию, с дырами.
Пока не пробывал код, не было времени
0 голосов
ответил 14 Ноя, 06 от filippov70 (5,320 баллов)
Так вот, если кому интересно, как делать дырки в полигонах или прибавлять один к другому

                        IPolygon pPoly = pFeature.Shape as IPolygon;//pFeature  - исходный, pPartGeometry - "дырка"
                        ISegmentCollection pSegColl = pPartGeometry as ISegmentCollection;

                        ISegmentCollection pRingColl = new RingClass();
                        pRingColl.AddSegmentCollection(pSegColl);

                        IGeometryCollection pGeoColl = (IGeometryCollection)pPoly;
                        object objectBefore = System.Reflection.Missing.Value;
                        object objectAfter = System.Reflection.Missing.Value;

                        pGeoColl.AddGeometry((IGeometry)pRingColl, ref objectBefore, ref objectAfter);
                       

                        pFeature.Shape = pGeoColl as IGeometry;
                        pFeature.Store();
                        pPartGeometry = null;

                       
                        return true;

проверено на большом количестве объектов ~10000
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...