做系统开发或者数据处理的时候,我一般还是喜欢使用文件数据源,例如矢量用.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<FeatureClass>(myFileName);
});
myFileSystemDatastore?.Dispose();
}
catch (Exception ex)
{
myFileSystemDatastore?.Dispose();
throw new ArgumentException("打开文件失败。" + pShapeFile + "," + ex.Message);
}
return myFeatureClass;

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

如果要打开栅格数据,代码思路是一样的,只是在初始化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<RasterDataset>(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<Table>(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()函数即可。

ArcGIS Pro SDK 002 对数据文件的读取和操作的更多相关文章

  1. ArcGIS Pro Add-In插件开发[ArcGIS Pro SDK for .NET]

    本文基于 Windows7 + VS2019 + .NET Framework 4.8 + ArcGIS Pro 2.5 开发和撰写. 目录 开发环境配置 获取ArcGIS Pro 安装VS2019 ...

  2. db file sequential read (数据文件顺序读取)

    转载:http://www.dbtan.com/2010/04/db-file-sequential-read.html db file sequential read (数据文件顺序读取): db ...

  3. Tableau学习Step2一数据文件的读取与统计图、表的概述

    Tableau学习Step2一数据文件的读取与统计图.表的概述 本文首发于博客冰山一树Sankey,去博客浏览效果更好. 一. 前言 本教程通过一个案例从浅到深来学习Tableau知识 案例概述: 二 ...

  4. Python文件的读取写入操作

    一.打开文件.关闭文件操作 想要读取文件或是写入文件,第一步便是打开文件,最后一步便是关闭文件.这里介绍两种打开(关闭)文件的方式: 1.open()方法 f=open(file_name[,acce ...

  5. ArcGIS Pro 简明教程(2)基础操作和简单制图

    ArcGIS Pro 简明教程(2)基础操作和简单制图 By 李远祥 本章主要介绍ArcGIS Pro如何加载数据并进行简单的地图制作,以基本的操作为主. 上一章节介绍过,ArcGIS Pro是可以直 ...

  6. ArcGIS Pro 二次开发

    本文基于 Windows7 + VS2019 + .NET Framework 4.8 + ArcGIS Pro 2.5.22081 开发和撰写. 目录 开发环境配置 获取ArcGIS Pro 安装V ...

  7. 模拟主库创建数据文件,dg备库空间不足时问题处理

    本篇文档测试目的: 模拟实际环境中,主库对表空间添加数据文件,备库空间不足,最终导致MRP进程自动断开,处理方式. 1.问题环境模拟 1)正常情况下的dg 主库创建数据文件,备库接受日志,自动创建表空 ...

  8. Oracle数据文件和临时文件的管理

    一.数据文件概述在Oracle数据库中,SYSTEM和SYSAUX表空间至少需要包含一个数据文件,此外还将包含多个其他表空间及与其相关的数据文件和临时文件.Oracle的数据文件和临时文件是操作系统文 ...

  9. ORACLE体系结构一 (物理结构)- 数据文件、日志文件、控制文件和参数文件

    一.物理结构Oracle物理结构包含了数据文件.日志文件.控制文件和参数文件 1.数据文件每一个ORACLE数据库有一个或多个物理的数据文件(data file).一个数据库的数据文件包含全部数据库数 ...

  10. 数据驱动 - 不同数据源的读取方式(ddt、数据文件、mysql)

    1. ddt 装饰器传参 2. ddt 读取数据文件 3. 读取 txt 文件 4. 读取 excel 文件 5. 连接 mysql 1. ddt 装饰器传参 python 的数据驱动模块 ddt 安 ...

随机推荐

  1. ADPCM(自适应差分脉冲编码调制)的原理和计算

    关于ADPCM ADPCM(Adaptive Differential Pulse Code Modulation, 自适应差分脉冲编码调制) 是一种音频信号数字化编码技术, 音频压缩标准G.722, ...

  2. webapi+vue跨域session丢失解决方法

    前后端分离中在webapi设置可以跨域,在web.config文件中添加 <httpProtocol>       <customHeaders>         <ad ...

  3. combobox 只能选择第一个

    在使用combobox时有时对于特定的下拉框内容我们一般不需要去请求url获得值,我们只用在js里面控制就好了,昨天遇到的问题是在js里面按照api给的方法写进去,显示是正常的 但是当我去选择的时候发 ...

  4. html网页图片加载失败的友好处理方式

    网络环境总是多样且复杂的,一张网页图片可能会因为网路状况差而加载失败或加载超长时间,也可能因为权限不足或者资源不存在而加载失败,这些都会导致用户体验变差,所以我们需要对图片加载失败时的情况进行一个弥补 ...

  5. Tekton 设计简介 及 实践

    本文是我对Tekton的实现原理和背后技术逻辑的理解,以及在实践过程中的一些总结. 简介 Tekton 是一个基于 Kubernetes 的云原生 CI/CD 开源(https://cd.founda ...

  6. 【大数据课程】高途课程实践-Day01:Python编写Map Reduce函数实现各商品销售量展示(类似wordcount)

    〇.概述 1.工具 http://www.dooccn.com/python3/ 在线运行Python代码 2.步骤 (1)⽣成代码测试数据 (2)编写Mapper逻辑 (3)编写Reducer逻辑 ...

  7. 【Flume】概述及组成、入门案例、进阶(事务、拓扑结构)、不同拓扑案例、自定义、数据流监控Ganglia

    一.概述 1.定义 日志采集.聚合.传输的系统,基于流式结构 即:读取本地磁盘数据,写入HDFS或kafka 2.架构 Agent:JVM进程,以事件形式将数据送到目的地. Agent由三部分组成:S ...

  8. WinUI(WASDK)使用MediaPipe检查手部关键点并通过ML.NET进行手势分类

    前言 之所以会搞这个手势识别分类,其实是为了满足之前群友提的需求,就是针对稚晖君的ElectronBot机器人的上位机软件的功能丰富,因为本来擅长的技术栈都是.NET,也刚好试试全能的.NET是不是真 ...

  9. Python函数用法和底层分析

    目录 Python函数用法和底层分析 函数的基本概念 Python 函数的分类 核心要点 形参和实参 文档字符串(函数的注释) 返回值 函数也是对象,内存底层分析 变量的作用域(全局变量和局部变量) ...

  10. 周而复始,往复循环,递归、尾递归算法与无限极层级结构的探究和使用(Golang1.18)

    所有人都听过这样一个歌谣:从前有座山,山里有座庙,庙里有个和尚在讲故事:从前有座山....,虽然这个歌谣并没有一个递归边界条件跳出循环,但无疑地,这是递归算法最朴素的落地实现,本次我们使用Golang ...