zoukankan      html  css  js  c++  java
  • 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();
    
  • 相关阅读:
    iOS
    iOS
    iOS The problems that i encountered
    HTTP STATUS CODE
    MySQL死锁导致无法查询的问题
    JAVA 响应时,按照指定的日期格式返回
    easy额xcel 生成Excel表并返回浏览器弹出下载的简单实现
    Byte数组和字符串相互转换的问题
    Springboot 使用过滤器进行加密解密(二)
    Springboot 部署到linux(二)
  • 原文地址:https://www.cnblogs.com/giser-s/p/12835214.html
Copyright © 2011-2022 走看看