做系统开发或者数据处理的时候,我一般还是喜欢使用文件数据源,例如矢量用.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. go get 报错:dial tcp 142.251.43.17:443: i/o timeout

    自动下载 go env -w GO111MODULE=on 设置环境为国内代理 go env -w GOPROXY=https://goproxy.cn,direct 注:go 版本需要支持 mod

  2. combotree 的简单使用

    一.前端 combotree HTML: <input id="201711281652407353448711985811" class="easyUI-comb ...

  3. nginx压力测试及限速

    测试工具:Apache ab windows安装教程:https://www.cnblogs.com/laijinquan/p/14694655.html 64位下载地址:https://www.ap ...

  4. LeetCode HOT 100:在排序数组中查找元素的第一个和最后一个位置

    题目:34. 在排序数组中查找元素的第一个和最后一个位置 题目描述: 给你一个递增数组,和一个目标值target,最终返回数组中第一次出现target和最后一次出现target的下标.如果该数组中没有 ...

  5. 使用Git提交代码

    目录 1.提交前准备工作 2.代码提交步骤 3.从git上面拉代码 4.Git变更集 5.参考资料 1.提交前准备工作 首先去git官网下载git工具(Git GUI Here.Git Bash He ...

  6. [seaborn] seaborn学习笔记1-箱形图Boxplot

    文章目录 1 箱形图Boxplot 1. 基础箱形图绘制 Basic boxplot and input format 2. 自定义外观 Custom boxplot appearance 3. 箱型 ...

  7. JQuery拖拽移动

    /** * zzh_2022032101_拖拽移动 * @param obj 目标对象 / #id / .class * @param moveOut 是否可以移出边界 */ function dra ...

  8. Visual Studio2017快速收缩/扩展代码块

    首先要设置伸缩函数的同时也伸缩region块: 快捷键 Ctrl+M+O 收缩所有方法 Ctrl+M+L 展开所有方法

  9. P3845 [TJOI2007]球赛

    简要题意 \(T\) 组数据,每一组数据给出 \(n\) 个数对 \((a,b)\).你需要将其分为几组,使得组单调不降.求最小组数. 思路 模拟赛考的题. 先来介绍 Dilworth 定理: 对于任 ...

  10. Ansible 学习笔记 - 定位主机和组的模式

    中英文对照表 英文 中文 备注 host 主机 group (主机)组 pattern 模式 ad hoc 特别命令 playbook 剧本 Ansible 专有名词,一段复杂的编排 inventor ...