• C#下dBase file的构建


    对shape file的属性进行了计算,为了数据格式的统一,欲将结果存为dBase file。
    折腾了两天,终于搞定了。(代价是目前双眼发之中[:|]

    (一)空数据文件的生成
    string pnlfilename = shapeFileName.Substring(0,shapeFileName.Length-4) + "_pnl
    .dbf";
    if(File.Exists(pnlfilename) == true)
    File.Delete(pnlfilename);
    IFeatureWorkspace pFWS;
    IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
    string name = null;
    FileInfo file = new FileInfo(pnlfilename);
    name = file.Name;//filename
    string path = file.Directory.FullName + "\\"; //file path
    pFWS = pWorkspaceFactory.OpenFromFile(path,0) as IFeatureWorkspace;

    IFields fields = new FieldsClass();
    IFieldsEdit fieldsEdit = fields as IFieldsEdit;
    IField field = new FieldClass();
    IFieldEdit fieldEdit = field as IFieldEdit;
    fieldEdit.Length_2 = 10;
    fieldEdit.Name_2 = "poly";
    fieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
    fieldsEdit.AddField(field);
    field = new FieldClass();
    fieldEdit = field as IFieldEdit;
    fieldEdit.Length_2 = 150;
    fieldEdit.Name_2 = "pnl";
    fieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
    fieldsEdit.AddField(field);

    ITable table = pFWS.CreateTable(name,fields,(ESRI.ArcGIS.esriSystem.UID)null,(
    ESRI.ArcGIS.esriSystem.UID)null,"");

    本来打算用ODBC/OLDB/ADO来做的,动起来才发现一个要命的问题,因为上述方法都是基于
    SQL的,所以必须有对应的数据库(文件)存在,也就是说上述方法较适用于dBase文件的
    修改,而新建则难以实现。(对于Access文件,可以通过称作ADOX的COM来实现新建文件功
    能)

    本来以为剩下的方法只能按照dBase格式来代码创建了,那在现有条件下几乎不可能。

    google不到,无奈之下侥幸的翻了一下vs的help,居然找到了:在Arc Engine的帮助里有
    建立dBase文件的vb示例!想想也是,全是因为shape文件出来的早,现在别的地方也难有
    人用这旧dBase格式存数据了。于是用C#语言小修改了一下~

    (二)数据填充
    for(int i=0;i<pnlTable.Rows.Count;i++)
    {
        //IRow row = table.CreateRow();
    //row.set_Value(table.FindField("poly"),pnlTable.Rows[i].ItemArray[pnlTable.C
    olumns["poly"].Ordinal]);
    //row.set_Value(table.FindField("pnl"),pnlTable.Rows[i].ItemArray[pnlTable.Co
    lumns["pnl"].Ordinal]);
    //row.Store();

    IRowBuffer row = table.CreateRowBuffer();
    row.set_Value(table.FindField("poly"),pnlTable.Rows[i].ItemArray[pnlTable.Col
    umns["poly"].Ordinal]);
    row.set_Value(table.FindField("pnl"),pnlTable.Rows[i].ItemArray[pnlTable.Colu
    mns["pnl"].Ordinal]);
    table.Insert(true).InsertRow(row);
    }

    注释掉的是先前使用的方法,采用row对象来存储中间数据;而后采用的方法是用rowbuff
    er来存储。前者操作均是基于数据库(文件)的,而后者则先在内存中构建,再插入到数
    据库(文件)中。试验表明,相比较而言,后者可以节省1/2到2/3的时间消耗。

    最后要说明的一点,在文件建立之前,不推荐使用ESRI提供的Table对象来存储数据,因为
    其可能是基于数据库(文件)操作的,而一般ADO.net则较多采用了缓存技术。时间消耗上
    面的差距是不能比拟的。


    e-mail:shisong.zhu@gmail.com
    GISer in China, for engineering
  • 相关阅读:
    win10 开机背景图
    关于在不知道具体实例化哪个窗体时调用该窗体公共变量的方法
    devexpress 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 “lc.exe”已退出,代码为 -1。
    获取打印机设置的纸张参数
    mysql 添加字段语句
    curl模拟post请求
    php CI框架log写入
    winform程序更新
    JSP的EL和JSTL解析
    报错:java.lang.IllegalArgumentException: object is not an instance of declaring class
  • 原文地址:https://www.cnblogs.com/columbus2/p/840333.html
Copyright © 2020-2023  润新知