首页 > 其他 > 详细

CreateFeatureClass COM异常

时间:2014-02-27 00:09:34      阅读:711      评论:0      收藏:0      [点我收藏+]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
private static IFeatureClass CreatStnShp(string shp)
        {
            //打开工作空间
            IWorkspaceFactory wsfactory = new ShapefileWorkspaceFactoryClass();
            string ssss = System.IO.Path.GetDirectoryName(shp);
            IWorkspace workspace = wsfactory.OpenFromFile(ssss, 0);
            IFeatureWorkspace pFeatWsp = workspace as IFeatureWorkspace;
             
            if (File.Exists(shp))
            {
                DialogResult dr = MessageBox.Show("文件已经存在,是否使用该文件?", "提示",
                    MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                if ( dr== DialogResult.Yes)
                {
                    return pFeatWsp.OpenFeatureClass(System.IO.Path.GetFileNameWithoutExtension(shp));
                }
                else if(dr==DialogResult.No)
                {
                    //删除已有
                    DialogResult ddr = MessageBox.Show("是否删除并替换已有文件", "提示",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (ddr == DialogResult.Yes)
                    {
                        string dbffile = System.IO.Path.ChangeExtension(shp, ".dbf");
                        string shxfile = System.IO.Path.ChangeExtension(shp, ".shx");
                        string prjfile = System.IO.Path.ChangeExtension(shp, ".prj");
                        File.Delete(shp);
                        if (File.Exists(dbffile))
                            File.Delete(dbffile);
                        if (File.Exists(shxfile))
                            File.Delete(shxfile);
                        if (File.Exists(prjfile))
                            File.Delete(prjfile);
                    }
                    else
                    {
                        MessageBox.Show("请重新选择shapfile文件的路径");
                    }
                }
                else
                {
                    return null;
                }
            }
 
            IGeometryDefEdit pGeoDef = new GeometryDefClass();
            pGeoDef.GeometryType_2 = esriGeometryType.esriGeometryPoint;
             
            //设置空间参考
            ISpatialReferenceFactory3 spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
            ISpatialReference pSr = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
 
            //设置字段
            IFieldEdit pField;
            IFieldsEdit pFieldsEdit = new FieldsClass();
            //设置几何字段
            pField = new FieldClass();
            pField.Type_2 = esriFieldType.esriFieldTypeGeometry;
            pField.GeometryDef_2 = pGeoDef;
            pField.Name_2 = "Shape";
            pFieldsEdit.AddField(pField);
            //产生唯一索引字段
            pField = new FieldClass();
            pField.Name_2 = "OBJECTID";
            pField.Type_2 = esriFieldType.esriFieldTypeOID;
            pFieldsEdit.AddField(pField);
            //添加station相关字段
            //string[] str = new string[]{"NCDCID","WBAN","NAME","COOPID","COUNTRY","STNTYPE"};
            string[] str = new string[] { "WBAN", "NAME", "LOCATION", "LAT", "LON"};
            foreach (string stt in str)
            {
                pField = new FieldClass();
                pField.Name_2 = stt;
                pField.AliasName_2 = stt;
                pField.Type_2 = esriFieldType.esriFieldTypeString;
                if (stt == "LOCATION")
                    pField.Length_2 = 60;
                else
                    pField.Length_2 = 30;
                pFieldsEdit.AddField(pField);
            }
            pField = new FieldClass();
            pField.Name_2 = "StnHeight";
            pField.Type_2 = esriFieldType.esriFieldTypeDouble;
            pFieldsEdit.AddField(pField);
 
            pField = new FieldClass();
            pField.Name_2 = "GndHeight";
            pField.Type_2 = esriFieldType.esriFieldTypeDouble;
            pFieldsEdit.AddField(pField);
 
            IFeatureClass pfeatcls =pFeatWsp.CreateFeatureClass(System.IO.Path.GetFileNameWithoutExtension(shp), pFieldsEdit as IFields, null, null,
                esriFeatureType.esriFTSimple, "Shape", "");
            IGeoDataset pGeoDs = pfeatcls as IGeoDataset;
            IGeoDatasetSchemaEdit pGeoDSe = pGeoDs as IGeoDatasetSchemaEdit;
            if (pGeoDSe.CanAlterSpatialReference)
            {
                pGeoDSe.AlterSpatialReference(pSr);
            }
 
            return pfeatcls;
        }

 上面是可正常运行的代码。自己写的时候凭着自己的理解做了部分修改,在字段声明的时候略有不同,如下

1
2
3
4
IFields pfs = new FieldsClass();
                IFieldsEdit pFieldsEdit = pfs as IFieldsEdit;
                IField pFieldd = new FieldClass();
                IFieldEdit pField = pFieldd as IFieldEdit;

 结果在运行的时候出现COM异常,仔细核查了CreateFeatureClass的每个参数,多次检查都没有查到结果。后来修改为文中第一段代码声明方式,再运行成功了。

为了找出错误,我又把声明换回第二段代码,令人郁闷的是,又没异常了。

 

本文只描述现象,不解释原因

CreateFeatureClass COM异常,布布扣,bubuko.com

CreateFeatureClass COM异常

原文:http://www.cnblogs.com/DayDreamEveryWhere/p/3568456.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!