.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();

            // 打开 FileGDB
            using (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();
                        }
                    }
                }
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/736149.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统实验四:openEuler安装(openEuler配置静态网络、编写C或C++)

目录 一、实验要求 二、具体任务安排 1.安装openEuler &#xff08;1&#xff09;下载openEuler镜像 &#xff08;2&#xff09;使用vmware安装openEuler 2.在openEuler中编写C或者C测试程序 &#xff08;1&#xff09;安装g环境 &#xff08;2&#xff09;开始程序编码…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的测试用例执行计划(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 https://app5938.acapp.acwing.com.cn/contest/2/problem/OD…

【b站-湖科大教书匠】2 物理层-计算机网络微课堂

课程地址&#xff1a;【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 物理层 2.1 物理层的基本概念 2.2 物理层下面的传输媒…

Linux——man帮助命令

一、man 获得帮助信息 基本语法&#xff1a;man [命令或配置文件] &#xff08;功能描述&#xff1a;获得帮助信息&#xff09; 查看 ls 命令的帮助信息 [roothadoop101 ~]# man ls man [数字] [函数] 1、Standard commands &#xff08;标准命令&#xff09; 2、System…

【大数据 复习】第3章 分布式文件系统HDFS(重中之重)

一、概念 1.分布式文件系统把文件分布存储到多个计算机节点上&#xff0c;通过网络实现、文件在多台主机上进行分布式存储的文件系统。&#xff08;就是你的电脑存a&#xff0c;我的电脑存pple&#xff09; 2.降低了硬件开销: 与之前使用多个处理器和专用高级硬件的并行化处理装…

RabbitMQ的部署

一、前言 演示的为RabbitMQ的单机部署&#xff0c;在Centos7虚拟机中使用Docker来安装&#xff0c;需要掌握相应的docker命令 二、下载镜像 启动Docker: systemctl start docker 在线拉取&#xff1a;docker pull docker pull rabbitmq:3-management 三、安装MQ 运行容器&…

Python爬虫介绍

Python 作为一种广泛应用的编程语言&#xff0c;在 Web 开发、大数据开发、人工智能开发和嵌入式开发等领域都有着重要的应用。 Python 的易学性、清晰性和可移植性等特点使它得到很多技术人士的喜爱。对于数据科学和机器学习领域的程序员来说&#xff0c;Python 提供了强大的…

Structured Steaming结构化流详解:大案例解析(第12天)

系列文章目录 一、结构化流介绍&#xff08;了解&#xff09; 二、结构化流的编程模型&#xff08;掌握&#xff09; 三、Spark 和 Kafka 整合&#xff0c;流处理&#xff0c;批处理演示&#xff08;掌握&#xff09; 四、物联网数据分析案例&#xff08;熟悉&#xff09; 文章…

【html】用html写一个博物馆首页

效果图&#xff1a; 二级导航&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><l…

如何在纯内网环境下,将EasyCVR视频汇聚网关通过4G与第三方公网云平台级联?

EasyCVR视频汇聚网关是TSINGSEE青犀软硬一体的一款产品&#xff0c;可提供多协议的接入、音视频采集、处理&#xff0c;能实现海量前端设备的轻量化接入/转码/分发、视频直播、云端录像、云存储、检索回看、智能告警、平台级联等&#xff0c;兼容多种操作系统&#xff0c;轻松扩…

搭建Vue的环境

目录 # 开篇 步骤一&#xff0c;准备Vue 的环境 步骤二&#xff0c;下载Vue.js的包 步骤三&#xff0c;创建并打开写前端代码的文件夹 步骤四&#xff0c;在VSCode中引入Vue.js的包 步骤五&#xff0c;创建第一个vue.html Vue其他知识 Vue.config命令 # 开篇 介绍&…

IEEE RAL 具有高运动性能的仿旗鱼机器人协同运动机制研究

水下机器人作为军用侦察、监测及攻击装置备受关注&#xff0c;目前传统水下机器人普遍采用螺旋桨作为推进器&#xff0c;但高噪音、高能耗等问题限制了应用范围。鱼类通过自然选择进化出优异的运动性能&#xff0c;特别是在海洋中游动速度快、机动性强的旗鱼。为了探究快速和高…

【服务器06】之【如何不开外网连接GitHub】

登录GitHub官网 GitHub: Let’s build from here GitHub 注册账号 登录账号 输入一个自定义名字&#xff0c;点击创建存储库就可以了 首先 如何在不开外网的条件下使用GitHub 第一步 下载安装Steam(Watt TooklKit) 区分一下如何查看哪个官网&#xff08;没有百度广告就是…

Mysql数据库约束的概述 , 逐渐约束 , 主键自增 , 表关系的概念和外键 ,多表关系约束介绍和使用

约束和表设计 1、DQL查询语句-limit语句(掌握) 目标 能够掌握limit语句的使用 讲解 作用&#xff1a; LIMIT是限制的意思&#xff0c;所以LIMIT的作用就是限制查询记录的条数。 LIMIT语句格式: select * from 表名 limit offset, row_count; mysql中limit的用法&#…

【服务器02】之阿里云平台

百度一下阿里云官网 点击注册直接使用支付宝注册可以跳过认证 成功登录后&#xff0c;点击产品 点击免费试用 点击勾选 选一个距离最近的 点满GB 注意&#xff1a;一般试用的时用的是【阿里云】&#xff0c;真正做项目时用的是【腾讯云】 现在开始学习使用&#xff1a; 首先…

【地质灾害监测实现有效预警,44人提前安全转移】

6月13日14时&#xff0c;国信华源地质灾害监测预警系统提前精准预警&#xff0c;安全转移10户44人。 该滑坡隐患点通过科学部署国信华源裂缝计、倾角加速度计、雨量计、预警广播等自动化、智能化监测预警设备&#xff0c;实现了对隐患点裂缝、位移、降雨量等关键要素的实时动态…

Java程序之让气球上升

问题&#xff1a; ACM比赛时间再次举行&#xff01;看到气球四处漂浮是多么的兴奋啊。但要告诉你一个秘密&#xff0c;评委们最喜欢的时间是猜测最流行的问题。比赛结束后&#xff0c;他们会数出每种颜色的气球&#xff0c;然后找到结果。今年&#xff0c;他们决定把这份可爱的…

累积阅读量高达1个亿了,刚好完成了一个小目标

大家好&#xff0c; 我是老洪。 做自媒体&#xff0c;这不仅仅是一个职业选择&#xff0c;更是我生活中不可或缺的一部分。 自从我踏入这个领域&#xff0c;时光如白驹过隙&#xff0c;转眼间已经走过了一段不短的旅程。 今天&#xff0c;当我打开后台数据&#xff0c;看到那累…

基于SpringBoot+Vue大学毕业设计管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

《数字图像处理与机器视觉》案例一(库尔勒香梨果梗提取和测量)

一、引言 果梗是判断水果新鲜程度的重要标志&#xff0c;对水果的贮藏和保鲜也具有重要的参考价值。库尔勒香梨分级标准中对果梗有明确要求&#xff0c;要求果梗完整&#xff0c;但由于库尔勒香梨果梗颜色与果实接近&#xff0c;用传统的简单阈值分割方法难以提取。因此&#…