目录
1、工具准备:swig
从链接处下载: SWIG工具
2、下载编译版
链接:c++编译版
1、打开gdal源码目录,cd swig\csharp
nmake /f makefile.vc
'nmake' 不是内部或外部命令,也不是可运行的程序或批处理文件。(使用Developer Command Prompt for VS 你vs版本)
注:社区版的vs可能存在没有nmake的情况,http://go.microsoft.com/fwlink/?LinkId=691126 下载安装
打开这个一下命令窗口:
2、出现错误解决方案:
1)(swig.exe不是有效的命令)
解决方案:将从1处下载的工具 “E:\008GDAL\GDAL\swigwin3\swig.exe ”根据你的路径将该路径加入到环境变量中
环境变量设置方法:环境变量
2)NMAKE : fatal error U1073: 不知道如何生成“ogr_wrap.obj”
执行如下命令:
nmake /f makefile.vc
nmake /f makefile.vc interface
具体执行过程如下:
》》E:\008GDAL\GDAL\gdal\swig\csharp>nmake /f makefile.vc
Microsoft (R) 程序维护实用工具 14.22.27905.0 版
版权所有 (C) Microsoft Corporation。 保留所有权利。
cd ogr
nmake /nologo /f makefile.vc
xcopy /D /Y *.obj ..
复制了 0 个文件
cd ..
cd gdal
nmake /nologo /f makefile.vc
xcopy /D /Y *.obj ..
复制了 0 个文件
cd ..
cd osr
nmake /nologo /f makefile.vc
xcopy /D /Y *.obj ..
复制了 0 个文件
cd ..
cd const
nmake /nologo /f makefile.vc
xcopy /D /Y *.obj ..
复制了 0 个文件
cd ..
csc /platform:x86 /define:CLR4 /target:library /out:osr_csharp.dll osr\
*.cs AssemblyInfo.cs
......
link /dll ogr_wrap.obj E:\008GDAL\OSGeo4W\lib\pro
j_6_2.lib E:\008GDAL\SQLite\lib\SQLite3.lib legacy_stdio_definitio
ns.lib odbc32.lib odbccp32.lib user32.lib ws2_32.lib
kernel32.lib psapi.lib ..\..\gdal_i.lib /out:ogr_wrap.dll
Microsoft (R) Incremental Linker Version 14.22.27905.0
Copyright (C) Microsoft Corporation. All rights reserved.
正在创建库 ogr_wrap.lib 和对象 ogr_wrap.exp
......
正在创建库 gdal_wrap.lib 和对象 gdal_wrap.exp
......
正在创建库 gdalconst_wrap.lib 和对象 gdalconst_wrap.exp
......
正在创建库 osr_wrap.lib 和对象 osr_wrap.exp
......
》》E:\008GDAL\GDAL\gdal\swig\csharp>nmake /f makefile.vc install
Microsoft (R) 程序维护实用工具 14.22.27905.0 版
版权所有 (C) Microsoft Corporation。 保留所有权利。
......
复制了 4 个文件
......
复制了 4 个文件
3、成果展示(8个dll):
4、成果下载地址:
链接: c#版 GDAL3 (可直接在工程中使用)
注:默认生成的为32位的dll
5、测试dll
1)测试dll加载,成功结果图:
测试代码 :
static void Main(string[] args)
{
string ImagePath = @"D:\20200502225730.png";
Gdal.AllRegister();
Dataset dataset = Gdal.Open(ImagePath,Access.GA_ReadOnly);
//获取X、Y方向栅格数
int xSize = dataset.RasterXSize;
int ySize = dataset.RasterYSize;
//读取影像数据到内存中 //获取第一个波段
Band band = dataset.GetRasterBand(1);
double[] dataBuffer = new double[xSize * ySize];
band.ReadRaster(0, 0, xSize, ySize, dataBuffer, xSize, ySize, 0, 0);
}
注意:9个dll一定要复制到运行目录下:
2)测试投影
关于找不到那个proj.db文件问题:
gdal编译需要自己编译proj_6文件,proj.db文件在原始编译文件中(文章开始位置可以找到):
GDAL3版本需要设置proj.db文件位置:
投影测试
using OSGeo.GDAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace wmgdal
{
class Program
{
static void Main(string[] args)
{
Gdal.AllRegister();
//设置proj.db位置
OSGeo.OSR.Osr.SetPROJSearchPath(@"E:\006gdal\share\proj\");
string ImagePath = @"E:\008music\c20200502225730_ProjectRaste1.tif";
Dataset dataset = Gdal.Open(ImagePath,Access.GA_ReadOnly);
//获取X、Y方向栅格数
int xSize = dataset.RasterXSize;
int ySize = dataset.RasterYSize;
//影像波段数
int count= dataset.RasterCount;
//读取影像数据到内存中,//获取第一个波段
Band band = dataset.GetRasterBand(1);
double[] dataBuffer = new double[xSize * ySize];
band.ReadRaster(0, 0, xSize, ySize, dataBuffer, xSize, ySize, 0, 0);
string gCPProjection = dataset.GetGCPProjection();
// 获取投影信息
string projectionRef = dataset.GetProjectionRef();
string projection = dataset.GetProjection();
}
}
}
测试结果图:
该文案的意思就是,gdal3版本需要我们自己设置proj.db文件路径;
3版本和2版本的一个不同的地方,设置proj.db 设置环境变量不一定有效果;
源码分析:属于:OSGeo.OSR.Osr,源码采用的是swig将c++编译成c#的,c#篇不深入解析源码
6、声明
以上通过本人测试与调试,是在项目中实践的方法,经过论证,可以实现,如有问题,请留言,谢谢你的阅读!
转载请标注来源!