2016-07-06 23 views
0

私はArcMapで作業しています。私はポイントを持っているフィーチャクラスレイヤー(ポリライン)を持っています。それぞれの点について、それをジオメトリにキャスト/変換し、それを別のレイヤーの属性テーブルに配置する必要があります。形状フィールドの列の下に表示されます。IPoint変数をIGeometryにキャスト

テーブル内のシェイプフィールド列(ポイント間の距離など)で他の計算を試してみると、「空のジオメトリで操作しようとしました」というエラーが表示されます。これは、私がテーブルに値を正しく挿入していないと私に信じさせる。さらに、私は正しくキャストしていないとか、IGeometry変数を正しく作成していないと信じています。

また、アトリビュートテーブルを見てみると、「形状」フィールドの欄にPointZMが表示されますが、地図を見ると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

私はこの行の後にブレークポイントを設定すると仮定します。少なくとも3つの異なる理由でコンパイルされませんが、再入力したとします。 'IGeomerty _myPoints =(Igeometry)_outVertex'。あなたがそれをしたとき、 '_myPoints'はnullでしたか?熟考するもう一つのポイントは、_outVertexの実際の実行時の型が 'IGeometry'を実装しているかどうかです。あなたはそれを確認しましたよね? –

+0

はい、_outVertex(IPoint)はIGeometryを実装しています。 'IGeomerty _myPoints =(Igeometry)_outVertex'という行で、変数_outVertexのX座標とY座標を出力するためにMessageBoxを使用することができます。プラス私はこの行にキャストエラーを取得しません。私は何も変数 '_myPoints'を初期化しませんでした。おそらく、最初にnullに初期化する必要があります。 – user1898629

+0

いいえ、 '_myPoints'をnullに初期化しないでください。既に '(IGeometry)_outVertex'に初期化しています。それだけで十分です。 –

答えて

0

私は次の操作を行います:IPointCollectionオブジェクトから直接ジオメトリを取得する

  1. てみてください、このような何か:

    for (int i = 0; i < pointCollection.PointCount; i++) 
    { 
        var p = pointCollection.get_Point(i); 
    } 
    
  2. IFeatureを使用して形状特性にジオメトリを適用しますインタフェース:

    ((IFeature)row).Shape = p; 
    

ところで:フィーチャクラス内にフィーチャを作成する場合は、ITableIRowではなく、IFeatureIFeatureClassのインターフェイスを使用してください。 "Shape"文字列を直接使用して形状フィールドを取得することには多くの問題があります。名前はデータベースタイプによって異なります。

0

あなたのコードには、読みやすくするためにコメントには言及していないことがいくつかあります。

まず、フィールドを検索した結果を必ずキャッシュしてください。これをループ内で行うことはお勧めしません。

- これは2番目のポイントです。形状フィールドを検索する必要はありません。フィーチャクラスからジオメトリフィールドを取るだけで、ITableにキャストする必要はありません。

第3回ループは決して終了しません。_outVertexへの参照は常に同じです。​​を使ってコレクション内の次の頂点を取得したいとします。

第四に、あなたはすでにそのインターフェイスを継承する必要がありますIPointとしてIGeometryにキャストする必要がありますドント。したがって、後者を実装するすべてのものも暗黙のうちにが前のインターフェイスを実装する必要があります。

最後に、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を使用できます。

関連する問題