栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C# winform使用gdal

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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网站下载最新稳定版(各取所需,红框是我下的版本)

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

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

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

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

方案二:NuGet(推荐)
  1. visual studio中,菜单栏上选择 ** 工具 - NuGet程序包管理器 - 管理解决方案的NuGet程序包 **

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

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

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

报错

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

/// 
/// 获取要素图层
/// 
/// 
/// 
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层,但是上面可以看到这里的指向却是主项目里。
这里它的逻辑是去关联主项目bindebug目录下的gdal文件夹,回去DAL下的对应路径看了一下,发现NuGet在这确实生成了一个gdal文件夹,里面存了各种版本的dll

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

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

/// 
/// 读取要素图层属性表
/// 
/// 
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();
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935805.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号