基于ArcGIS10.0和Oracle10g的空間數據管理平臺十五(C#開發)-空間數據導出
我的新浪微博:http://weibo.com/freshairbrucewoo。
歡迎大家相互交流,共同提高技術。
又是晚上12點以后了,今晚等待人民網的最新新聞也是沒有結果,還是稱這個時間寫一篇博客吧!我是程序員但是也關心國家大事,自己沒有太大的要求,就喜歡有一個穩定和安心的生活和工作環境,僅此而已!
今天這篇博客還是基于ArcGIS10.0和Oracle10g的空間數據管理平臺的設計與實現的繼續,前面有一篇博客(十三)介紹空間數據導入的,今天介紹一篇空間數據導出。空間數據導出的作用主要是以另一種形式保存,方便部分數據的轉移。下面開始介紹具體實現過程。
1.定義個SDE的工作空間并且在構造函數中初始化
1 private IFeatureWorkspace pWorkspaceSDE;//定義SDE工作空間
2 public FrmDataExport()
3 {
4 InitializeComponent();
5 if (pWorkspaceSDE == null)
6 {
7 //獲取工作空間的一個實例
8 pWorkspaceSDE = MapOperation.GetFeatrueWorkspace();
9 }
10 }
2.在form的load函數中初始化表信息,這些表就是可以被導出空間數據表。
1 /// <summary>
2 /// 列出所有的表信息
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void FrmDataExport_Load(object sender, EventArgs e)
7 {
8 SqlHelper sh = new SqlHelper();
9 string sql = string.Empty;
10 sql = "select table_name,table_mapname,type from jcsjk_layer l,jcsjk_element e where "
11 + "e.id=l.pid and e.category='地震矢量數據'";
12 OracleDataReader odr = sh.ReturnDataReader(sql);
13 object[] obj = new object[4];
14 while (odr.Read())
15 {
16 obj[0] = false;
17 obj[1] = odr[0].ToString();
18 obj[2] = odr[2].ToString();
19 obj[3] = odr[1].ToString();
20 dataGridViewX1.Rows.Add(obj);
21 }
22 comboBoxEx1.SelectedIndex = 0;
23 }
3.選擇多處數據的格式并做相應的準備工作
1 /// <summary>
2 /// 根據選擇的導出數據格式打開相應的文件
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void selectPathBtn_Click(object sender, EventArgs e)
7 {
8 //根據導出數據格式打開相應的文件
9 switch (comboBoxEx1.SelectedIndex)
10 {
11 case 0:
12 {
13 FolderBrowserDialog folder = new FolderBrowserDialog();
14 if (folder.ShowDialog() == DialogResult.OK)
15 {
16 if (folder.SelectedPath != "")
17 {
18 selectPathTxt.Text = folder.SelectedPath;
19 }
20 }
21 }
22 break;
23 case 1:
24 {
25 OpenFileDialog ofd = new OpenFileDialog();
26 ofd.Filter = "MDB文件(.mdb) | *.mdb";
27 ofd.CheckFileExists = false;
28
29 if (ofd.ShowDialog() == DialogResult.OK)
30 {
31
32 if (ofd.FileName != "")
33 {
34 selectPathTxt.Text = ofd.FileName;
35 }
36 }
37 }
38 break;
39 default:
40 break;
41 }
42 }
4.執行具體的導出功能
1 /// <summary>
2 /// 執行具體的導出功能
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void exportBtn_Click(object sender, EventArgs e)
7 {
8 if (selectPathTxt.Text == "")
9 {
10 MessageBox.Show("請選擇導出路勁");
11 return;
12 }
13 IWorkspaceFactory pWF = null;
14 switch (comboBoxEx1.SelectedIndex)
15 {
16 case 0:
17 {
18 if (!File.Exists(selectPathTxt.Text))
19 {
20
21 }
22 //創建一個輸出shp文件的工作空間
23 pWF = new ShapefileWorkspaceFactoryClass();
24 IFeatureWorkspace pFW = pWF.OpenFromFile(selectPathTxt.Text, 0) as IFeatureWorkspace;
25 IWorkspace pW = pFW as IWorkspace;
26
27 for (int i = 0; i < dataGridViewX1.Rows.Count; ++i)
28 {
29 if (bool.Parse(dataGridViewX1.Rows[i].Cells[0].Value.ToString()))
30 {
31 if (dataGridViewX1.Rows[i].Cells[2].Value.ToString() != "PA")
32 {
33 string str = dataGridViewX1.Rows[i].Cells[1].Value.ToString();
34 MapOperation.ConvertFeatureClass(pWorkspaceSDE as IWorkspace,
35 pW, str, str, 4326);
36 }
37 else
38 {
39 MessageBox.Show("屬性表不能夠導出為Shape文件");
40 }
41 }
42 }
43 MessageBox.Show("導出數據完成!");
44 }
45 break;
46 case 1:
47 {
48 // Instantiate an Access workspace factory and create a new personal geodatabase.
49 pWF = new AccessWorkspaceFactoryClass();
50 IWorkspaceName pWN = pWF.Create(Path.GetDirectoryName(selectPathTxt.Text),
51 Path.GetFileName(selectPathTxt.Text),null, 0);
52
53 // Cast the workspace name object to the IName interface and open the workspace.
54 IName pN = (IName)pWN;
55 IWorkspace pW = (IWorkspace)pN.Open();
56
57 for (int i = 0; i < dataGridViewX1.Rows.Count; ++i)
58 {
59 if (bool.Parse(dataGridViewX1.Rows[i].Cells[0].Value.ToString()))
60 {
61 string str = dataGridViewX1.Rows[i].Cells[1].Value.ToString();
62 if (dataGridViewX1.Rows[i].Cells[2].Value.ToString() != "PA")
63 {
64 MapOperation.ConvertFeatureClass(pWorkspaceSDE as IWorkspace,
65 pW, str, str, 4326);
66 }
67 else
68 {
69 ITable pSourceT = pWorkspaceSDE.OpenTable(str);
70 IFeatureWorkspace pFW = pW as IFeatureWorkspace;
71 ITable pTargetT = pFW.CreateTable(str, pSourceT.Fields, null, null, "");
72 FusedIndexTable(ref pSourceT, ref pTargetT);
73 }
74 }
75 }
76 MessageBox.Show("導出數據完成!");
77 }
78 break;
79 default:
80 break;
81 }
82 }
5.如果導出的是mdb的格式,而且是以追加的方式,那么下面的函數將實現這個功能。
1 /// <summary>
2 /// 如果目的數據庫中已經有表,則將新的記錄追加進去
3 /// </summary>
4 /// <param name="FromTable">導出表</param>
5 /// <param name="ToTable">導入表</param>
6 private void FusedIndexTable(ref ITable FromTable, ref ITable ToTable)
7 {
8 if (FromTable == null || ToTable == null)
9 {
10 return;
11 }
12 IRow pFromRow;
13 ICursor pToCursor, pFromCursor;
14 IRowBuffer pToRowBuffer;
15 int pIndex;
16
17 pToRowBuffer = ToTable.CreateRowBuffer();
18 pToCursor = ToTable.Insert(true);
19 pFromCursor = FromTable.Search(null, false);
20 pFromRow = pFromCursor.NextRow();
21 while (pFromRow != null)
22 {
23 for (int i = 0; i < pFromRow.Fields.FieldCount; i++)
24 {
25 pIndex = pToRowBuffer.Fields.FindField(pFromRow.Fields.get_Field(i).Name.Trim());
26 if (pFromRow.Fields.get_Field(i).Editable && pIndex > -1)
27 {
28 pToRowBuffer.set_Value(pIndex, pFromRow.get_Value(i));
29 }
30 }
31
32 pToCursor.InsertRow(pToRowBuffer);
33 pFromRow = pFromCursor.NextRow();
34 }
35 System.Runtime.InteropServices.Marshal.ReleaseComObject(pToCursor);
36 pFromRow = null;
37 pFromCursor = null;
38 pToRowBuffer = null;
39 }
6.其他功能:主要就是一些小功能,例如界面的布局設計,選擇導出的文件名,導出以后即使清空文件名等。
總結:其實空間數據導出功能也是主要用到一個技術:就是空間數據格式的相互轉換。這個技術也是空間數據導入使用的主要功能或技術。還有一點值得提的是:把所有的表以及表的一些描述信息以列表的形式展現出來方便用戶選擇,選擇的策略是任意多個需要導出的表,但是同時只能選擇一種格式。如果需要導出多種格式,就需要多執行幾次導出功能,這點是可以改進的地方,也可以用多選項給出,然后根據用戶選擇一次性導出多種格式,這樣也簡單的提升了用戶使用的效率。呵呵,優化無處不在。
浙公網安備 33010602011771號