码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • ArcGIS Pro SDK 002 对数据文件的读取和操作


    做系统开发或者数据处理的时候,我一般还是喜欢使用文件数据源,例如矢量用.shp文件存储,栅格数据用.tif或者.img文件存储。ArcGIS Pro SDK中对数据源操作的API和ArcObjects SDK中差别还是比较大的。

    1、打开数据文件

    打开文件数据的步骤如下。

    (1)使用Shape文件所在的目录,创建FileSystemConnectionPath对象,该对象是文件系统连接路径对象。

    (2)使用FileSystemConnectionPath对象创建FileSystemDatastore,该对象是文件系统数据存储器对象。

    (3)使用FileSystemDatastore,打开指定数据名称的数据源。打开数据源函数是一个模板函数,如果是Shape文件,则返回FeatureClass,如果是栅格数据,返回RasterDataset,如果是dbf数据,则返回Table。

    代码如下。

    复制代码
    string myFileName = System.IO.Path.GetFileName(pShapeFile);
    var myFileSystemConnectionPath = new FileSystemConnectionPath(new Uri(myFolderPath), FileSystemDatastoreType.Shapefile);
    
    FileSystemDatastore myFileSystemDatastore = null;
    FeatureClass myFeatureClass = null;
    try
    {
        await Task.Run(() =>
        {
            myFileSystemDatastore = new FileSystemDatastore(myFileSystemConnectionPath);
            myFeatureClass = myFileSystemDatastore.OpenDataset(myFileName);
        });
        myFileSystemDatastore?.Dispose();
    }
    catch (Exception ex)
    {
        myFileSystemDatastore?.Dispose();
        throw new ArgumentException("打开文件失败。" + pShapeFile + "," + ex.Message);
    }
    return myFeatureClass;
    复制代码

     需要注意的是,ArcGIS Pro SDK中,很多函数都是异步函数,需要添加到await Task.Run(() =>{}里面执行。开发的时候,把鼠标放到函数上,会有提示。如下图所示。

    截图.png

    如果要打开栅格数据,代码思路是一样的,只是在初始化FileSystemConnectionPath的时候,传入Raster,知识在OpenDataset的时候,传入RasterDataset即可。代码如下所示。

    复制代码
    string myFileName = System.IO.Path.GetFileName(pRasterFile);
    var myFileSystemConnectionPath = new FileSystemConnectionPath(new Uri(myFolderPath), FileSystemDatastoreType.Raster);
    FileSystemDatastore myFileSystemDatastore = null;
    RasterDataset myRasterDataset = null;
    try
    {
        await Task.Run(() =>
        {
            myFileSystemDatastore = new FileSystemDatastore(myFileSystemConnectionPath);
            myRasterDataset = myFileSystemDatastore.OpenDataset(myFileName);
        });
        myFileSystemDatastore?.Dispose();
    }
    catch (Exception ex)
    {
        myFileSystemDatastore?.Dispose();
        throw new ArgumentException("打开文件失败。" + pRasterFile + "," + ex.Message);
    }
    return myRasterDataset;
    复制代码

     打开dbf的时候,FileSystemConnectionPath还是使用FileSystemDatastoreType.Shapefile,在Open的时候,返回Table。代码如下所示。

    myTable = myFileSystemDatastore.OpenDataset(myFileName);

    2、读取FeatureClass

    得到FeatureClass后,我们可以遍历里面要要素,读取其中的信息。方法和ArcObjects SDK中的流程类似,也是使用了Search方法,返回Cursor变量。具体使用方法如下面代码所示。

    复制代码
    await Task.Run(() =>
    {
        var myDefinition = myFeatureClass.GetDefinition();
        this._SpatialReference = myDefinition.GetSpatialReference();
        int my_gridcode_FileIndex = myDefinition.FindField("gridcode");
        RowCursor myRowCursor = myFeatureClass.Search(null, true);
        while (myRowCursor.MoveNext())
        {
            Feature myFeature = myRowCursor.Current as Feature;
            DraExtBasin myNewBasin = new DraExtBasin
            {
                FID = myFeature.GetObjectID(),
                SnapPourPointFID = Convert.ToInt64(myFeature.GetOriginalValue(my_gridcode_FileIndex)),
                Polygon = PolygonBuilderEx.CreatePolygon(myFeature.GetShape() as Polygon)
            };
            myFeature.Dispose();
            myBasinList.Add(myNewBasin);
        }
        myRowCursor.Dispose();
    });
    复制代码

    我们通过FeatureClass.GetDefinition()函数,得到FeatureClass的一些定义信息,通过定义信息,可以获取数据的空间参考、字段等,这点和ArcObjects SDK中差别还是挺大的。

    3、添加和编辑Feature

    添加Feature和ArcObjects SDK类似,也是使用RowBuffer进行添加,代码如下所示。

    复制代码
    await Task.Run(() =>
    {
        var myDefinition = myFeatureClass.GetDefinition();
        int my_P_FID_FI = myDefinition.FindField("P_FID");
        int my_D_Length_FI = myDefinition.FindField("D_Length");
        int my_P_Dis_FI = myDefinition.FindField("P_Dis");
        RowBuffer myRowBuffer = myFeatureClass.CreateRowBuffer();
        foreach (DraExtFullBasin myFullBasin in pFullBasinList)
        {
            double myDLength = 0;
            double myPDis = 0;
            if (myMainDrainageD.ContainsKey(myFullBasin.SnapPourPointFID))
            {
                var myDraExtMainDrainage = myMainDrainageD[myFullBasin.SnapPourPointFID];
                myDLength = myDraExtMainDrainage.DrainageLength;
                myPDis = myDraExtMainDrainage.SnapPourPointDistance;
            }
            myRowBuffer[1] = myFullBasin.Polygon;
            myRowBuffer[my_P_FID_FI] = myFullBasin.SnapPourPointFID;
            myRowBuffer[my_D_Length_FI] = myDLength;
            myRowBuffer[my_P_Dis_FI] = myPDis;
            myFeatureClass.CreateRow(myRowBuffer);
        }
        myRowBuffer.Dispose();
    });
    复制代码

    编辑的话,就是获取Row或者Feature之后,修改信息,最后调用对象的Store()函数即可。

  • 相关阅读:
    【Java基础】Java基础知识
    技术干货 | MindSpore AI科学计算系列(四):AlphaFold2分析
    【附源码】计算机毕业设计JAVA技术的游戏交易平台
    HTTP协议解析
    文件上传漏洞
    软件架构(六)MVC架构历史
    Android开发之Gradle文件
    java ssm基于springboot的校园店铺系统
    使用spring gateway配置网关服务实现简单的路由转发
    ubuntu 安装 gparted
  • 原文地址:https://www.cnblogs.com/mytudousi/p/17141183.html
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号