在C#中使用OGR读写矢量数据时,需要引用“using OSGeo.OGR;”。同时为了处理中文路径和中文字段,需要在开始设置下面两个属性,代码如下:

//为了支持中文路径,请添加下面这句代码(大多数情况下不需要这句)
//OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
//为了使属性表字段支持中文,请添加下面这句
OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING","");

1.读取矢量

读取矢量代码如下,处理的结果如图1所示。设置了按属性过滤后处理结果如图2所示。

static void ReadVectorFile()
{// 为了支持中文路径,请添加下面这句代码OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO");// 为了使属性表字段支持中文,请添加下面这句OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING","");string strVectorFile ="E:\\Datum\\GDALCsTest\\Debug\\beijing.shp";// 注册所有的驱动Ogr.RegisterAll();//打开数据DataSource ds = Ogr.Open(strVectorFile,0);if( ds == null ){Console.WriteLine( "打开文件【{0}】失败!", strVectorFile );return;}Console.WriteLine( "打开文件【{0}】成功!", strVectorFile );// 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个int iLayerCount = ds.GetLayerCount();// 获取第一个图层Layer oLayer = ds.GetLayerByIndex( 0 );if( oLayer == null ){Console.WriteLine( "获取第{0}个图层失败!\n", 0 );return;}// 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空oLayer.ResetReading();// 通过属性表的SQL语句对图层中的要素进行筛选,这部分详细参考SQL查询章节内容oLayer.SetAttributeFilter("\"NAME99\"LIKE \"北京市市辖区\"");// 通过指定的几何对象对图层中的要素进行筛选//oLayer.SetSpatialFilter();// 通过指定的四至范围对图层中的要素进行筛选//oLayer.SetSpatialFilterRect();// 获取图层中的属性表表头并输出Console.WriteLine( "属性表结构信息:");FeatureDefn oDefn = oLayer.GetLayerDefn();int iFieldCount =oDefn.GetFieldCount();for( int iAttr = 0; iAttr <iFieldCount; iAttr++ ){FieldDefn oField =oDefn.GetFieldDefn( iAttr );Console.WriteLine( "{0}:{1} ({2}.{3})",        oField.GetNameRef(),oField.GetFieldTypeName(oField.GetFieldType()),oField.GetWidth(),oField.GetPrecision() );}// 输出图层中的要素个数Console.WriteLine( "要素个数 = {0}", oLayer.GetFeatureCount(0) );Feature oFeature = null;// 下面开始遍历图层中的要素while( (oFeature =oLayer.GetNextFeature()) != null ){Console.WriteLine("当前处理第{0}个: \n属性值:" ,oFeature.GetFID());// 获取要素中的属性表内容for (int iField = 0;iField<iFieldCount; iField++){FieldDefn oFieldDefn= oDefn.GetFieldDefn(iField);FieldType type =oFieldDefn.GetFieldType();switch (type){caseFieldType.OFTString:Console.WriteLine("{0}\t",oFeature.GetFieldAsString(iField));break;caseFieldType.OFTReal:Console.WriteLine("{0}\t",oFeature.GetFieldAsDouble(iField));break;caseFieldType.OFTInteger:Console.WriteLine("{0}\t",oFeature.GetFieldAsInteger(iField));break;default:Console.WriteLine("{0}\t",oFeature.GetFieldAsString(iField));break;}}// 获取要素中的几何体Geometry oGeometry =oFeature.GetGeometryRef();// 为了演示,只输出一个要素信息break;}Console.WriteLine( "数据集关闭!" );
}

tu图1 OGR库使用C#读取矢量示例1

图2 OGR库使用C#读取矢量示例2

2.写入矢量

在使用C#创建矢量图形的时候,使用的WKT格式的字符串来进行创建。也可以使用其他的方式进行创建。代码如下,写出来的矢量图形和属性表如图3所示。

