2016-07-06 2 views
0

Я работаю в ArcMap. У меня есть класс класса объектов (полилиния), в котором есть точки. Для каждой точки я хочу использовать ее для преобразования в геометрию и поместить ее в отдельную таблицу атрибутов слоев; под столбцом поля формы.Ввод переменной IPoint в IGeometry

Я также пытаюсь выполнить другие вычисления в столбце поля Shape в таблице (например, расстояние между точками), и я получаю сообщение об ошибке «Операция была предпринята на пустой геометрии». Это заставляет меня думать, что я не правильно вставляю значение в таблицу. Кроме того, это заставляет меня полагать, что я не правильно выбрасываю или не создаю переменную IGeometry.

Кроме того, когда я пытаюсь посмотреть таблицу атрибутов, он показывает PointZM в столбце поля «Shape», однако при просмотре карты я не вижу никаких точек в Arcmap. Мой код ниже.

IFeatureLayer _SelectedLayer = MultiItemList._CapturedFeatureLayer; 
IFeatureClass _SelectedFeatClass = _SelectedLayer.FeatureClass; 

IDataset _SelectedFeatureDataset = (IDataset)_SelectedFeatClass; 
IWorkspace _SelectedWorkspace = (IWorkspace)_SelectedFeatureDataset.Workspace; 
string _SelectedPath = _SelectedWorkspace.PathName; 

IFeature _mySelectedFeature = _SelectedFeatClass.GetFeature(0); 
IGeometry _theGeometry = _mySelectedFeature.Shape as IGeometry;  

IPolyline _PolyLine = (IPolyline)_theGeometry;     
IPointCollection _pointsCollection = (IPointCollection)_PolyLine; 

if (_pointsCollection.PointCount>=2)    
{ 
    IEnumVertex2 _enumVertex = _pointsCollection.EnumVertices as IEnumVertex2; 
    IPoint _queryVertex = new PointClass(); 
    _enumVertex.Reset();               
    IPoint _outVertex;              
    int partIndex; 
    int vertexIndex; 
    _enumVertex.Next(out _outVertex, out partIndex, out vertexIndex); 

    while (_outVertex != null) 
    { 
    ITable LeveePointsTable = (ITable)LeveePoints_featureClass; 
    int ShapeIndex = LeveePointsTasble.FindField("Shape"); 
    IRow LeveePointsRow = LeveePointsTable.CreateRow(); 

    // trying to cast IPoint to IGeometry 
    IGeomerty _myPoints = (Igeometry)_outVertex 

    LeveePointsRow.set_Value(ShapeIndex, _MyPoints); 
    } 
} 

Любая помощь по этой теме была бы весьма признательна. Заранее спасибо.

+0

Я собираюсь предположить, что вы установили точку останова после этой строки (она не будет компилироваться по крайней мере по трем разным причинам, но, возможно, вы ее перепечатали): 'IGeomerty _myPoints = (Igeometry) _outVertex'. Когда вы это сделали, было ли '_myPoints' пустым? Еще один момент для размышления заключается в том, реализует ли фактический тип выполнения _outVertex «IGeometry». Вы проверили это, да? –

+0

Да, _outVertex (IPoint) реализует IGeometry. С линией: «IGeomerty _myPoints = (Igeometry) _outVertex» Я могу использовать MessageBox, чтобы вывести координату X и Y переменной _outVertex, и она отобразит их. Плюс я не получаю ошибку кастинга в этой строке. Я не инициализировал переменную «_myPoints» ни к чему. Возможно, я должен сначала инициализировать его нулевым. – user1898629

+0

Нет, не инициализируйте '_myPoints' значение null; вы уже инициализируете его '(IGeometry) _outVertex', и это все, что вам нужно. –

ответ

0

Я хотел бы сделать следующее:

  1. попытаться получить геометрию непосредственно от объекта IPointCollection, что-то вроде этого:

    for (int i = 0; i < pointCollection.PointCount; i++) 
    { 
        var p = pointCollection.get_Point(i); 
    } 
    
  2. Применить геометрию к свойству формы, используя IFeature интерфейс:

    ((IFeature)row).Shape = p; 
    

BTW: Если вы создаете функцию внутри класса объектов, почему бы не использовать интерфейсы IFeature и IFeatureClass, а не ITable и IRow? Существует множество проблем с использованием строки «Shape», чтобы получить поле формы, поскольку имя зависит от типа базы данных.

0

В вашем коде есть несколько вещей, о которых я не буду упоминать в комментариях, чтобы их было легче читать.

Прежде всего, вы должны окончательно получить результаты поиска по полю. Выполнение этого в цикле не рекомендуется.

Однако - и это второй пункт - вам не нужно искать поле формы, вы можете просто взять геометрию из класса featureclass - нет необходимости бросать на ITable.

Третья ваша петля никогда не заканчивается, так как ваша ссылка на _outVertex всегда одинакова. Я предполагаю, что вы хотите получить следующую вершину в своей коллекции, используя _enumVertex.Next(out _outVertex, out partIndex, out vertexIndex).

В-четвертых вам не нужно бросить в IGeometry, как IPoint должны уже унаследуют, что интерфейс. Таким образом, все реализующие последние должны также неявно реализовать прежний интерфейс.

Пятый и последний вы можете напрямую получить доступ и перебрать IPointCollection без литья в IEnumVertex.

Так после того, как сказал этот код может быть упрощен следующим образом:

for(int i = 0; i < _pointsCollection.PointCount && _pointsCollection.PointCount >= 2; i++) 
{ 
    IFeature newFeature = LeveePoints_featureClass.CreateFeature(); 
    // further attributes on the feature 

    newFeature.Shape = _pointsCollection.get_Point(i); 
} 

Во всяком случае, я сомневаюсь, что все это будет на самом деле решить проблемы, как обновления не автоматически отражается в представлении - в вашем случае ArcMap - потому что они внутренне кэшированы, чтобы избежать массового перерисовки всего экрана после каждого обновления. Чтобы нарисовать эти обновления с наличных денег, вы можете использовать IActiveView.PartialRefresh.

Смежные вопросы