C# GDAL 图像读取 哪位有在C#下使用GDAL库读取IMG格式图像的实例,读取TIff的也行!还有就是C#的GDAL库的学习心得?谢谢啦!再找不到就不能毕业了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 GDAL C#接口库的编译与SharpMap(Change Set 21021)对影像的支持研究粟卫民 http://www.gisdev.cn/ http://blog.csdn.net/suen/ 日期:2007-5-22保留所有版权。如需转载,请在醒目位置注明出处在4月11日发布的SharpMap(Change Set 21021)源代码中,增加了对GEOTIFF等影像的支持,它是利用GDAL开源库来实现这一支持的。由于是Change Set版本,此源代码的编译和使用存在不少问题,应广大开源爱好者的要求,同时在他们的无私帮助下,我最终完成了一个同时支持矢量数据和影像的可编译运行的版本,当然还是存在不少问题,希望大家给我提出来。1 GDAL C#接口库的编译GDAL是一个操作各种栅格地理数据格式的库。包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对写入等不支持)。它跨平台,开源,功能强大,连大名鼎鼎的GOOGLE EARTH都使用它。在青岛糨糊特别是青岛村里的月光的帮助下,我成功地编译好了GDAL C#接口库(还有小小问题,不影响使用),下面是编译步骤:(1)下载GDAL1.4.1,下面是下载地址:http://download.osgeo.org/gdal/gdal-1.4.1.tar.gz(2)直接在.Net2005命令行下运行nmake E:\download\gdal141\gdal-1.4.1\makefile.vc文件换成你自己的路径就可以了;(3)在.Net下使用这个库还要编译\swig\csharp下makefile.vc,然后这个目录下会生成8个dll;(4)编译完成swig\csharp后生成的dll名字需要改一下,如gdal_gdal_wrap.dll改成gdal_wrap.dll,因为程序中用到ImportDll时名字没有最前面的gdal_编译的时候可能默认配置文件问题都多加了这几个字母;(5)编译完成swig\csharp后dll是可以直接用的,随便拷贝到别的机器上都可以用,只需要机器安装.Net2005运行时。2 SharpMap读取及显示影像过程分析SharpMap(Change Set 21021)中新增了一个DemoWinForm工程,此工程可以读取和显示矢量图层,我对其进行了扩展,使它能够读取和显示栅格图层。下面详细分析下读取和显示栅格图层的过程。2.1 点击工具条“AddLayer”按钮它的消息响应函数是:BeginInvoke((MethodInvoker)delegate() { loadLayer(); });这是对loadLayer()函数的异步调用,如果对BeginInvoke有疑问请参见利用辅助线程更新用户界面UI。2.2 loadLayer()函数此函数采用工厂方法模式(Factory Method)来创建图层,如果对工厂方法模式不太熟悉的可参见“.NET设计模式(5):工厂方法模式(Factory Method)”。DemoWinForm工程中采用Dictionary<string, ILayerFactory> _layerFactoryCatalog来储存GIS数据文件扩展名及其相应的ILayerFactory,并利用TryGetValue方法来得到某扩展名相应的ILayerFactory。最后调用ILayerFactory的Create方法创建相应图层并使用addLayer函数来增加图层到地图。2.3 GdalRasterLayerFactory类Create函数如下: GdalRasterLayer gdalRasterLayer = new GdalRasterLayer(layerName, connectionInfo); return gdalRasterLayer;2.4 GdalRasterLayer类GdalRasterLayer类属于SharpMap.Extensions工程,它的构建函数中使用了GDAL库,构建函数代码如下:/// <summary>/// initialize a Gdal based raster layer/// </summary>/// <param name="strLayerName">Name of layer</param>/// <param name="imageFilename">location of image</param>public GdalRasterLayer(string strLayerName, string imageFilename){ this.LayerName = strLayerName; this.Filename = imageFilename; disposed = false; OSGeo.GDAL.gdal.AllRegister(); try { _GdalDataset = OSGeo.GDAL.gdal.Open(_Filename, OSGeo.GDAL.gdalconst.GA_ReadOnly); imagesize = new Size(_GdalDataset.RasterXSize, _GdalDataset.RasterYSize); _Envelope = this.GetExtent(); } catch (Exception ex) { _GdalDataset = null; throw new Exception("Couldn't load dataset. " + ex.Message + ex.InnerException); }}显示函数代码如下:/// <summary>/// Renders the layer/// </summary>/// <param name="g">Graphics object reference</param>/// <param name="map">Map which is rendered</param>public override void Render(Graphics g, Map map){ if (disposed) throw (new ApplicationException("Error: An attempt was made to render a disposed layer")); //if (this.Envelope.Intersects(map.Envelope)) //{ this.GetPreview(_GdalDataset, map.Size, g, map.Envelope); //} base.Render(g, map);}附:DemoWinForm工程代码:http://www.gisdev.cn/test/downloads/DemoWinForm.rar示例图像文件:http://www.gisdev.cn/test/downloads/RasterData.rar 我想要源码来看看.http://www.gisdev.cn/test/downloads/DemoWinForm.rar下载不了``那位老师发我下`邮箱 [email protected] Windows CE系统时间的修改问题 小弟急求一个能在webservice中的跳转方法!!!谢谢 FileUpload控件问题 c#.net中windowsform加了一个webBrowser,请问该如何在程序中更改URL? ListBox 设置多选的问题 .NET Framework 4操作文件目录出错 c#发送mail的问题 如何把一张大料开成小料,有没有好的算法。 关于xml读取和C#类型转换的问题,初级问题 为什么就不能… 哈希表! 程序运行问题。。。。。救命啊。。。
保留所有版权。如需转载,请在醒目位置注明出处
在4月11日发布的SharpMap(Change Set 21021)源代码中,增加了对GEOTIFF等影像的支持,它是利用GDAL开源库来实现这一支持的。由于是Change Set版本,此源代码的编译和使用存在不少问题,应广大开源爱好者的要求,同时在他们的无私帮助下,我最终完成了一个同时支持矢量数据和影像的可编译运行的版本,当然还是存在不少问题,希望大家给我提出来。
1 GDAL C#接口库的编译GDAL是一个操作各种栅格地理数据格式的库。包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对写入等不支持)。它跨平台,开源,功能强大,连大名鼎鼎的GOOGLE EARTH都使用它。在青岛糨糊特别是青岛村里的月光的帮助下,我成功地编译好了GDAL C#接口库(还有小小问题,不影响使用),下面是编译步骤:
(1)下载GDAL1.4.1,下面是下载地址:
http://download.osgeo.org/gdal/gdal-1.4.1.tar.gz
(2)直接在.Net2005命令行下运行nmake E:\download\gdal141\gdal-1.4.1\makefile.vc
文件换成你自己的路径就可以了;
(3)在.Net下使用这个库还要编译\swig\csharp下makefile.vc,然后这个目录下会生成8个dll;
(4)编译完成swig\csharp后生成的dll名字需要改一下,如gdal_gdal_wrap.dll改成gdal_wrap.dll,因为程序中用到ImportDll时名字没有最前面的gdal_编译的时候可能默认配置文件问题都多加了这几个字母;
(5)编译完成swig\csharp后dll是可以直接用的,随便拷贝到别的机器上都可以用,只需要机器安装.Net2005运行时。
2 SharpMap读取及显示影像过程分析SharpMap(Change Set 21021)中新增了一个DemoWinForm工程,此工程可以读取和显示矢量图层,我对其进行了扩展,使它能够读取和显示栅格图层。下面详细分析下读取和显示栅格图层的过程。
2.1 点击工具条“AddLayer”按钮它的消息响应函数是:
BeginInvoke((MethodInvoker)delegate() { loadLayer(); });
这是对loadLayer()函数的异步调用,如果对BeginInvoke有疑问请参见利用辅助线程更新用户界面UI。
2.2 loadLayer()函数此函数采用工厂方法模式(Factory Method)来创建图层,如果对工厂方法模式不太熟悉的可参见“.NET设计模式(5):工厂方法模式(Factory Method)”。DemoWinForm工程中采用Dictionary<string, ILayerFactory> _layerFactoryCatalog来储存GIS数据文件扩展名及其相应的ILayerFactory,并利用TryGetValue方法来得到某扩展名相应的ILayerFactory。最后调用ILayerFactory的Create方法创建相应图层并使用addLayer函数来增加图层到地图。
2.3 GdalRasterLayerFactory类Create函数如下:
GdalRasterLayer gdalRasterLayer = new GdalRasterLayer(layerName, connectionInfo);
return gdalRasterLayer;
2.4 GdalRasterLayer类GdalRasterLayer类属于SharpMap.Extensions工程,它的构建函数中使用了GDAL库,构建函数代码如下:
/// <summary>
/// initialize a Gdal based raster layer
/// </summary>
/// <param name="strLayerName">Name of layer</param>
/// <param name="imageFilename">location of image</param>
public GdalRasterLayer(string strLayerName, string imageFilename)
{
this.LayerName = strLayerName;
this.Filename = imageFilename;
disposed = false; OSGeo.GDAL.gdal.AllRegister();
try
{
_GdalDataset = OSGeo.GDAL.gdal.Open(_Filename, OSGeo.GDAL.gdalconst.GA_ReadOnly);
imagesize = new Size(_GdalDataset.RasterXSize, _GdalDataset.RasterYSize);
_Envelope = this.GetExtent();
}
catch (Exception ex) {
_GdalDataset = null;
throw new Exception("Couldn't load dataset. " + ex.Message + ex.InnerException);
}
}
显示函数代码如下:
/// <summary>
/// Renders the layer
/// </summary>
/// <param name="g">Graphics object reference</param>
/// <param name="map">Map which is rendered</param>
public override void Render(Graphics g, Map map)
{
if (disposed)
throw (new ApplicationException("Error: An attempt was made to render a disposed layer"));
//if (this.Envelope.Intersects(map.Envelope))
//{
this.GetPreview(_GdalDataset, map.Size, g, map.Envelope);
//}
base.Render(g, map);
}
附:DemoWinForm工程代码:
http://www.gisdev.cn/test/downloads/DemoWinForm.rar
示例图像文件:
http://www.gisdev.cn/test/downloads/RasterData.rar