`
阿尔萨斯
  • 浏览: 4149648 次
社区版块
存档分类
最新评论

基于.NET 2.0的GIS开源项目SharpMap分析手记(七):GDAL C#接口库的编译与SharpMap(Change Set 21021)对影像的支持研究

 
阅读更多

基于.NET 2.0GIS开源项目SharpMap分析手记(七):GDAL C#接口库的编译与SharpMapChange Set 21021)对影像的支持研究

粟卫民 http://www.gisdev.cn/ http://blog.csdn.net/suen/ 日期:<chsdate w:st="on" isrocdate="False" islunardate="False" day="22" month="5" year="2007"><span lang="EN-US">2007-5-22</span></chsdate>

保留所有版权。如需转载,请在醒目位置注明出处

411日发布的SharpMapChange Set 21021)源代码中,增加了对GEOTIFF等影像的支持,它是利用GDAL开源库来实现这一支持的。由于是Change Set版本,此源代码的编译和使用存在不少问题,应广大开源爱好者的要求,同时在他们的无私帮助下,我最终完成了一个同时支持矢量数据和影像的可编译运行的版本,当然还是存在不少问题,希望大家给我提出来。

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 294pt" type="#_x0000_t75"><imagedata o:title="DemoWinForm" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.jpg"></imagedata></shape>

1 GDAL C#接口库的编译

GDAL是一个操作各种栅格地理数据格式的库。包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对写入等不支持)。它跨平台,开源,功能强大,连大名鼎鼎的GOOGLE EARTH都使用它。在青岛糨糊特别是青岛村里的月光的帮助下,我成功地编译好了GDAL C#接口库(还有小小问题,不影响使用),下面是编译步骤:

1)下载GDAL<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.4.1</chsdate>,下面是下载地址:

http://download.osgeo.org/gdal/gdal-1.4.1.tar.gz

2)直接在.Net2005命令行下运行nmake E:/download/gdal141/gdal-<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.4.1</chsdate>/makefile.vc

文件换成你自己的路径就可以了;

3)在.Net下使用这个库还要编译/swig/csharpmakefile.vc,然后这个目录下会生成8dll

4)编译完成swig/csharp后生成的dll名字需要改一下,gdal_gdal_wrap.dll改成gdal_wrap.dll,因为程序中用到ImportDll时名字没有最前面的gdal_编译的时候可能默认配置文件问题都多加了这几个字母;

5)编译完成swig/csharpdll是可以直接用的,随便拷贝到别的机器上都可以用,只需要机器安装.Net2005运行时。

2 SharpMap读取及显示影像过程分析

SharpMapChange 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</string>来储存GIS数据文件扩展名及其相应的ILayerFactory,并利用TryGetValue方法来得到某扩展名相应的ILayerFactory。最后调用ILayerFactoryCreate方法创建相应图层并使用addLayer函数来增加图层到地图。

2.3 GdalRasterLayerFactory

Create函数如下:

GdalRasterLayer gdalRasterLayer = new GdalRasterLayer(layerName, connectionInfo);

return gdalRasterLayer;

2.4 GdalRasterLayer

GdalRasterLayer类属于SharpMap.Extensions工程,它的构建函数中使用了GDAL库,构建函数代码如下:

/// <summary></summary>

/// initialize a Gdal based raster layer

///

/// Name of layer

/// location of image

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></summary>

/// Renders the layer

///

/// Graphics object reference

/// Map which is rendered

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




<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
分享到:
评论

相关推荐

    基于.NET 2.0的GIS开源项目SharpMap分析手记

    基于.NET 2.0的GIS开源项目SharpMap分析手记---粟卫民(收集为doc文档)

    基于.NET2.0的GIS开源项目SharpMap分析手记.doc

    基于.NET2.0的GIS开源项目SharpMap分析手记.doc

    1 基于NET 20的GIS开源项目SharpMap分析手记.doc

    1 基于NET 20的GIS开源项目SharpMap分析手记.doc

    GIS项目SharpMap源代码

    是基于.NET 2.0的GIS开源项目SharpMap 支持sharp文件和mysql等作为数据源 用来做GIS地图显示和渲染很方便

    C#开源GIS项目SharpMAP

    国外开源gis项目源代码及例子,可以做WEBGIS和窗体应用程序GIS

    SharpMap对影像的支持示例代码

    在4月11日发布的SharpMap(Change Set 21021)源代码中,增加了对GEOTIFF等影像的支持,它是利用GDAL开源库来实现这一支持的。由于是Change Set版本,此源代码的编译和使用存在不少问题,应广大开源爱好者的要求,...

    开源GIS Sharpmap及其shp资源

    SharpMap是一个基于.net 2.0使用C#开发的Map渲染类库,可以渲染各类GIS数据,可应用于桌面和Web程序。 目前支持B/S及C/S两种方式的DLL调用,支持地图渲染效果。稳定版本为0.9,最新版本为2.0,代码行数近10000行。

    asp.net知识库

    体验.net2.0的优雅(四):Provider、策略、控制反转和依赖注入 泛型最佳实践 asp.net 2.0下嵌套masterpage页的可视化编辑 C# 2.0与泛型 动态调用对象的属性和方法——性能和灵活性兼备的方法 泛型技巧系列:用泛型...

    最新 SharpMap源码

    目前的很多的项目中都用到了GIS 软件,然而在开源的GIS软件中有SharpMap在工程应用中开始被人发觉。相比一些GIS软件它拥有的优势有: 1、占用资源较少,响应比较快。在对于项目中如果只需要简单的地图功能的话,是...

    sharpmapmap渲染

    SharpMap是一个基于.net 2.0使用C#开发的Map渲染类库,可以渲染各类GIS数据(目前支持ESRI Shape和PostGIS格式),可应用于桌面和Web程序。 它的优点有:  1、占用资源较少,响应比较快。在对于项目中如果只需要...

    GIS软件SharpMap源码详解及应用

    这本《GIS软件SharpMap源码详解及应用》由陈真、何津、余瑞编著,对目前基于C#语言开发的GIS开源项目——SharpMap进行详细剖析、解释,以便GIS专业学生及GIS的初学者能学习和掌握GIS底层开发技术。全书分为3部分共计...

    C#调用GIS的DLL SharpMap.dll

    C#调用GIS的DLL SharpMap.dll

    SharpMap开源代码和项目实例

    经典C# GIS,开源,SharpMap开源代码和项目实例

    sharpmap2.0 winformsample 可用

    sharpmap2.0 winformsample 可用,共同学习

    【吐血推荐】史上最全的GIS开源项目源码合集

    史上最全的GIS开源项目源码合集,因项目需要精心收集...共11个开源GIS项目:GDAL、NASA开源GIS软件、World Wind、CoordSystemTransform、sharpmap、sharpkml、shapelib、netDxf、ofoSpider、oxyplot、MatrixLibrary。

Global site tag (gtag.js) - Google Analytics