关于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开发,希望多多关照,和大家共同进步。
 
原文地址:https://www.cnblogs.com/changxy/p/4223948.html