static void WriteVectorFile()
{// 为了支持中文路径,请添加下面这句代码OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO");// 为了使属性表字段支持中文,请添加下面这句OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING","");string strVectorFile ="E:\\Datum\\GDALCsTest\\Debug\\TestPolygon.shp";// 注册所有的驱动Ogr.RegisterAll();//创建数据,这里以创建ESRI的shp文件为例string strDriverName = "ESRIShapefile";Driver oDriver =Ogr.GetDriverByName(strDriverName);if (oDriver == null){Console.WriteLine("%s 驱动不可用!\n", strVectorFile);return;}// 创建数据源DataSource oDS =oDriver.CreateDataSource(strVectorFile, null);if (oDS == null){Console.WriteLine("创建矢量文件【%s】失败!\n", strVectorFile);return;}// 创建图层,创建一个多边形图层,这里没有指定空间参考,如果需要的话,需要在这里进行指定Layer oLayer =oDS.CreateLayer("TestPolygon", null, wkbGeometryType.wkbPolygon,null);if (oLayer == null){Console.WriteLine("图层创建失败!\n");return;}// 下面创建属性表// 先创建一个叫FieldID的整型属性FieldDefn oFieldID = newFieldDefn("FieldID", FieldType.OFTInteger);oLayer.CreateField(oFieldID, 1);// 再创建一个叫FeatureName的字符型属性,字符长度为50FieldDefn oFieldName = newFieldDefn("FieldName", FieldType.OFTString);oFieldName.SetWidth(100);oLayer.CreateField(oFieldName, 1);FeatureDefn oDefn =oLayer.GetLayerDefn();// 创建三角形要素Feature oFeatureTriangle = newFeature(oDefn);oFeatureTriangle.SetField(0, 0);oFeatureTriangle.SetField(1, "三角形");Geometry geomTriangle =Geometry.CreateFromWkt("POLYGON ((0 0,20 0,10 15,0 0))");oFeatureTriangle.SetGeometry(geomTriangle);oLayer.CreateFeature(oFeatureTriangle);// 创建矩形要素Feature oFeatureRectangle = newFeature(oDefn);oFeatureRectangle.SetField(0, 1);oFeatureRectangle.SetField(1, "矩形");Geometry geomRectangle =Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))");oFeatureRectangle.SetGeometry(geomRectangle);oLayer.CreateFeature(oFeatureRectangle);// 创建五角形要素Feature oFeaturePentagon = newFeature(oDefn);oFeaturePentagon.SetField(0, 2);oFeaturePentagon.SetField(1, "五角形");Geometry geomPentagon =Geometry.CreateFromWkt("POLYGON ((70 0,85 0,90 15,80 30,65 15,700))");oFeaturePentagon.SetGeometry(geomPentagon);oLayer.CreateFeature(oFeaturePentagon);Console.WriteLine("\n数据集创建完成!\n");
}

图3 写入的矢量图形

3.矢量数据管理

static void VectorDelete(string strVectorFile)
{// 注册所有的驱动Ogr.RegisterAll();Driver oDriver = null;{//打开矢量DataSource oDS =Ogr.Open(strVectorFile, 0);if (oDS == null){File.Delete(strVectorFile);return;}oDriver = oDS.GetDriver();if (oDriver == null){File.Delete(strVectorFile);;return;}}if(oDriver.DeleteDataSource(strVectorFile) == Ogr.OGRERR_NONE)return;elseFile.Delete(strVectorFile); ;
}staticvoid VectorRename(string strOldFile, string strNewFile)
{// 注册所有的驱动Ogr.RegisterAll();Driver oDriver = null;{//打开矢量DataSource oDS =Ogr.Open(strOldFile, 0);if (oDS == null){File.Move(strOldFile,strNewFile);return;}oDriver = oDS.GetDriver();if (oDriver == null){File.Move(strOldFile,strNewFile);return;}DataSource oDDS =oDriver.CopyDataSource(oDS, strNewFile, null);if (oDDS == null){File.Move(strOldFile,strNewFile);return;}}if (oDriver.DeleteDataSource(strOldFile)== Ogr.OGRERR_NONE)return;elseFile.Move(strOldFile,strNewFile);
}

