PIE SDK開啟自定義向量資料
阿新 • • 發佈:2018-12-19
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. 示例截圖