1. 程式人生 > >PIE SDK打開自定義矢量數據

PIE SDK打開自定義矢量數據

returns define p s pat double 情況 提取 move cin

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. 示例截圖

技術分享圖片

PIE SDK打開自定義矢量數據