c# 使用GDAL处理大图
注意问题:
1.GDAL 使用官网生成好的dll,必须把Bin目录下的dll一并加到执行目录下去,否则会出错。
2. 用环境变量设置引用路径可以避免一大堆dll放一起。代码如下:
/// <summary> /// Function to determine which platform we're on /// </summary> private static string GetPlatform() { return IntPtr.Size == 4 ? "x86" : "x64"; } /// <summary> /// Construction of Gdal/Ogr /// </summary> public static void Gdal_Configuration() { var executingAssemblyFile = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase).LocalPath; var executingDirectory = Path.GetDirectoryName(executingAssemblyFile); if (string.IsNullOrEmpty(executingDirectory)) throw new InvalidOperationException("cannot get executing directory"); var gdalPath = Path.Combine(executingDirectory, "gdal"); var nativePath = Path.Combine(gdalPath, GetPlatform()); // Prepend native path to environment path, to ensure the // right libs are being used. var path = Environment.GetEnvironmentVariable("PATH"); path = nativePath + ";" ; Environment.SetEnvironmentVariable("PATH", path); Gdal.AllRegister(); }
3.最好使用自己手动编译的dll,会少很多没使用到的dll,只用9个dll。
4.用GDAL的用户控件,第二次拖动控件进窗体后会造成“未能加载工具箱项,将从列表中移除”的问题,建议代码手动添加吧,是非托管dll的问题。
编译步骤如下:
首先,下载GDAL源码,官网下即可。
打开D:\gdal\nmake.opt
修改54行: GDAL_HOME = "D:\GDAL"。(编译生成文件的保存路径)
83行: SWIG = D:\swigwin-2.0.4\swig.exe(必须是swigwin.exe的完整路径)。
153行: "#WIN64=YES",去掉#。注意保存。
675行:"SYM_PREFIX=_",去掉最后面的下划线。
打开D:\gdal\makefile.vc,修改23~26行,将“_”改为$(SYM_PREFIX)。如图:
打开D:\1.10.1\swig\csharp\AssemblyInfo.cs文件,将94行代码注释掉,解决安全透明代码无法调用的问题。
打开 D:\1.10.1\swig\csharp\gdal\GdalPINVOKE.cs
D:\1.10.1\swig\csharp\ogr\OgrPINVOKE.cs
D:\1.10.1\swig\csharp\osr\OsrPINVOKE.cs
修改188~193行:将重复的代码注释掉,解决接口重定义的问题。
打开D:\1.10.1\swig\csharp\gdal\Band.cs|Dataset.cs|Driver.cs,修改第17行,解决接口成员名错误问题。
public Band(IntPtr cPtr, bool cMemoryOwn, object parent) : base(GdalPINVOKE.Band_SWIGUpcast(cPtr), cMemoryOwn, parent)
public Dataset(IntPtr cPtr, bool cMemoryOwn, object parent) : base(GdalPINVOKE.Dataset_SWIGUpcast(cPtr), cMemoryOwn, parent)
public Driver(IntPtr cPtr, bool cMemoryOwn, object parent) : base(GdalPINVOKE.Driver_SWIGUpcast(cPtr), cMemoryOwn, parent) {
3、编译
开始—所有程序—Microsoft Visual Studio 2010—Visual Studio Tools—Visual Studio x64兼容工具命令提示(2010)
打开命令行工具,cd d:\gdal-1.10.1
然后执行 nmake /f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
注:编译可能要费一些时间,不要着急。
以上是完成了C++的编译,要再进入csharp编译。
执行 cd swig\csharp
nmake /f makefile.vc
(运行这一步有问题的话,加以下两句:namke /f makefile.vc clear 、nmake /f makefile.vc interface)
nmake /f makefile.vc install
正常情况下可以编译成功。
命令参数说明:
使用命令:nmake -f makefile.vc MSVC_VER=1600 DEBUG=1 ANALYZE=1 WITH_PDB=1 可以设置使用的c++版本
MSVC_VER:VC++的版本,下面是对应关系
1900 = 14.0(2015)
1800 = 12.0(2013)
1700 = 11.0(2012)
1600 = 10.0(2010)
1500 = 9.0 (2008)
1400 = 8.0 (2005) - specific compilation flags, different from older VC++
1310 = 7.1 (2003)
1300 = 7.0 (2002)
1200 = 6.0
DEBUG:bebug版本标识,不使用此参数,默认为Release
ANALYZE=1:对GDAL代码进行分析,这个一般不用
WITH_PDB=1:标识生成调试信息
相关文章
- 《CLR via C#》笔记:第5部分 线程处理(1)
- 《CLR via C#》笔记:第5部分 线程处理(3)(完结)
- c# mysql executenonquery_C#与数据库访问技术之ExecuteNonQuery方法
- asp.net员工管理系统VS开发sqlserver数据库web结构c#编程计算机网页项目
- C# WPF开源控件库:MahApps.Metro
- c#面试题抽象类和接口的区别-金三银四面试:C#程序员经常遇到的30道基础面试题,想你所想
- 如何使用Codecepticon对C#、VBA宏和PowerShell源代码进行混淆处理
- c#操作符??nullcoalescingoperator
- C#数组初始化简析
- C#大数据导出word的假死报错的处理方法
- BarCode条形码基于C#GDI+的实现方法详解
- C#WinForm程序完全退出的问题解决
- c#引用类型与值类型的区别详解
- C#实现Web文件上传的两种方法实例代码
- c#生成随机时间的小例子
- C#3.0中Lambda表达式详解
- c#只读字段和常量的区别,以及静态构造函数的使用实例
- c#实现网页图片提取工具代码分享
- C#Ini文件操作实例
- c#异常处理示例分享
- C#线程执行超时处理与并发线程数控制实例
- C#匹配中文字符串的4种正则表达式分享
- 使用C#实现在word中插入页眉页脚的方法
- C#中事件的继承实例分析
- C#命令模式(CommandPattern)实例教程