1. 程式人生 > >PIE SDK開啟自定義向量資料

PIE SDK開啟自定義向量資料

 

1. 資料介紹

    資訊提取和解譯的過程中,經常會生成一部分中間臨時向量資料,這些資料在執行完對應操作後就失去了存在的價值,針對這種情況,PIE增加了記憶體向量資料集,來協助使用者完成對自定義向量資料的讀取和顯示。

    下面以Micaps1類資料為例介紹自定義向量資料的構建和顯示。

2. 實現思路及原理說明

第一步

構建資料的欄位、空間參考等資訊;

第二步

根據欄位和空間參考資訊建立記憶體向量資料集;

第三步

在記憶體向量資料集中逐條新增資料記錄(包括幾何圖形和屬性);

第四步

通過記憶體資料集建立向量圖層;

第五步

新增第四步中的圖層到地圖,並重新整理;

3. 核心介面與方法

介面/類

方法

說明

IField

建構函式

構造欄位

IFields

AddField ()

新增欄位

DatasetFactory

CreateFeatureDataset

建立資料集

IFeatureDataset

CreateNewFeature()

建立要素

AddFeature()

新增要素

IFeature

SetValue()

屬性賦值

4. 示例程式碼

專案名稱

百度雲盤地址下/PIE示例程式/10.開啟自定義向量資料

專案位置

百度雲盤地址下/向量資料/Micaps/micaps1下資料

程式碼位置

百度雲盤地址下/PIE視訊教程/10. 開啟自定義向量資料.avi

示例程式碼

 1 方法(一)開啟自定義向量資料
 2 //以解析Micaps1資料為例
 3     OpenFileDialog openFileDialog = new OpenFileDialog();
 4     openFileDialog.Filter = "Micaps檔案(*.000)|*.000";
 5     if (openFileDialog.ShowDialog() == DialogResult.OK)
 6     {
 7         IFeatureLayer defineLayer = OpenDefineShp(openFileDialog.FileName);
 8         if (defineLayer != null)
 9         {
10 (defineLayer as ILayer).Name = "自定義向量圖層";
11             mapControlMain.FocusMap.AddLayer(defineLayer as ILayer);
12             mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
13         }
14 }
15 /// <summary>
16 /// 解析自定義資料,生成向量
17 /// 以解析Micaps1資料為例,欄位只新增站號、經度、緯度、海拔高度
18 /// </summary>
19 /// <param name="filePath">輸出SHP檔案路徑</param>
20 /// <returns></returns>
21   private IFeatureLayer OpenDefineShp(string filePath)
22 {
23     IFeatureLayer featureLayer = null;
24     int count = 0;//記錄讀取資料的行數
25 string[] lineValues = null;//每一行的資料值
26     //欄位宣告
27         IField field_id = new Field("PointID", FieldType.OFTInteger, 20, 4);
28         field_id.AliasName = "站號";
29 
30         IField field_x = new Field("lon", FieldType.OFTInteger, 20, 4);
31         field_x.AliasName = "經度";
32 
33         IField field_y = new Field("lat", FieldType.OFTInteger, 20, 4);
34         field_y.AliasName = "緯度";
35 
36         IField field_h = new Field("height", FieldType.OFTInteger, 20, 4);
37         field_h.AliasName = "海拔高度";
38 
39         IFields fields = new Fields();
40         fields.AddField(field_id);
41         fields.AddField(field_x);
42         fields.AddField(field_y);
43         fields.AddField(field_h);
44         //建立記憶體資料集
45         IFeatureDataset pDataset = PIE.DataSource.DatasetFactory.CreateFeatureDataset("", fields, GeometryType.GeometryPoint, null, "MEM");
46         //解析資料檔案,寫入資料集中
47         string[] valueLines = System.IO.File.ReadAllLines(filePath);
48         char[] charSeperate = { ' ' };
49         for (int j = 0; j < valueLines.Length; j++)
50         {
51             string str = valueLines[j];
52             if (count == 0 || count == 1)
53             {
54                 count = count + 1;
55                 continue;
56             }
57             //解析字串,生成Feature
58             IFeature newFeature = pDataset.CreateNewFeature();
59             lineValues = str.Split(charSeperate, StringSplitOptions.RemoveEmptyEntries);
60             //欄位賦值
61             newFeature.SetValue(0, Convert.ToInt32(lineValues[0]));
62             newFeature.SetValue(1, Convert.ToDouble(lineValues[1]));
63             newFeature.SetValue(2, Convert.ToDouble(lineValues[2]));
64             newFeature.SetValue(3, Convert.ToDouble(lineValues[3]));
65 
66             //生成Geometry
67             IPoint point = new PIE.Geometry.Point();
68             point.PutCoords(Convert.ToDouble(lineValues[1]), Convert.ToDouble(lineValues[2]));
69             newFeature.Geometry = point as IGeometry;
70             pDataset.AddFeature(newFeature);
71             count = count + 1;
72       (newFeature as IDisposable).Dispose();
73         }
74         featureLayer = PIE.Carto.LayerFactory.CreateDefaultFeatureLayer(pDataset);   
75     return featureLayer;
76 }
View Code

5. 示例截圖