c# AE 創建的shp 在arcmap中放大不顯示處理

ArcEngine中shp中先加入要素然後刪除一部分要素後,放大圖形後不顯示的問題解決方法

(一)問題描述如下:

shp中先加入要素然後刪除一部分要素後,圖形爲什麼顯示不正常了
//------------------
我遇到這個問題,請問大家是怎麼解決的?
我的操作是:
往shp文件加入要素,
然後,再刪除一部分要素,
顯示就不正常了:
現象如下所示:
"這種情況全圖顯示時能看到所有圖形,放大到某個範圍後,某些圖形就看不到了",

其加入要素代碼如下所示:

  1. 操作加入要素的代碼如下所示: 
  2. IFeatureCursor InsertCursor = null
  3. InsertCursor = Polygonfc.Insert(true); 
  4. IGeometry newgeo = null
  5. ComUnionOperator cuOp = new ComUnionOperator(); 
  6. newgeo = cuOp.Union(FeatList.ToArray());   // 
  7. if (newgeo != null
  8.                                                 (newgeo as ITopologicalOperator).Simplify(); 
  9.                                                 newgeo.SpatialReference = sr; 
  10.                                                 //創建一個新圖斑 
  11.                                                 IFeatureBuffer featBuf = Polygonfc.CreateFeatureBuffer(); 
  12.                                                 featBuf.Shape = newgeo;         //設置幾何對象  
  13.                                                 zhfeat = new ZHFeaturePolygon(p_feat); 
  14.                                                 zhfeat.CopyField(ref featBuf);  //設置屬性值 
  15.                                                 ZhFeatureBuffer zhfeatBuf = new ZhFeatureBuffer(featBuf); 
  16.                                                 zhfeatBuf.setFieldValue("xp_bh", ""); //設爲空以防被刪除 
  17.                                                 //插入新圖斑到空間數據庫中 
  18.                                                 InsertCursor.InsertFeature(featBuf); 
  19.                                                 //記錄要刪除的原地物 
  20.                                                 del_xp_bh_List.Add(xp_bh_str); 
  21.                                                 del_xp_bh_List.Add(xp_bh_s_str); 
  22.                                                 //                                             
  23. //保存到空間庫中 
  24.                         if (InsertCursor != null
  25.                         { 
  26.                             InsertCursor.Flush(); 
  27.                             TokayWorkspace.ComRelease(InsertCursor); 
  28.                             InsertCursor = null
  29.                         } 
操作加入要素的代碼如下所示:
IFeatureCursor InsertCursor = null;
InsertCursor = Polygonfc.Insert(true);
IGeometry newgeo = null;
ComUnionOperator cuOp = new ComUnionOperator();
newgeo = cuOp.Union(FeatList.ToArray());   //
if (newgeo != null)
{
                                                (newgeo as ITopologicalOperator).Simplify();
                                                newgeo.SpatialReference = sr;
                                                //創建一個新圖斑
                                                IFeatureBuffer featBuf = Polygonfc.CreateFeatureBuffer();
                                                featBuf.Shape = newgeo;         //設置幾何對象 
                                                zhfeat = new ZHFeaturePolygon(p_feat);
                                                zhfeat.CopyField(ref featBuf);  //設置屬性值
                                                ZhFeatureBuffer zhfeatBuf = new ZhFeatureBuffer(featBuf);
                                                zhfeatBuf.setFieldValue("xp_bh", ""); //設爲空以防被刪除
                                                //插入新圖斑到空間數據庫中
                                                InsertCursor.InsertFeature(featBuf);
                                                //記錄要刪除的原地物
                                                del_xp_bh_List.Add(xp_bh_str);
                                                del_xp_bh_List.Add(xp_bh_s_str);
                                                //                                            
}
//保存到空間庫中
                        if (InsertCursor != null)
                        {
                            InsertCursor.Flush();
                            TokayWorkspace.ComRelease(InsertCursor);
                            InsertCursor = null;
                        }

  1. 操作刪除要素的代碼如下所示: 
  2. #region//刪除碎小地物操作 
  3.                         string t_del_wc = ""
  4.                         for (int i = 0; i < del_xp_bh_List.Count; i++) 
  5.                         { 
  6.                             if (t_del_wc.Trim() == ""
  7.                             { 
  8.                                 t_del_wc = "'" + del_xp_bh_List[i] + "'"
  9.                             } 
  10.                             else 
  11.                             { 
  12.                                 t_del_wc += ",'" + del_xp_bh_List[i] + "'"
  13.                             } 
  14.                         } 
  15.                         if (t_del_wc.Trim() != ""//??? 
  16.                         { 
  17.                             IQueryFilter t_del_qf = new QueryFilterClass(); 
  18.                             t_del_qf.WhereClause = "xp_bh in(" + t_del_wc + ")"
  19.                             IFeatureCursor del_featcur = Polygonfc.Update(t_del_qf, false); 
  20.                             IFeature del_feat = del_featcur.NextFeature(); 
  21.                             while (del_feat != null
  22.                             { 
  23.                                 del_featcur.DeleteFeature(); 
  24.                                 del_feat = del_featcur.NextFeature(); 
  25.                             } 
  26.                             del_featcur.Flush(); 
  27.                             TokayWorkspace.ComRelease(del_featcur); 
  28.                             del_featcur = null
  29.                             // 
  30.                             //TokayWorkspace.DeleteFeatures(Polygonfc, t_del_qf); 
  31.                         } 
  32.                         #endregion 
操作刪除要素的代碼如下所示:
#region//刪除碎小地物操作
                        string t_del_wc = "";
                        for (int i = 0; i < del_xp_bh_List.Count; i++)
                        {
                            if (t_del_wc.Trim() == "")
                            {
                                t_del_wc = "'" + del_xp_bh_List[i] + "'";
                            }
                            else
                            {
                                t_del_wc += ",'" + del_xp_bh_List[i] + "'";
                            }
                        }
                        if (t_del_wc.Trim() != "")  //???
                        {
                            IQueryFilter t_del_qf = new QueryFilterClass();
                            t_del_qf.WhereClause = "xp_bh in(" + t_del_wc + ")";
                            IFeatureCursor del_featcur = Polygonfc.Update(t_del_qf, false);
                            IFeature del_feat = del_featcur.NextFeature();
                            while (del_feat != null)
                            {
                                del_featcur.DeleteFeature();
                                del_feat = del_featcur.NextFeature();
                            }
                            del_featcur.Flush();
                            TokayWorkspace.ComRelease(del_featcur);
                            del_featcur = null;
                            //
                            //TokayWorkspace.DeleteFeatures(Polygonfc, t_del_qf);
                        }
                        #endregion

經測試,加入要素沒有問題,不刪除操作,顯示是正常的,
問題出在當執行刪除操作時,顯示就不正常了,
但另存爲shp或其他格式的數據顯示就正常;

搜索網上的解決辦法的url地址:
http://hi.baidu.com/supu_beauty/ ... 98ff54242df26f.html
http://www.cnblogs.com/sxw_cug/archive/2010/08/27/1810345.html
ARCMAP中數據放大不顯示問題
2010-07-19 21:08
     最近發現在ARCMAP中矢量數據放大不顯示問題,暴露問題狀況爲:全屏狀態下數據正常顯示,放大後反而數據不顯示了,但是可以選擇的到。一般用如下三種方法解決問題:

     1、用ArcToolbox中的Datamanagement工具下的Features中的Repair Geometry修復數據。

     2、修改文件名,儘量用英文,同時修改路徑,儘量使其短,而且儘量使用英文。

     3、如果上面兩種方法無效的情況下,在ARCMAP中打開數據,然後Editor菜單下Start Editing,然後再Stop Editing,這樣放大就可顯示,至於原因正在查找中,原理也不是太明白,待以後更新補充。
//-------------------------------------------------------
我使用第三種方法這樣放大就可顯示了!原因我也不清楚!

如果是自定義編寫的應用軟件的話,需要重啓應用軟件,再開始編輯然後停止編輯,顯示就可以了!

執行完先加入要素,然後刪除一部分要素後
再執行下面的代碼:顯示問題依然存在!
//開始編輯然後再停止編輯
            IWorkspace ws = (this.Polygonfc as IDataset).Workspace;
            IWorkspaceEdit wsEdit = ws as IWorkspaceEdit;
            if (wsEdit.IsBeingEdited() == true)
            {
                wsEdit.StopEditing(true);
            }
            wsEdit.StartEditing(false);
            wsEdit.StopEditing(true);
            //
需要重啓應用軟件,再開始編輯然後停止編輯,顯示就可以了!

各位兄弟姐妹們,這個問題已經解決了。
解決方法如下代碼所示:
問題是刪除要素的時候出現的放大顯示現象,
我對刪除要素的代碼作如下形式的修改,這個現象就沒有了:
#region//刪除碎小地物操作
                        string t_del_wc = "";
                        for (int i = 0; i < del_xp_bh_List.Count; i++)
                        {
                            if (t_del_wc.Trim() == "")
                            {
                                t_del_wc = "'" + del_xp_bh_List[i] + "'";
                            }
                            else
                            {
                                t_del_wc += ",'" + del_xp_bh_List[i] + "'";
                            }
                        }
                        if (t_del_wc.Trim() != "") 
                        {
                            //開始編輯然後再停止編輯以處理放大不能顯示的問題
                            IWorkspace ws = (this.Polygonfc as IDataset).Workspace;
                            IWorkspaceEdit wsEdit = ws as IWorkspaceEdit;
                            if (wsEdit.IsBeingEdited() == true)
                            {
                                wsEdit.StopEditing(true);
                            }
                            wsEdit.StartEditing(false);
                            wsEdit.StartEditOperation();
                            //----

                            IQueryFilter t_del_qf = new QueryFilterClass();
                            t_del_qf.WhereClause = "xp_bh in(" + t_del_wc + ")";
                            IFeatureCursor del_featcur = Polygonfc.Update(t_del_qf, false);
                            IFeature del_feat = del_featcur.NextFeature();
                            while (del_feat != null)
                            {
                                del_featcur.DeleteFeature();
                                del_feat = del_featcur.NextFeature();
                            }
                            del_featcur.Flush();
                            TokayWorkspace.ComRelease(del_featcur);
                            del_featcur = null;
                            //----
                            wsEdit.StopEditOperation();
                            wsEdit.StopEditing(true);
                            //TokayWorkspace.DeleteFeatures(Polygonfc, t_del_qf);
                        }
                        #endregion

----the----end-----

vp:hsg

create date:2012-03-07  10:57

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章