做系统开发或者数据处理的时候,我一般还是喜欢使用文件数据源,例如矢量用.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. <四>虚函数 静态绑定 动态绑定

    代码1 class Base { public: Base(int data=10):ma(data){ cout<<"Base()"<<endl; } v ...

  2. TypeError: Object(…) is not a function

    vue中遇到的这个错误 1. 先检查变量名或者函数名是否有重复定义 报这错之后看了好久,也没有发现starkflow上说的,重复定义了变量或者函数 2. vue的话 检查下函数写的位置,直接写到cre ...

  3. Chaos 测试下的若干 NebulaGraph Raft 问题分析

    Raft 是一种广泛使用的分布式共识算法.NebulaGraph 底层采用 Raft 算法实现 metad 和 storaged 的分布式功能.Raft 算法使 NebulaGraph 中的 meta ...

  4. Dubbo架构设计与源码解析(三)责任链模式

    作者:周可强 一.责任链模式简介 1.责任链模式定义 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对 ...

  5. 关于RESTful 的使用(实战)

    今天在博客园首页看到一篇关于写 RESTful, 大致就是前端定义的一种规范. 原文如下, https://www.cnblogs.com/zhangmumu/p/11936262.html 看了一圈 ...

  6. 【转载】SQL SERVER 中各种存储过程创建及执行方式

    一. 什么是存储过程系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务.系统存储过程主要存储在master数据库中,以&quo ...

  7. [OpenCV实战]41 嵌入式计算机视觉设备选择

    文章目录 1 简介 1.1 深度学习与传统计算机视觉 1.2 性能考量 1.3 社区支持 2 结论 3 参考 在计算机视觉领域中,不同的场景不同的应用程序需要不同的解决方案.在本文中,我们将快速回顾可 ...

  8. 使用Jiralert实现AlertManager告警对接Jira

    简介 Alertmanager 处理由客户端应用程序(如 Prometheus server)发送的警报.它负责去重(deduplicating),分组(grouping),并将它们路由(routin ...

  9. elasticsearch之单请求多查询

    一.需要解决的问题 有的时候我们需要同时执行多个查询,并且需要得到每个单独查询的搜索结果,elasticsearch提供了multi search此需求的支持: 二.elasticsearch mul ...

  10. [C++]vector内存的增长机制

    例子 #include <iostream> #include<vector> #include<algorithm> #include "CPPDemo ...