.NET C# 使用GDAL将mdb转换gdb数据

.NET C# 使用GDAL将mdb转换gdb数据

目录

  • .NET C# 使用GDAL将mdb转换gdb数据
    • 1 环境
    • 2 Nuget
    • 3 Code

1 环境

VisualStudio2022 + .NET6 + GDAL 3.8.5

2 Nuget

image-20240618155259168

3 Code

FeatureExtension.cs

public static class FeatureExtension
{[DllImport("gdal.dll", EntryPoint = "OGR_F_GetFieldAsBinary", CallingConvention = CallingConvention.Cdecl)]public extern static IntPtr OGR_F_GetFieldAsBinary(HandleRef handle, int index, out int byteCount);[DllImport("gdal.dll", EntryPoint = "OGR_F_GetFieldAsString", CallingConvention = CallingConvention.Cdecl)]public extern static IntPtr OGR_F_GetFieldAsString(HandleRef handle, int i);[DllImport("gdal.dll", EntryPoint = "CPLStrnlen", CallingConvention = CallingConvention.Cdecl)]public extern static uint CPLStrnlen(IntPtr handle, uint nMaxLen);public static byte[] GetFieldAsBinary(this Feature feature, int index, FeatureDatastoreType datastoreType){if (datastoreType == FeatureDatastoreType.GDB){int byteCount = 0;IntPtr pIntPtr = OGR_F_GetFieldAsBinary(Feature.getCPtr(feature), index, out byteCount);byte[] byteArray = new byte[byteCount];Marshal.Copy(pIntPtr, byteArray, 0, byteCount);return byteArray;}else{IntPtr pchar = OGR_F_GetFieldAsString(Feature.getCPtr(feature), index);int length = (int)CPLStrnlen(pchar, uint.MaxValue);byte[] byteArray = new byte[length];Marshal.Copy(pchar, byteArray, 0, length);return byteArray;}}public static byte[] GetFieldAsBinary(this Feature feature, string fieldName, FeatureDatastoreType datastoreType){int index = feature.GetFieldIndex(fieldName);if (datastoreType == FeatureDatastoreType.GDB){int byteCount = 0;IntPtr pIntPtr = OGR_F_GetFieldAsBinary(Feature.getCPtr(feature), index, out byteCount);byte[] byteArray = new byte[byteCount];Marshal.Copy(pIntPtr, byteArray, 0, byteCount);return byteArray;}else{IntPtr pchar = OGR_F_GetFieldAsString(Feature.getCPtr(feature), index);int length = (int)CPLStrnlen(pchar, uint.MaxValue);byte[] byteArray = new byte[length];Marshal.Copy(pchar, byteArray, 0, length);return byteArray;}}
}

FeatureDatastoreType.cs

public enum FeatureDatastoreType
{Other,GDB
}

MDB2GDB.cs

