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:標識生成調試信息
c# 使用GDAL處理大圖