GDAL读写矢量文件——C#相关推荐

  1. GDAL读写矢量文件——Java

    关于Java配置GDAL库参考之前的博文. 在Java中使用OGR读写矢量数据时,需要导入ogr库,如果需要对中文路径的支持还有空间参考的支持,需要导入gdal和osr库,代码如下: importor ...

  2. GDAL读写矢量文件——Python

    在Python中使用OGR时,先要导入OGR库,如果需要对中文的支持,还需要导入GDAL库,具体代码如下.Python创建的shp结果如图1所示. 图1 Python创建矢量结果 #-*- codin ...

  3. GDAL创建带有空间参考坐标系的shp矢量文件遇到的问题与解决方法

    之前项目需求:创建矢量文件: 网上查找GDAL/OGR创建矢量文件的各种博客,也查了GDAL官网手册,可是实际生成的shp总是没有成功写入坐标系,空间参考坐标系总是unknown,这就让人很困惑了,实 ...

  4. Java 使用GDAL 读写 shapefile

    阅读目录 读取shp文件,并把它转化为json 写shp文件 回到顶部 读取shp文件,并把它转化为json import org.gdal.ogr.*; import org.gdal.ogr.Dr ...

  5. gdal读写图像分块处理

    转自赵文原文 gdal读写图像分块处理(精华版) Review: 用gdal,感觉还不如直接用C++底层函数对遥感数据进行处理.因为gdal进行太多封装,如果你仅仅只是Geotif等格式进行处理,IO ...

  6. Java+GeoTools工具包+读写shapfile文件

    本篇所用到的测试shapfile文件下载地址: 链接: https://pan.baidu.com/s/1S-TrFp_r8zyf_d0oBUeWqg GeoTools英文帮助文档地址: Geotoo ...

  7. 利用pandas读写HDF5文件

    一.简介 HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式,文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一个H ...

  8. OpenCV读写视频文件解析(二)

    OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++: bool VideoCapture::set(int propId, double value ...

  9. OpenCV读写视频文件解析

    OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在OpenCV 中,VideoCapture 类 ...

最新文章

  1. 2-7-PatchesAdministration
  2. GNN教程:Weisfeiler-Leman算法!
  3. 一些小团队的自动化运维实践经验
  4. 用VS studio 2008做sql server 报表出现乱码
  5. 汤姆克兰西全境封锁服务器维护时间,汤姆克兰西全境封锁无法登录怎么解决 无法登录解决方法攻略...
  6. python实现队列_Python学习教程:用队列实现栈
  7. 多目标决策---基本概念
  8. IoC(控制反转)的主要组件和注入的两种方式
  9. AC自动机 学习链接
  10. 笔记本进入pe却看不到计算机硬盘,一些笔记本进WINPE后找不到硬盘的解决办法...
  11. 英伟达驱动更新记录_英伟达更新驱动最好的方式 - 卡饭网
  12. android 支付宝手势密码锁,Android仿支付宝手势密码解锁功能
  13. java 链表 插入_Java链表中添加元素的原理与实现方法详解
  14. 小米路由器3开启千兆_使用评测 篇三:家庭网络进入千兆时代—小米路由器4开箱及评测...
  15. python爬虫抖音视频代码_python爬虫 抖音短视频解析下载
  16. 软件测试个人能力提升,软件测试人员提升测试技能的10个妙招分享
  17. pythonstdin_Python读取stdin方法实例
  18. 风控黑名单库的使用与判断指南
  19. Golang | 优雅地定义枚举类型
  20. 为什么 application data文件夹是无限循环的

热门文章

  1. MybatisPlus报错: org.apache.velocity.context.Context(已解决)
  2. 一些常用的简单的Lambda写法
  3. 计算机页面高度怎么设置方法,win10系统调节任务栏高度的设置技巧
  4. java获取网络图片_做个看图片的App玩玩_第一篇
  5. mybatis使用char类型字段查询oracle数据库时结果查询不到的问题
  6. JSCore的基本使用
  7. Windows 活动目录(AD)服务器系统升级到2012之最终域控服务器安装(五)
  8. Shell脚本学习-阶段十三-在 Linux 中使用日志来排错
  9. mysql public owner_OWNER支持配置文件目录的继承
  10. C#笔记02 变量、数据类型