当前位置: 首页 > news >正文

.NET C# 使用GDAL读取FileGDB要素类

.NET C# 使用GDAL读取FileGDB要素类

目录

  • .NET C# 使用GDAL读取FileGDB要素类
    • 1 环境
    • 2 Nuget
    • 3 Code

1 环境

VisualStudio2022 + .NET6 + GDAL 3.7.5

2 Nuget

image-20240618155259168

3 Code

using OSGeo.OGR;
using OSGeo.OSR;namespace TestGDAL
{internal class Program{static void Main(string[] args){string strDataPath = @".\Data\Default.gdb";GdalConfiguration.ConfigureGdal();GdalConfiguration.ConfigureOgr();// 打开 FileGDBusing (var driver = Ogr.GetDriverByName("OpenFileGDB"))using (var dataSource = driver.Open(strDataPath, 0)){if (dataSource == null){Console.WriteLine("Failed to open FileGDB.");return;}List<Layer> layers = new List<Layer>();int layerCount = dataSource.GetLayerCount();for (int i = 0; i < layerCount; i++){// 读取要素类Layer layer = dataSource.GetLayerByIndex(i);layers.Add(layer);}Console.WriteLine("GDB Layers: ");foreach (var layer in layers){string layerName = layer.GetName();// 要素类集合类型wkbGeometryType wkbGeometryType = layer.GetGeomType();// 空间引用(坐标系)SpatialReference spatialReference = layer.GetSpatialRef();Console.WriteLine($"LayerName: {layerName}\tGeometryType: {wkbGeometryType}\tSpatialReference: {spatialReference.GetName()}");}Console.WriteLine();Console.WriteLine("Geometry: ");foreach (var layer in layers){Console.WriteLine(layer.GetName());Console.WriteLine("Geometry Wkt");// 将读指针设置初始位置layer.ResetReading();Feature feature;while ((feature = layer.GetNextFeature()) != null){try{// 几何图形Geometry geometry = feature.GetGeometryRef();int v = geometry.ExportToWkt(out string wkt);Console.WriteLine(wkt);}catch (Exception ex){Console.WriteLine(ex);}finally{feature.Dispose();}}}Console.WriteLine();Console.WriteLine("Attribute Table: ");foreach (var layer in layers){Console.WriteLine(layer.GetName());FeatureDefn featureDefn = layer.GetLayerDefn();List<FieldDefn> fieldDefns = new List<FieldDefn>();int fieldCount = featureDefn.GetFieldCount();for (int i = 0; i < fieldCount; i++){// 获取字段FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);fieldDefns.Add(fieldDefn);}Console.WriteLine(string.Join(",", fieldDefns.Select(f => f.GetName())));layer.ResetReading();Feature feature;while ((feature = layer.GetNextFeature()) != null){try{List<string> values = new List<string>();for (int i = 0; i < fieldDefns.Count; i++){FieldDefn fieldDefn = fieldDefns[i];string fieldName = fieldDefn.GetName();// 字段类型FieldType fieldType = fieldDefn.GetFieldType();// 获取字段值switch (fieldType){case FieldType.OFTInteger:int valInt = feature.GetFieldAsInteger(fieldName);values.Add(valInt + "");break;case FieldType.OFTString:string valStr = feature.GetFieldAsString(fieldName);values.Add(valStr);break;case FieldType.OFTWideString:string valWidStr = feature.GetFieldAsString(fieldName);values.Add(valWidStr);break;case FieldType.OFTDate:feature.GetFieldAsDateTime(fieldName,out int dyear,out int dmonth,out int dday,out int dhour,out int dminute,out float dsecond,out int dtzFlag);DateTime valDate = new DateTime(dyear, dmonth, dday, dhour, dminute, Convert.ToInt32(dsecond));values.Add(valDate.ToString());break;case FieldType.OFTTime:feature.GetFieldAsDateTime(fieldName,out int tyear,out int tmonth,out int tday,out int thour,out int tminute,out float tsecond,out int ttzFlag);DateTime valTime = new DateTime(tyear, tmonth, tday, thour, tminute, Convert.ToInt32(tsecond));values.Add(valTime.ToString());break;case FieldType.OFTDateTime:feature.GetFieldAsDateTime(fieldName,out int dtyear,out int dtmonth,out int dtday,out int dthour,out int dtminute,out float dtsecond,out int dttzFlag);DateTime valDateTime = new DateTime(dtyear, dtmonth, dtday, dthour, dtminute, Convert.ToInt32(dtsecond));values.Add(valDateTime.ToString());break;case FieldType.OFTInteger64:long valLon = feature.GetFieldAsInteger64(fieldName);values.Add(valLon + "");break;default:break;}}Console.WriteLine(string.Join(",", values));}catch (Exception ex){Console.WriteLine(ex);}finally{feature.Dispose();}}}}}}
}

相关文章:

  • Spring Boot集成tablesaw插件快速入门
  • 2024广东省职业技能大赛云计算赛项实战——Ceph集群部署
  • 微信小程序-scroll-view实现上拉加载和下拉刷新
  • 细说MCU定时器中断的实现方法
  • Java18新特性(极简)
  • 在Linux/Ubuntu/Debian中使用SSH连接远程服务器VPS
  • curl命令使用
  • 活出属于自己的人生
  • VScode基本使用
  • 使用 Netty 自定义解码器处理粘包和拆包问题详解
  • 【HiveSQL】join关联on和where的区别及效率对比
  • 【总线】AXI4第三课时:握手机制
  • 磁力搜索器,解读新一代的搜索引擎方式,磁力王、磁力猫等引擎的异同及原理
  • Java学习 (四) 面向对象--类与方法
  • 工业 UI 风格,展现独特魅力
  • 【EOS】Cleos基础
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • ES2017异步函数现已正式可用
  • Javascript编码规范
  • Python进阶细节
  • 动态魔术使用DBMS_SQL
  • 工作手记之html2canvas使用概述
  • 马上搞懂 GeoJSON
  • 如何编写一个可升级的智能合约
  • 如何使用 JavaScript 解析 URL
  • 通信类
  • 优秀架构师必须掌握的架构思维
  • 正则学习笔记
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • # dbt source dbt source freshness命令详解
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.11) SiK Radio v2(一)
  • (1)(1.13) SiK无线电高级配置(五)
  • (6)设计一个TimeMap
  • (day6) 319. 灯泡开关
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net连接oracle数据库
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [20150629]简单的加密连接.txt
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [ARM]ldr 和 adr 伪指令的区别
  • [BUG] Authentication Error
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [C#]winform部署yolov9的onnx模型
  • [C++打怪升级]--学习总目录