Ejemplo n.º 1
0
        /// <summary>
        /// 根据离散点数据动态生成featureclass点图层
        /// </summary>
        /// <params name="vectors"></params>
        /// <returns></returns>
        private static IFeatureClass GetFeatureCLass(LibGeometry.Vector3_DW[] vectors, ESRI.ArcGIS.Controls.AxMapControl map)
        {
            IWorkspaceFactory pWorkspaceFactory = new InMemoryWorkspaceFactoryClass();
            IWorkspaceName    pWorkspaceName    = pWorkspaceFactory.Create("", "pWorkspace", null, 0);
            IName             pName             = (IName)pWorkspaceName;
            IWorkspace        pWorkspace        = (IWorkspace)pName.Open();
            IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
            IFields           pFields           = new FieldsClass();
            IFieldsEdit       pFieldsEdit       = pFields as IFieldsEdit;
            IField            pField            = new FieldClass();
            IFieldEdit        pFieldEdit        = pField as IFieldEdit;

            pFieldEdit.Name_2 = "SHAPE";
            pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
            IGeometryDef     pGeometryDef     = new GeometryDefClass();
            IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;

            pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
            //为FeatureClass赋参考系,不写会出错***************************************

            pGeometryDefEdit.SpatialReference_2 = map.SpatialReference;
            //************************************************************************
            pFieldEdit.GeometryDef_2 = pGeometryDef;
            pFieldsEdit.AddField(pField);
            pField                 = new FieldClass();//不要省略写!容易出问题
            pFieldEdit             = pField as IFieldEdit;
            pFieldEdit.AliasName_2 = "高程";
            pFieldEdit.Name_2      = "CoordinateZ";
            pFieldEdit.Type_2      = esriFieldType.esriFieldTypeDouble;
            pFieldsEdit.AddField(pField);
            pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(Application.StartupPath + "\\tempRaster", 0) as IFeatureWorkspace;
            IFeatureClass pFeatureClass = pFeatureWorkspace.CreateFeatureClass("points", pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");



            //IWorkspaceFactory pWorkSpaceFac = new ShapefileWorkspaceFactoryClass();
            //IFeatureWorkspace pFeatureWorkSpace = pWorkSpaceFac.OpenFromFile(shpfolder, 0) as IFeatureWorkspace;

            ////创建字段集2
            //IFeatureClassDescription fcDescription = new FeatureClassDescriptionClass();
            //IObjectClassDescription ocDescription = (IObjectClassDescription)fcDescription;//创建必要字段
            //IFields fields = ocDescription.RequiredFields;
            //int shapeFieldIndex = fields.FindField(fcDescription.ShapeFieldName);
            //IField field = fields.get_Field(shapeFieldIndex);
            //IGeometryDef geometryDef = field.GeometryDef;
            //IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
            ////geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
            ////geometryDefEdit.SpatialReference_2 = spatialReference;

            //geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
            //ISpatialReferenceFactory pSpatialRefFac = new SpatialReferenceEnvironmentClass();
            //IProjectedCoordinateSystem pcsSys = pSpatialRefFac.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Xian1980_3_Degree_GK_Zone_39);
            //geometryDefEdit.SpatialReference_2 = pcsSys;

            //IFieldChecker fieldChecker = new FieldCheckerClass();
            //IEnumFieldError enumFieldError = null;
            //IFields validatedFields = null; //将传入字段 转成 validatedFields
            //fieldChecker.ValidateWorkspace = (IWorkspace)pFeatureWorkSpace;
            //fieldChecker.Validate(fields, out enumFieldError, out validatedFields);

            //pFeatureWorkSpace.CreateFeatureClass(shpname, validatedFields, ocDescription.InstanceCLSID, ocDescription.ClassExtensionCLSID, esriFeatureType.esriFTSimple, fcDescription.ShapeFieldName, "");



            //从vectors中获取散点值
            Dictionary <int, IPoint> pointDictionary = new Dictionary <int, IPoint>();

            for (int i = 0; i < vectors.Length; i++)
            {
                IPoint pPoint = new PointClass();
                pPoint.X = vectors[i].X;
                pPoint.Y = vectors[i].Y;
                pPoint.Z = vectors[i].Z;
                if (pPoint.Z.ToString() != "非数字")
                {
                    pointDictionary.Add(i, pPoint);
                }
            }

            //插入到新建的FeatureClass中
            IWorkspaceEdit pWorkspaceEdit = pWorkspace as IWorkspaceEdit;

            pWorkspaceEdit.StartEditing(true);
            pWorkspaceEdit.StartEditOperation();
            IFeatureBuffer pFeatureBuffer = pFeatureClass.CreateFeatureBuffer();
            IFeatureCursor pFeatureCursor = pFeatureClass.Insert(true);

            for (int featureNum = 4; featureNum < pointDictionary.Count; featureNum++)
            {
                pFeatureBuffer.Shape = pointDictionary[featureNum] as IPoint; //出错点,在于新建字段的错误
                pFeatureBuffer.set_Value(pFeatureClass.Fields.FindField("CoordinateZ"), pointDictionary[featureNum].Z);
                pFeatureCursor.InsertFeature(pFeatureBuffer);
            }
            pFeatureCursor.Flush();

            pWorkspaceEdit.StopEditOperation();
            pWorkspaceEdit.StopEditing(true);
            return(pFeatureClass);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 根据离散点数据动态生成featureclass点图层
        /// </summary>
        /// <params name="vectors"></params>
        /// <returns></returns>
        private static IFeatureClass GetFeatureCLass(LibGeometry.Vector3_DW[] vectors,ESRI.ArcGIS.Controls.AxMapControl map)
        {
            IWorkspaceFactory pWorkspaceFactory = new InMemoryWorkspaceFactoryClass();
            IWorkspaceName pWorkspaceName = pWorkspaceFactory.Create("", "pWorkspace", null, 0);
            IName pName = (IName)pWorkspaceName;
            IWorkspace pWorkspace = (IWorkspace)pName.Open();
            IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
             IFields pFields = new FieldsClass();
             IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
             IField pField = new FieldClass();
             IFieldEdit pFieldEdit = pField as IFieldEdit;
             pFieldEdit.Name_2 = "SHAPE";
             pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
             IGeometryDef pGeometryDef = new GeometryDefClass();
             IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;
             pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
             //为FeatureClass赋参考系,不写会出错***************************************

             pGeometryDefEdit.SpatialReference_2 = map.SpatialReference;
             //************************************************************************
             pFieldEdit.GeometryDef_2 = pGeometryDef;
             pFieldsEdit.AddField(pField);
             pField = new FieldClass();//不要省略写!容易出问题
             pFieldEdit = pField as IFieldEdit;
             pFieldEdit.AliasName_2 = "高程";
             pFieldEdit.Name_2 = "CoordinateZ";
             pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
             pFieldsEdit.AddField(pField);
             pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(Application.StartupPath+"\\tempRaster", 0) as IFeatureWorkspace;
            IFeatureClass pFeatureClass = pFeatureWorkspace.CreateFeatureClass("points", pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");

            //IWorkspaceFactory pWorkSpaceFac = new ShapefileWorkspaceFactoryClass();
            //IFeatureWorkspace pFeatureWorkSpace = pWorkSpaceFac.OpenFromFile(shpfolder, 0) as IFeatureWorkspace;

            ////创建字段集2
            //IFeatureClassDescription fcDescription = new FeatureClassDescriptionClass();
            //IObjectClassDescription ocDescription = (IObjectClassDescription)fcDescription;//创建必要字段
            //IFields fields = ocDescription.RequiredFields;
            //int shapeFieldIndex = fields.FindField(fcDescription.ShapeFieldName);
            //IField field = fields.get_Field(shapeFieldIndex);
            //IGeometryDef geometryDef = field.GeometryDef;
            //IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
            ////geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
            ////geometryDefEdit.SpatialReference_2 = spatialReference;

            //geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
            //ISpatialReferenceFactory pSpatialRefFac = new SpatialReferenceEnvironmentClass();
            //IProjectedCoordinateSystem pcsSys = pSpatialRefFac.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Xian1980_3_Degree_GK_Zone_39);
            //geometryDefEdit.SpatialReference_2 = pcsSys;

            //IFieldChecker fieldChecker = new FieldCheckerClass();
            //IEnumFieldError enumFieldError = null;
            //IFields validatedFields = null; //将传入字段 转成 validatedFields
            //fieldChecker.ValidateWorkspace = (IWorkspace)pFeatureWorkSpace;
            //fieldChecker.Validate(fields, out enumFieldError, out validatedFields);

            //pFeatureWorkSpace.CreateFeatureClass(shpname, validatedFields, ocDescription.InstanceCLSID, ocDescription.ClassExtensionCLSID, esriFeatureType.esriFTSimple, fcDescription.ShapeFieldName, "");

             //从vectors中获取散点值
            Dictionary<int, IPoint> pointDictionary = new Dictionary<int, IPoint>();
            for (int i = 0; i < vectors.Length; i++)
            {
                 IPoint pPoint=new PointClass();
                 pPoint.X = vectors[i].X;
                 pPoint.Y = vectors[i].Y;
                 pPoint.Z =vectors[i].Z;
                 if (pPoint.Z.ToString() != "非数字")
                 {
                     pointDictionary.Add(i, pPoint);
                 }
             }

             //插入到新建的FeatureClass中
             IWorkspaceEdit pWorkspaceEdit = pWorkspace as IWorkspaceEdit;
             pWorkspaceEdit.StartEditing(true);
             pWorkspaceEdit.StartEditOperation();
             IFeatureBuffer pFeatureBuffer = pFeatureClass.CreateFeatureBuffer();
             IFeatureCursor pFeatureCursor = pFeatureClass.Insert(true);
             for (int featureNum = 4; featureNum < pointDictionary.Count;featureNum++ )
             {
                 pFeatureBuffer.Shape = pointDictionary[featureNum] as IPoint;//出错点,在于新建字段的错误
                 pFeatureBuffer.set_Value(pFeatureClass.Fields.FindField("CoordinateZ"), pointDictionary[featureNum].Z);
                 pFeatureCursor.InsertFeature(pFeatureBuffer);
             }
             pFeatureCursor.Flush();

             pWorkspaceEdit.StopEditOperation();
             pWorkspaceEdit.StopEditing(true);
             return pFeatureClass;
        }