C# winform添加gdal
环境
- win10 专业版 (版本1803)
- visual studio 2012
- .NET Framework 4.5
- gdal 1.9.2
- NuGet 2.8.60318.667
说明
以前C#使用gdal时需要通过编译来获取dll,现在有了直接可以下载到编译完成的dll、以及NuGet可以直接下载,给开发者提供了极大便利。这里介绍两种方案,推荐NuGet。
操作步骤
方案一:下载编译完的dll
-
gisinternals网站下载最新稳定版(各取所需,红框是我下的版本)
-
点开发现有好多项,这里我选择了直接下载编译完的
-
下载下来的压缩包里是有好多文件,先解压
-
我们要找的是C#的库,来到bin\gdal\csharp目录
-
最后将dll添加引用,引入项目即可
方案二:NuGet(推荐)
-
visual studio中,菜单栏上选择 ** 工具 - NuGet程序包管理器 - 管理解决方案的NuGet程序包 **
-
搜索gdal,安装GDAL以及GDAL-Native
-
这里我又报错了!(没报错的可以无视这步)提示我这个版本的GDAL需要更高版本的NuGet,这里升级NuGet又需要更新visual studio,无奈C盘容量不够,故放弃更新NuGet,采用控制台安装旧GDAL版本。
Install-Package GDAL -Version 1.9.2
-
安装完成后,可以看到自动往项目里添加了引用,并生成了几个配置类
报错
虽然装完了gdal,上来就遇到GdalConfiguration报错,先上代码:
/// <summary>
/// 获取要素图层
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static OSGeo.OGR.Layer GetLayer(string filePath)
{
GdalConfiguration.ConfigureGdal(); //上来直接报错!!
GdalConfiguration.ConfigureOgr();
Gdal.AllRegister();
// 注册GDAL
OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");
OSGeo.GDAL.Gdal.AllRegister();
OSGeo.OGR.Ogr.RegisterAll();
// 获取图层
OSGeo.OGR.Driver pDriver = Ogr.GetDriverByName("ESRI Shapefile");
OSGeo.OGR.DataSource pDataSource = pDriver.Open(filePath, 1);
OSGeo.OGR.Layer pLayer = pDataSource.GetLayerByName(System.IO.Path.GetFileNameWithoutExtension(filePath));
return pLayer;
}
网上查了好多资料,都说是没有找到dll导致。但是我考虑NuGet安装的应该不太会配置上有问题,决定先
F11调试一下源码再说。
我项目是建了三层架构的,我的gdal用NuGet是安装在了DAL层,但是上面可以看到这里的指向却是主项目里。
这里它的逻辑是去关联主项目\bin\debug目录下的gdal文件夹,回去DAL下的对应路径看了一下,发现NuGet在这确实生成了一个gdal文件夹,里面存了各种版本的dll
找到问题后,我把DAL项目里的gdal文件夹拷贝到了主项目的bin/Debug文件夹下,问题解决!
可是!!!!!另一个方法又报错!!!!!GdalPINVOKE的错误!再上代码
/// <summary>
/// 读取要素图层属性表
/// </summary>
/// <param name="filePath"></param>
public static void ReadLayerAttributes(string filePath)
{
// 注册GDAL
OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");//这里报错!!!!!
OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");
OSGeo.GDAL.Gdal.AllRegister();
OSGeo.OGR.Ogr.RegisterAll();
// 数据源
OSGeo.OGR.Driver pDriver = OSGeo.OGR.Ogr.GetDriverByName("ESRI Shapefile");
OSGeo.OGR.DataSource pDataSource = pDriver.Open(filePath, 1);
OSGeo.OGR.Layer pLayer = pDataSource.GetLayerByName(System.IO.Path.GetFileNameWithoutExtension(filePath));
}
庆幸的是,有运行正常的方法,一对比发现,注册的地方少了对config的注册,加上最上面这三句就正常了
GdalConfiguration.ConfigureGdal();
GdalConfiguration.ConfigureOgr();
Gdal.AllRegister();
// 注册GDAL
OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");
OSGeo.GDAL.Gdal.AllRegister();
OSGeo.OGR.Ogr.RegisterAll();