public class MDB2GDB
{public void Convert(string mdbFilePath, string gdbFilePath){// 注册所有驱动GdalConfiguration.ConfigureGdal();GdalConfiguration.ConfigureOgr();// 注册编码提供程序以支持GBK编码Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);// 打开MDB数据源var mdbDriver = Ogr.GetDriverByName("PGeo");if (mdbDriver == null){Console.WriteLine("MDB driver is not available.");return;}DataSource mdbDataSource = null;try{mdbDataSource = mdbDriver.Open(mdbFilePath, 0);}catch(Exception ex){Console.WriteLine("Failed to open MDB file.");return;}// 创建GDB数据源Driver gdbDriver = Ogr.GetDriverByName("OpenFileGDB");if (gdbDriver == null){Console.WriteLine("OpenFileGDB driver is not available.");return;}DataSource gdbDataSource = null;try{gdbDataSource = gdbDriver.CreateDataSource(gdbFilePath, null);}catch(Exception ex){Console.WriteLine("Failed to create GDB file.");return;}// 遍历MDB数据源中的所有图层并复制到GDB数据源for (int i = 0; i < mdbDataSource.GetLayerCount(); i++){Layer mdbLayer = mdbDataSource.GetLayerByIndex(i);string lyrName = mdbLayer.GetName();Layer gdbLayer = gdbDataSource.CreateLayer(lyrName, mdbLayer.GetSpatialRef(), mdbLayer.GetGeomType(), null);Console.WriteLine($"Source Layer: {lyrName}");// 复制字段定义FeatureDefn mdbFeatureDefn = mdbLayer.GetLayerDefn();for (int j = 0; j < mdbFeatureDefn.GetFieldCount(); j++){FieldDefn fieldDefn = mdbFeatureDefn.GetFieldDefn(j);string fieldName = fieldDefn.GetName();Console.WriteLine($"Source Field: {fieldDefn.GetName()} - Right Field: {fieldName}");gdbLayer.CreateField(fieldDefn, 1);}mdbLayer.ResetReading();// 复制要素Feature mdbFeature;while ((mdbFeature = mdbLayer.GetNextFeature()) != null){Feature gdbFeature = new Feature(gdbLayer.GetLayerDefn());gdbFeature.SetFrom(mdbFeature, 1);// 显式设置字段的字符编码,这里为解决MDB数据中的中文使用GBK编码导致的中文乱码问题for (int j = 0; j < gdbFeature.GetFieldCount(); j++){FieldType fieldType = gdbFeature.GetFieldDefnRef(j).GetFieldType();if (fieldType == FieldType.OFTString || fieldType == FieldType.OFTWideString){byte[] bytes = gdbFeature.GetFieldAsBinary(j, FeatureDatastoreType.Other);string fieldValue = Encoding.GetEncoding("GBK").GetString(bytes);gdbFeature.SetField(j, fieldValue);}}//如果MDB数据编码使用的utf8则不需要上面这段代码gdbLayer.CreateFeature(gdbFeature);mdbFeature.Dispose();gdbFeature.Dispose();}}// 释放资源mdbDataSource.Dispose();gdbDataSource.Dispose();Console.WriteLine("Conversion completed successfully.");}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【权威主办|检索稳定】2024年法律、教育与社会发展国际会议 (LESD 2024)

2024年法律、教育与社会发展国际会议 (LESD 2024) International Conference on Law, Education and Social Development in 2024 【重要信息】 大会地点&#xff1a;成都 官网地址&#xff1a;http://www.iclesd.com 投稿邮箱&#xff1a;iclesdsub-conf.com 【注意&#xff1…

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes References O…

Renesas MCU使用SCI_I2C驱动HS3003

目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 认识HS3003 1.2.1 HS3003特性 1.2.2 HS3003寄存器 1.2.2.1 温湿度数据寄存器 1.2.2.2 参数寄存器 1.2.2.3 一个参数配置Demo 1.2.3 温湿度值转换 1.2.4 HS3003应用电路 1.2.4.1 PIN引脚定义 1.2.4.2 sensor 应用电路 …

Django-开发一个列表页面

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…

【八股系列】Vue中的<keep-alive>组件:深入解析与实践指南

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【探索响应式布局的奥秘&#xff1a;关键技术与实战代码示例】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评论…

正则表达式;grep、sed、awk、soft、uniq、tr 详解

正则表达式 概念 正则表达式&#xff08;Regular Expression&#xff0c;常简写为regex、regexp或RE&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种模式匹配。 标准正则表达式 首先安装正则表达式pcre库 创…

C++ | Leetcode C++题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …

Shell 编程入门

优质博文&#xff1a;IT-BLOG-CN 【1】x.sh文件内容编写&#xff1a; 固定开头&#xff1a;#&#xff01;/bin/sh&#xff1b; 【2】学习的第一个命令就是echo输出的意思&#xff1b; 【3】其实shell脚本也就是在文件中写命令&#xff0c;但是我们要写的是绝对路径&#xff1a…

mysql岗位实习----教务系统管理

教务管理系统 一、DDL CREATE TABLE users (user_id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户ID,username varchar(50) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,gender enum(男,女) NOT NULL COMMENT 性别,email varchar(100) DEFAULT N…

C++初学者指南第一步---14.函数调用机制

C初学者指南第一步—14.函数调用机制 文章目录 C初学者指南第一步---14.函数调用机制1.记住&#xff1a;内存的结构2.函数调用是如何工作的3. 不要引用局部变量4. 常见编译器优化5. Inlining内联 1.记住&#xff1a;内存的结构 堆&#xff08;自由存储&#xff09; 用于动态存…

Redis-实战篇-缓存雪崩

文章目录 1、缓存雪崩2、解决方案&#xff1a; 1、缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 2、解决方案&#xff1a; 给不同的key的TTL添加随机值利用Redis集群提高服务的可用性…

华为电脑重装系统如何操作?电脑Win11系统重装注意什么?图文详细解答

随着科技的不断进步&#xff0c;操作系统更新换代的步伐也日益加快。华为电脑作为市场中的佼佼者&#xff0c;其搭载的Windows 11系统凭借其强大的性能和丰富的功能受到了用户的广泛好评。然而&#xff0c;随着使用时间的推移&#xff0c;系统可能会出现各种问题&#xff0c;如…

验证码技术 easy-captcha

依赖 <!-- easy-captcha用来生成验证码&#xff0c;由于jdk9以后&#xff0c;内置JavaScript去掉了&#xff0c;所以需要导入这个org.openjdk.nashorn --> <dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</arti…

牛客挑战赛75 D. 不存在的玩家(sg图dp)

题目 思路来源 灵茶山群群友 https://blog.csdn.net/Code92007/article/details/110354429 题解 其实想了想&#xff0c;和20年小米邀请赛决赛这个G题的dp思路是一样的&#xff0c;姑且称为sg图dp吧 按sg值从大到小dp&#xff0c;每次补上全局sg值-1的这些点&#xff0c; …

网约车停运损失费:2、协商过程

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

Houdini 通过wedge来做模拟参数对比 (PDG TOP)

我们的设定如下例子 这是个简单的布料悬挂的例子。上方两个角分别被固定住了&#xff0c;然后在distance约束下布料下垂。 我们现在的目的是想要对比不同的streach stiffness对模拟的影响。 第一步&#xff1a;找到stiffness参数&#xff0c;右键expression->edit expre…

iis控制文件或者文件夹是否允许被访问

问题 出于数据或者网络安全&#xff0c;禁止扫描工具直接扫描到某些包含敏感信息的文件&#xff0c;尤其比如日志、配置&#xff0c;如何不写代码&#xff0c;使用iis处理呢&#xff1f; 假设有如下网站&#xff0c;访问http://localhost:6001/Logs/20240626.txt就会出现日志&…

AI开发Windows环境搭建

文章目录 1. GPU 支持检查2. 安装 Anaconda3. 创建 PyTorch 虚拟环境3.2 创建虚拟 PyTorchEnv 环境3.3 检查、激活、推出虚拟环境3.4 虚拟环境中python包管理3.5 虚拟环境中安装 PyTorch 框架 4. TensorFlow 安装 1. GPU 支持检查 打开 Task Manager (任务管理器&#xff09;&…

DPDK使用make编译并运行示例程序

环境&#xff1a; VMware Workstation 16 Pro 16.2.4 虚拟机系统&#xff1a;Centos 8 DPDK版本&#xff1a;stable-20.11.10 下载源码后&#xff0c;使用meson和ninja编译完成、配置并挂载大页、内核和VFIO设置完成&#xff0c;在dpdk源码目录下的build/…

docker搭建mongo分片集群

1、mongo分片集群 MongoDB分片集群是一种可扩展的数据库架构&#xff0c;用于处理大量数据和高并发访问。它将数据分成多个分片&#xff0c;并将这些分片分布在多个服务器上&#xff0c;从而实现数据的平衡存储和并行处理 。 通过使用MongoDB的分片集&#xff0c;可以实现数据…