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

  1. gisinternals网站下载最新稳定版(各取所需,红框是我下的版本)
    gisinternals

  2. 点开发现有好多项,这里我选择了直接下载编译完的
    gdal版本

  3. 下载下来的压缩包里是有好多文件,先解压
    压缩包

  4. 我们要找的是C#的库,来到bingdalcsharp目录
    编译后的dll

  5. 最后将dll添加引用,引入项目即可

方案二:NuGet(推荐)

  1. visual studio中,菜单栏上选择 ** 工具 - NuGet程序包管理器 - 管理解决方案的NuGet程序包 **
    Nuget安装gdal

  2. 搜索gdal,安装GDAL以及GDAL-Native
    Nuget安装gdal

  3. 这里我又报错了!(没报错的可以无视这步)提示我这个版本的GDAL需要更高版本的NuGet,这里升级NuGet又需要更新visual studio,无奈C盘容量不够,故放弃更新NuGet,采用控制台安装旧GDAL版本。
    Install-Package GDAL -Version 1.9.2
    PM安装gdal

  4. 安装完成后,可以看到自动往项目里添加了引用,并生成了几个配置类
    gdal引用
    gdal配置

报错

虽然装完了gdal,上来就遇到GdalConfiguration报错,先上代码:

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;
}

GdalPINVOKE报错

网上查了好多资料,都说是没有找到dll导致。但是我考虑NuGet安装的应该不太会配置上有问题,决定先
F11调试一下源码再说。

gdal指向路径

我项目是建了三层架构的,我的gdal用NuGet是安装在了DAL层,但是上面可以看到这里的指向却是主项目里。
这里它的逻辑是去关联主项目indebug目录下的gdal文件夹,回去DAL下的对应路径看了一下,发现NuGet在这确实生成了一个gdal文件夹,里面存了各种版本的dll
gdal文件夹
gdal文件夹内容

找到问题后,我把DAL项目里的gdal文件夹拷贝到了主项目的bin/Debug文件夹下,问题解决!

可是!!!!!另一个方法又报错!!!!!GdalPINVOKE的错误!再上代码

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();
原文地址:https://www.cnblogs.com/giser-s/p/12835214.html