现在的位置: 首页 > 综合 > 正文

arcobjec,C#t创建一个空白的Shapefile

2013年09月14日 ⁄ 综合 ⁄ 共 2943字 ⁄ 字号 评论关闭
/// <summary>
        ///
在指定路径下创建一个指定名字的空Shapefile
        /// </summary>
        /// <param name="strShapeFolder">
指定路径</param>
        /// <param name="strShapeName">
文件名</param>

        public void CreateShapefile(string strShapeFolder,string strShapeName)
        {

            //打开工作空间
            const string strShapeFieldName = "shape";
            IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
            IFeatureWorkspace pWS = (IFeatureWorkspace)pWSF.OpenFromFile(strShapeFolder,0);

            //设置字段集
            IFields pFields = new FieldsClass();
            IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;

            //设置字段
            IField pField = new FieldClass();
            IFieldEdit pFieldEdit = (IFieldEdit)pField;

            //创建类型为几何类型的字段
            pFieldEdit.Name_2 = strShapeFieldName;
            pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
           
            //为esriFieldTypeGeometry类型的字段创建几何定义,包括类型和空间参照
            IGeometryDef pGeoDef = new GeometryDefClass();     //The geometry definition for the field if IsGeometry is TRUE.
            IGeometryDefEdit pGeoDefEdit = (IGeometryDefEdit)pGeoDef;
            pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
            pGeoDefEdit.SpatialReference_2 = new UnknownCoordinateSystemClass();

            pFieldEdit.GeometryDef_2 = pGeoDef;
            pFieldsEdit.AddField(pField);

            //添加其他的字段
            pField = new FieldClass();
            pFieldEdit = (IFieldEdit)pField;
            pFieldEdit.Name_2 = "WaterLevel";
            pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
            pFieldEdit.Precision_2 = 7;//数值长度
            pFieldEdit.Scale_2 = 3;//小数点位数
            pFieldsEdit.AddField(pField);

            //创建shapefile
            pWS.CreateFeatureClass(strShapeName,pFields,null,null,esriFeatureType.esriFTSimple,strShapeFieldName,"");//C#里 null 取代VB里的Nothing
        }

===============================

上面这个函数是根据Help里VB的例子来写的,一开始很难理解,主要是对接口不熟,不光IField和IFields,更有IField和IFieldEdit。其他GeometryDef类似。经过反复查阅,终于把他们区别搞明白了。

IFieldEdit是继承IField的,因为IField的属性大部分是只读的(read-only),所以IFieldEdit就在IField的基础上多了个只写的属性。这也是为什么会出现Name_2、Length_2等原因了。

IFields是IFields的集合,有AddField()方法;

另外就是几个类型要搞清楚,这里也理一下:
esriFieldType 字段类型,除了int,string,double等常见类型外还包含了esriFieldTypeGeometry的类型;
esriGeometryType 几何类型,指点,线,面等 貌似有10来种,有个叫多点的。不甚明白;
esriFeatureType 要素类型,包括简单要素类,复杂要素,注记,维要素,Covering,Raster等。

今天(3.19)发现了一个错误,以改正。之前写了个Length_2=10;编辑的时候发现错误了,Length只针对String字段的,Numeric字段的长度应该设置Precision的值,如果是Double的话,还可以用Scale来设置保留几位小数点。

补充一个CreateFeatureClass()的几个参数的说明,刚在网上查阅的:

CLSID和EXTCLSID,它们的含义非常有趣。我们知道,GeoDatabase中的每个对象都有个唯一标识符UID,系统是靠认证这个64位的随机值来区分不同对象的,同样的,要素类和要素类的扩展部分也有这么个标识,只不过在一般情况下我们无法看到这个UID值而已。如何产生这两个值呢,也很简单,使用:
CLSID=pOCDesc.InstanceCLSID;
EXTCLSID=pOCDesc.ClassExtensionCLSID;
The CLSID property of a Table determines the type of row object returned by the Table;原文
ShapeFieldName是指一个要素类的Shape字段名,一般都是"SHAPE"。----好像不能更改。更改完了还剩显示Shape,待解决
ConfigKeyword一般不用设置,可以设置为空字符串。

===============================

 

 来自:http://hi.baidu.com/murphy1314/blog/item/926b1e4eda251e0db3de05a5.html

抱歉!评论已关闭.