关于AE大数据点文件读取生成SHP文件时使用IFeatureBuffer快速提高读取效率
1 if (kclswjPath == null || kclswjPath == string.Empty) 2 { 3 MessageBox.Show("请选择卡车流水文件"); 4 } 5 6 if (!File.Exists(kclswjPath)) 7 { 8 MessageBox.Show("卡车流水文件不存在"); 9 } 10 11 string GpsShpName; 12 string GpsShpFolder; 13 int i = gpsShpFullName.LastIndexOf('\\'); 14 GpsShpName = gpsShpFullName.Substring(i + 1); 15 GpsShpFolder = gpsShpFullName.Substring(0, i); 16 frmMap frmM = new frmMap(); 17 IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory(); 18 IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(GpsShpFolder, 0); 19 ISpatialReference pSpatialReference = frmM.axMapControl1.ActiveView.FocusMap.SpatialReference; 20 IFeatureClass pFeatureClass; 21 22 if (File.Exists(gpsShpFullName)) 23 { 24 pFeatureClass = pFeatureWorkspace.OpenFeatureClass(GpsShpName); 25 IDataset pDataset = (IDataset)pFeatureClass; 26 pDataset.Delete(); 27 } 28 29 //创建字段 30 IFields pFields = new FieldsClass(); 31 IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields; 32 33 IField pField = new FieldClass(); 34 IFieldEdit pFieldEdit = (IFieldEdit)pField; 35 pFieldEdit.Name_2 = "SHAPE"; 36 pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; 37 IGeometryDefEdit pGeoDef = new GeometryDefClass(); 38 IGeometryDefEdit pGeoDefEdit = (IGeometryDefEdit)pGeoDef; 39 pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint; 40 pGeoDefEdit.SpatialReference_2 = pSpatialReference; //new UnknownCoordinateSystemClass(); 41 pFieldEdit.GeometryDef_2 = pGeoDef; 42 pFieldsEdit.AddField(pField); 43 44 pField = new FieldClass(); 45 pFieldEdit = (IFieldEdit)pField; 46 pFieldEdit.Name_2 = "记录顺序"; 47 pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString; 48 pFieldsEdit.AddField(pField); 49 50 pField = new FieldClass(); 51 pFieldEdit = (IFieldEdit)pField; 52 pFieldEdit.Name_2 = "X"; 53 pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; 54 pFieldsEdit.AddField(pField); 55 56 pField = new FieldClass(); 57 pFieldEdit = (IFieldEdit)pField; 58 pFieldEdit.Name_2 = "Y"; 59 pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble; 60 pFieldsEdit.AddField(pField); 61 63 pFeatureClass = pFeatureWorkspace.CreateFeatureClass(GpsShpName, pFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", ""); 64 65 string jlsx; 66 double dx; 67 double dy; 68 IPoint pPoint = new PointClass(); 69 //IPointArray pPointList = new PointArrayClass(); 70 71 int j = kclswjPath.LastIndexOf('\\'); 72 string kclswjName = kclswjPath.Substring(j + 1); 73 74 DataTable dt = new DataTable(); 75 dt = new ReadStream().GetTruck(kclswjName); 76 77 78 for (int k = 0; k < dt.Rows.Count; k++) 79 { 80 jlsx = dt.Rows[k][0].ToString().Trim(); 81 dx = Convert.ToDouble(dt.Rows[k][16].ToString().Trim()); 82 dy = Convert.ToDouble(dt.Rows[k][17].ToString().Trim()); 83 84 pPoint.X = dx; 85 pPoint.Y = dy; 86 87 IFeatureBuffer pFeatureBuffer = pFeatureClass.CreateFeatureBuffer(); 88 IFeatureCursor pFeatureCursor = pFeatureClass.Insert(true); 89 //IPoint p = new PointClass(); 90 pFeatureBuffer.Shape = pPoint; 91 pFeatureBuffer.set_Value(pFeatureBuffer.Fields.FindField("记录顺序"), jlsx.ToString()); 92 pFeatureBuffer.set_Value(pFeatureBuffer.Fields.FindField("X"), dx.ToString()); 93 pFeatureBuffer.set_Value(pFeatureBuffer.Fields.FindField("Y"), dy.ToString()); 94 pFeatureCursor.InsertFeature(pFeatureBuffer); 95 96 } 97 98 99 100 101 IWorkspaceFactoryLockControl ipWsFactoryLock = (IWorkspaceFactoryLockControl)pWorkspaceFactory; 102 if (ipWsFactoryLock.SchemaLockingEnabled) 103 { 104 ipWsFactoryLock.DisableSchemaLocking(); 105 } 106 IFeatureLayer pFeaturelayer = new FeatureLayerClass(); 107 pFeaturelayer.FeatureClass = pFeatureClass; 108 pFeaturelayer.Name = GpsShpName; 109 frmM.axMapControl1.AddLayer(pFeaturelayer); 110 frmM.axMapControl1.Refresh();
刚开始参考zkcharge大神的用IFeature添加点,可是数据量太大,效率非常低,后来找到IFeatureBuffer,不到5分钟就可以搞定12万条数据的读取,初学AE开发,希望多多关照,和大家共同进步。