基于.NET2.0的GIS开源项目SharpMap分析手记_第1页
基于.NET2.0的GIS开源项目SharpMap分析手记_第2页
基于.NET2.0的GIS开源项目SharpMap分析手记_第3页
基于.NET2.0的GIS开源项目SharpMap分析手记_第4页
基于.NET2.0的GIS开源项目SharpMap分析手记_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于.NET 2.0的GIS开源项目SharpMap分析手记(一)SharpMap介绍: SharpMap是一个“小巧可爱”的基于.net 2.0使用C#开发的Map渲染类库,可以渲染各类GIS数据(目前支持ESRI Shape和PostGIS格式),可应用于桌面和Web程序。 其网址为: HYPERLINK http:/sharpmap.iter.dk/ http:/sharpmap.iter.dk/ 和 HYPERLINK /SharpMap /SharpMapSharpMap的发布许可(License)为GNU General Public License,开发者为Morten Niel

2、sen( HYPERLINK http:/www.iter.dk/ http:/www.iter.dk/)。目前的稳定版本为0.8(9.0beta已发布),代码行数近10000行,实现了以下功能:支持的数据格式:PostGreSQL/PostGIS,ESRI Shapefile支持WMS layers支持ECW 和JPEG2000 栅格数据格式Windows Forms 控件,可以移动和缩放通过HttpHandler支持ASP.net程序点、线、多边形、多点、多线和多多边形等几何类型和几何集合(GeometryCollections)等OpenGIS Simple Features Speci

3、fication可通过Data Providers(增加数据类型支持)、Layer Types(增加层类型)和Geometry Types等扩展图形使用GDI+渲染,支持anti-aliased等专题图上面这段话是根据 HYPERLINK /archive/2006/02/24/337181.html 马兄的BLOG整理的,如果不希望我引用请马兄告知我删除。下面就是实用的STEP BY STEP。(1)下载VS .NET 2005由于SharpMap基于.NET 2.0,为了分析SharpMap,首先要作的就是下载一个VS .NET 2005,这个比较大,估计有1.6G,所以建议找个速度快点的

4、网站或者(2)安装VS .NET 2005还算比较好装,我装的时候没碰到什么问题,一次成功;(3)设置IIS ASP.NET为2.0这点必须注意,因为默认的IIS ASP.NET为1.1(我安装操作系统的是Windows Server 2003);做法是打开IIS信息服务管理器,在“默认网站”上单击右键选择“属性”,弹出如下对话框,在ASP.NET页设置ASP.NET的版本为2.0.50727;(4)下载SharpMap到 HYPERLINK /SharpMap /SharpMap去下载一个SharpMap,我下载的是0.9版;(5)解压和试运行解压后可以看到一个demo文件夹,在VS 200

5、5中打开Simple.aspx,在VS 2005中单击右键,选择“在浏览器中查看基于.NET 2.0的GIS开源项目SharpMap分析手记(二):源代码解压下载的0.9版源代码,有两个文件夹:SharpMap和SharpMap.UI。其中SharpMap.UI是用户界面相关命名空间,如窗体Forms、Ajax等。SharpMap工程是主体,包括数据转换、坐标、数据、几何体、图层等命名空间,下面分别介绍:SharpMap命名空间,包括Map类,通过创建Map对象的实例来生成地图。Map对象由包含Layer对象组成Layers集合,通过GetMap方法来Render地图。Converts命名空间

6、,提供数据转换服务。CoordinateSystems命名空间,提供坐标系统及其投影和转换。Data命名空间,提供对各种数据支持,现在包括MSSQL和ShapeFile支持。Providers名称空间,包括了IProvider接口和Shape文件、PostGIS数据的读取实现。该名称空间为SharpMap提供数据读(写)支持,通过面向接口的设计,可以比较容易的增加各类数据格式。Geometries命名空间,包括了SharpMap要使用到的各种几何类及其接口类,例 如点、线、面等类。是SharpMap的基础之一,所有几何对象都继承自Geometry这个抽象类,其中定义了几何对象应该具备的公共操作

7、,例如大小、 ID、外接矩阵、几何运算等等。Layers命名空间,提供各种图层支持,包括注记层、矢量层等。Layer是一个抽象类,实现了ILayer接口,Layer目前有3个子类,分别是VectorLayer、LabelLayer和WmsLayer,分别代3种不同数据类型的图层。Rendering命名空间,目前包括矢量渲染器类和几个专题图渲染器类,该类可以将几何对象根据其Style设置渲染为一个System.Drawing.Graphics对象。Styles命名空间,该命名空间主要提供了图层的样式设置类,例如线样式、点样式、填充样式等。Utilities名称空间包括Algorithms类(目前

8、仅实现了一个方法);Providers类,是Provider的一个Helper,应用了反射机制;Surrogates主要用于系统的Pen和Brush的序列化;Transform提供了从图片坐标到地理坐标的互相变换,也即桌面GIS的二次开发中经常使用的屏幕坐标和地理坐标的转换,主要用于地图的渲染、交互操作等。Utilities.SpatialIndexing用于对象的空间索引。Web名称空间实现了HttpHandler和Caching类,用于网络环境。Web命名空间,包括对网络支持如HTTP等,Web.Wms提供对WMS的支持。SharpMap.UI工程包括:Forms名称空间,包含MapIma

9、ge控件,一个简单的User Control(用户控件),封装了Map类,用于Windows Form编程。Web.UI.Ajax提供对Ajax支持。基于.NET 2.0的GIS开源项目SharpMap分析手记(三):地图渲染分析1 运行过程 我们通过实例来讲述SharpMap的运行过程和渲染(绘制)机制。首先打开Simple.aspx,可知此页面有一组单选框(3个,分别是放大、缩小和漫游)和一个图像按钮,用于显示地图。它的代码在Simple.aspx.cs中。打开Simple.aspx.cs,在Page_Load函数中是页面初始化代码。可知地图生成分两步:1.1 初始化地图myMap = M

10、apHelper.InitializeMap(newSystem.Drawing.Size(int)imgMap.Width.Value,(int)imgMap.Height.Value);我们找到MapHelper.InitializeMap函数,发现地图的初始化分为以下几步:(1)创建地图,创建图层/Initialize a new map of size imagesizeSharpMap.Map map = new SharpMap.Map(size);/Set up the countries layerSharpMap.Layers.VectorLayer layCountries

11、 = new SharpMap.Layers.VectorLayer(Countries);/Set the datasource to a shapefile in the App_data folderlayCountries.DataSource = newSharpMap.Data.Providers.ShapeFile(HttpContext.Current.Server.MapPath(App_datacountries.shp), true);(2)基本的图层显示设置/Set fill-style to greenlayCountries.Style.Fill = new Sol

12、idBrush(Color.Green);/Set the polygons to have a black outlinelayCountries.Style.Outline = System.Drawing.Pens.Black;layCountries.Style.EnableOutline = true;layCountries.SRID = 4326;(3)加入图层到地图/Add the layers to the map object./The order we add them in are the order they are drawn, so we add the rive

13、rs last to put them on topmap.Layers.Add(layCountries);map.Layers.Add(layRivers);map.Layers.Add(layCities);map.Layers.Add(layLabel);map.Layers.Add(layCityLabel);(4)地图放缩、背景、中心等设置/limit the zoom to 360 degrees widthmap.MaximumZoom = 360;map.BackColor = Color.LightBlue;map.Zoom = 360;map.Center = new S

14、harpMap.Geometries.Point(0,0);1.2 绘制并生成地图我们回到Simple.aspx.cs的Page_Load函数,发现下一步调用GenerateMap();/This is the initial view of the map. Zoom to the extents of the map:/myMap.ZoomToExtents();/or center on 0,0 and zoom to full earth (360 degrees)/myMap.Center = new SharpMap.Geometries.Point(0,0);/myMap.Zoo

15、m = 360;/Create the mapGenerateMap();在同一文件中,GenerateMap()包含以下两步:(1)保存当前地图状态/Save the current mapcenter and zoom in the viewstateViewState.Add(mapCenter, myMap.Center);ViewState.Add(mapZoom, myMap.Zoom);(2)渲染地图/Render mapSystem.Drawing.Image img = myMap.GetMap();string imgID = SharpMap.Web.Caching.In

16、sertIntoCache(1, img);imgMap.ImageUrl = getmap.aspx?ID= + HttpUtility.UrlEncode(imgID);它的核心就是通过myMap.GetMap()创建了一个地图图片。我们来看看这个GetMap()函数。在Map.cs文件中找到GetMap()函数,它分为以下几步:创建图像,得到图像绘制环境参数System.Drawing.Image img = new System.Drawing.Bitmap(this.Size.Width, this.Size.Height);System.Drawing.Graphics g = S

17、ystem.Drawing.Graphics.FromImage(img);g.Transform = this.MapTransform;g.Clear(this.BackColor);g.PageUnit = System.Drawing.GraphicsUnit.Pixel;绘制图层int SRID = (Layers.Count 0 ? Layers0.SRID : -1); /Get the SRID of the first layerfor (int i = 0; i = this.Zoom & _Layers.MinVisible this.Zoom)_Layers.Rende

18、r(g, this);关键在于_Layers.Render(g, this),它是ILayer接口的一个函数,我们找VectorLayer的实现来看看,它分为两种,一种是专题地图,一种是非专题地图绘制。对于专题地图,它针对SharpMap.Data.FeatureDataTable的每一 个feature进行绘制,先绘制其外框,再绘制内部几何体。对于非专题地图,它针对 this.DataSource.GetGeometriesInView(envelope)得到的几何体进行绘制,也是先绘制其外框,再绘制内部几何体。最后的绘制工作都调用SharpMap.Rendering.VectorRende

19、rer类的函数完成。 SharpMap.Rendering.VectorRenderer类包含绘制注记、线串、多线串、多点、多多边形、点、多边形等。绘制好图层后将激发LayerRendered事件:if(LayerRendered!=null) LayerRendered(this, g); /Fire event绘制好地图后将激发Map类的MapRendered 事件:if (MapRendered != null) MapRendered(g); /Fire render event2SharpMap.Rendering.VectorRenderer的各个函数具体分析现在我们对渲染地图的全

20、过程已经有了个总体概念和初步理解,下面来具体看一下SharpMap.Rendering.VectorRenderer的各个函数:2.1 DrawLabel / / Renders a label to the map. / / Graphics reference / Label placement / Offset of label in screen coordinates / Font used for rendering/ Font forecolor / Background color / Color of halo / Text rotation in degrees / Tex

21、t to render / Map referencepublic static void DrawLabel(System.Drawing.Graphics g, System.Drawing.PointF LabelPoint, System.Drawing.PointF Offset, System.Drawing.Font font, System.Drawing.Color forecolor, System.Drawing.Brush backcolor, System.Drawing.Pen halo, float rotation, string text, SharpMap.

22、Map map)这里面要注意的是这是绘制使用的函数是DrawPath和FillPath,而且是作者从DrawString改进的,可能是为了绘制过程的统一,因为其它几何体的具体绘制也使用DrawPath。if (halo != null)g.DrawPath(halo, path);g.FillPath(new System.Drawing.SolidBrush(forecolor), path);/g.DrawString(text, font, new System.Drawing.SolidBrush(forecolor), LabelPoint.X, LabelPoint.Y);2.2

23、DrawLineString/ / Renders a LineString to the map./ / Graphics reference/ LineString to render/ Pen style used for rendering/ Map referencepublic static void DrawLineString(System.Drawing.Graphics g, Geometries.LineString line, System.Drawing.Pen pen, SharpMap.Map map)这个函数很简单,也是采用DrawPath进行具体绘制。2.3

24、DrawMultiLineString/ / Renders a MultiLineString to the map./ / Graphics reference/ MultiLineString to be rendered/ Pen style used for rendering/ Map referencepublic static void DrawMultiLineString(System.Drawing.Graphics g,Geometries.MultiLineString lines, System.Drawing.Pen pen,SharpMap.Map map)它通

25、过循环调用DrawLineString来进行绘制。2.4 DrawMultiPoint/ / Renders a to the map./ / Graphics reference/ MultiPoint to render/ Symbol to place over point/ The amount that the symbol should be scaled. A scale of 1 equals to no scaling/ Symbol offset af scale=1/ Symbol rotation in degrees/ Map referencepublic stat

26、ic void DrawMultiPoint(System.Drawing.Graphics g, Geometries.MultiPoint points, System.Drawing.Bitmap symbol, float symbolscale, System.Drawing.PointF offset, float rotation, SharpMap.Map map)它通过循环调用DrawPoint来进行绘制。2.5 DrawMultiPolygon/ / Renders a multipolygon byt rendering each polygon in the colle

27、ction by calling DrawPolygon./ / Graphics reference/ MultiPolygon to render/ Brush used for filling (null or transparent for no filling)/ Outline pen style (null if no outline)/ Specifies whether polygon clipping should be applied/ Map referencepublic static void DrawMultiPolygon(System.Drawing.Grap

28、hics g, Geometries.MultiPolygon pols, System.Drawing.Brush brush, System.Drawing.Pen pen, bool clip, SharpMap.Map map)它通过循环调用DrawPolygon来进行绘制。2.6 DrawPoint/ / Renders a point to the map./ / Graphics reference/ Point to render/ Symbol to place over point/ The amount that the symbol should be scaled.

29、A scale of 1 equals to no scaling/ Symbol offset af scale=1/ Symbol rotation in degrees/ Map referencepublic static void DrawPoint(System.Drawing.Graphics g, SharpMap.Geometries.Point point, System.Drawing.Bitmap symbol, float symbolscale, System.Drawing.PointF offset, float rotation, SharpMap.Map m

30、ap)其中,symbol参数为一个位图,代表点的符号,这说明SharpMap暂时只支持位图符号,不支持矢量符号绘制。最终绘制调用DrawImage。2.7 DrawPolygon/ / Renders a polygon to the map./ / Graphics reference/ Polygon to render/ Brush used for filling (null or transparent for no filling)/ Outline pen style (null if no outline)/ Specifies whether polygon clipping

31、 should be applied/ Map referencepublic static void DrawPolygon(System.Drawing.Graphics g, SharpMap.Geometries.Polygon pol, System.Drawing.Brush brush, System.Drawing.Pen pen, bool clip, SharpMap.Map map)它只支持用不同的画刷和画笔来绘制多边形,也是采用DrawPath进行具体绘制。基于.NET 的GIS开源项目SharpMap分析手记(四):地图数据访问机制分析前面初略分析了SharpMap的

32、渲染机制,下面再来分析下它的数据访问机制,SharpMap的数据访问机制有两个关键:Provider模式和空间索引。1 运行机制分析SharpMap中矢量图层类(SharpMap.Layers.VectorLayer) 和注记层(SharpMap.Layers.LabelLayer)的数据源属性(DataSource)其实就是一个IProvider接口 (SharpMap.Data.Providers.IProvider):/ / Gets or sets the datasource/ public SharpMap.Data.Providers.IProvider DataSource g

33、et return _DataSource; set _DataSource = value; 因此,SharpMap的所有数据操作都是在IProvider上进行。下面来看看数据的初始化。1.1 数据源的初始化我们再来看看MapHelper.cs文件中的InitializeMap函数,其中图层数据初始化如下:/Set the datasource to a shapefile in the App_data folderlayCountries.DataSource = newSharpMap.Data.Providers.ShapeFile(HttpContext.Current.Serve

34、r.MapPath(App_datacountries.shp), true);即生成一个ShapeFile类来初始化DataSource。初始化代码在ShapeFile.cs中,分为三步:(1)初始化DBF文件/Initialize DBFstring dbffile = _Filename.Substring(0, _Filename.LastIndexOf(.) + .dbf;if (File.Exists(dbffile)dbaseFile = new DbaseReader(dbffile);(2)解析shape文件头/Parse shape headerParseHeader();

35、(3)读取投影文件/Read projection fileParseProjection();1.2 数据源的打开数据源的打开使用DataSource的Open函数。/ / Opens the datasource/ public void Open()ShapeFile的Open函数分为两步:(1)初始化Shape文件主要是InitializeShape函数,其主要功能是装载空间索引:LoadSpatialIndex(FileBasedIndex); /Load spatial index以后将对空间索引进行介绍。(2)打开DBF文件if (dbaseFile != null)dbaseF

36、ile.Open();1.3 相交查询执行相交查询的是IProvider接口的ExecuteIntersectionQuery函数。/ / Returns all objects whose boundingbox intersects bbox./ / / / Please note that this method doesnt guarantee that the geometries returned actually intersect bbox, but only/ that their boundingbox intersects bbox./ / / / / public vo

37、id ExecuteIntersectionQuery(SharpMap.Geometries.BoundingBox bbox, SharpMap.Data.FeatureDataSet ds)它分为以下几步:(1)得到bbox范围框中的所有对象ID/Use the spatial index to get a list of features whose boundingbox intersects bboxList objectlist = GetObjectIDsInView(bbox);这个函数的实现如下:/Use the spatial index to get a list of

38、 features whose boundingbox intersects bboxreturn tree.Search(bbox);所以,它实际使用四叉树的搜索功能。以后将在空间索引中予以介绍。(2)根据ID得到属性信息并加入空间数据集SharpMap.Data.FeatureDataTable dt = dbaseFile.NewTable;for (int i = 0; i objectlist.Count; i+) SharpMap.Data.FeatureDataRow fdr = dbaseFile.GetFeature(objectlist, dt); fdr.Geometry

39、 = ReadGeometry(objectlist); if (fdr.Geometry != null) if (fdr.Geometry.GetBoundingBox().Intersects(bbox) if (FilterDelegate = null | FilterDelegate(fdr) dt.AddRow(fdr);ds.Tables.Add(dt);2 IProvider接口的其它函数(1)关闭函数/ / Closes the datasource/ void Close();(2)得到范围框/ / of dataset/ / boundingboxSharpMap.Ge

40、ometries.BoundingBox GetExtents();3 总结从以上分析可知,SharpMap通过IProvider接口对数据源进行抽象,只要能实现IProvider接口的数据源就可以支持。IProvider接口的相交查询通过空间索引实现,空间索引及四叉树将在以后专门介绍。基于.NET 的GIS开源项目SharpMap分析手记(五):WebGIS原理分析WebGIS原理分析及思考分析了SharpMap这么久,才想起我原来对WebGIS只有一个 简单的概念,还没有把它背后的原理完全弄明白。那么,赶紧学吧!于是就准备找找这方面的技术文章和书籍,来一个恶补,这篇文章也作为我恶补的总结,

41、如果有什么不对的地方,请大家多多赐教!1 WebGIS原理如同GIS是计算机技术在测绘行业的应用一样,WebGIS也可以看作Web技术在GIS上的应用,因此,WebGIS的基本原理与Web是一样的,如图1所示。图1 Web原理在这个工作模式的基础上,现阶段的WebGIS实现主要有两种方式:1.1 胖客户端实现胖客户端实现是在浏览器端下载和安装控件,通过控件来实现与服务器端的交互,地图的显示及其它分析等。这种方式在早期使用较多。1.2 瘦客户端实现瘦客户端不需要下载和安装特殊的控件,它通过图片来显示地图,所有的地图生成与分析功能都放在服务器端实现。这类实现以GOOGLE MAP为代表。这种方式现

42、在使用越来越多,SharpMap也是以这种方式实现。1.3 分布式应用程序随着webservice和.net remoting等技术的兴起,分布式应用程序的开发技术越来越成熟,通过应用.net remoting和webservice等中间件技术,每个应用程序既可以是客户端,又可以是服务器。相应的,在软件架构领域,现有应用程序也从单机版、 C/S模式、B/S模式发展到多层结构,软件界还提出了SOA(面向服务的架构)等概念。可以预见,以后软件领域将是分布式应用程序的天下。在GIS软件领域,分布式GIS应用程序也可归于WebGIS一类。由于国内的GIS开发还停留在控件式二次开发以及网页开发阶段,所以

43、此类还在发展之中,实际应用较少。2 我的思考我觉得,WebGIS网站的提高主要有两个方面:架构的优化和增强用户参与度。2.1 架构的优化架构的优化不仅可以提高服务器的效率,还可以增加web service和.net remoting服务。我近段时间做了个基于超图和MAPX的.net remoting分布式应用程序试验,深深体会到分层和架构优化的优点,这个试验还不完善,我将在以后的BLOG中详细介绍。值得一提的是,我想基于超图和MAPX做一个web service服务,却老有问题,希望有高手能解答我的疑惑,先谢了。2.2 增强用户参与度现有的WebGIS网站同质现象严重。都是提供一个电子地图和公

44、交查询什么的。怎样增强用户参与度和赢利模式创新是我们要思考的问题。.Net 2.0的GIS开源项目SharpMap分析手记(六):SharpMap的功能一个开源项目的发展方向关系到此项目应用的发展与壮大,所以十分重要。好的开源项目正因为开发者准确地把握了项目功能扩充方向,从而把有限的精力用在了使用者最需要的功能上,从而取得了成功。现在来预测SharpMap是否会取得成功为时过早,但我们可以分析一下它的功能发展之路(RoadMap),从而对它是否成功进行简单的讨论。从前文基于.NET 2.0的GIS开源项目SharpMap分析手记(一):第一次亲密接触,我们知道了SharpMap的现有功能,在S

45、harpMap项目主页上,我们可以得到更详细的介绍:1 一句话介绍SharpMap is an easy-to-use mapping library for use in web and desktop applications. It provides access to many types of GIS data, enables spatial querying of that data, and renders beautiful maps.(SharpMap是一个用于web和桌面应用程序的易用的地图库。它可以访问多种格式的GIS数据,提供对这些数据的空间搜索,同时还可以绘制漂亮的

46、地图。)2 支持的数据格式矢量:ESRI Shape files formatPostGreSQL/PostGISOLEDB (points only)Microsoft SQL ServerOracle*GPX*MapInfo File*TIGER*S57*DGN*CSV*GML*Interlis 1*Interlis 2*SQLite and ODBC*栅格:Arc/Info ASCII Grid*Arc/Info Binary Grid (.adf)*AIRSAR Polarimetric*Microsoft Windows Device Independent Bitmap (.bmp

47、)*BSB Nautical Chart Format (.kap)*VTP Binary Terrain Format (.bt)*CEOS (Spot for instance)*First Generation USGS DOQ (.doq)*DODS / OPeNDAP*New Labelled USGS DOQ (.doq)*Military Elevation Data (.dt0, .dt1)*ERMapper Compressed Wavelets (.ecw)*ESRI .hdr Labelled*ENVI .hdr Labelled Raster*Envisat Image

48、 Product (.n1)*EOSAT FAST Format*FITS (.fits)*Graphics Interchange Format (.gif)*GMT Compatible netCDF*GRASS Rasters*TIFF / GeoTIFF (.tif)*Hierarchical Data Format Release 4 (HDF4)*Hierarchical Data Format Release 5 (HDF5)*Erdas Imagine (.img)*Vexcel MFF2*Idrisi Raster*Image Display and Analysis (Wi

49、nDisp)*ILWIS Raster Map (.mpr,.mpl)*Japanese DEM (.mem)*JPEG JFIF (.jpg)*JPEG2000 (.jp2, .j2k)*JPEG2000 (.jp2, .j2k)*JPEG2000 (.jp2, .j2k)*JPEG2000 (.jp2, .j2k)*NOAA Polar Orbiter Level 1b Data Set (AVHRR)*Erdas 7.x .LAN and .GIS*Daylon Leveller Heightfield*In Memory Raster*Vexcel MFF*Multi-resoluti

50、on Seamless Image Database*Meteosat Second Generation*NDF*NITF*NetCDF*OGDI Bridge*PCI .aux Labelled*PCI Geomatics Database File*Portable Network Graphics (.png)*PCRaster (.map)*Netpbm (.ppm,.pgm)*Swedish Grid RIK (.rik)*RadarSat2 XML (product.xml)*USGS SDTS DEM (CATD.DDF)*Raster Matrix Format (.rsw,

51、 .mtw)*SAR CEOS*SGI Image Format*USGS ASCII DEM (.dem)*X11 Pixmap (.xpm)*WMS:Version 1.0.0Version 1.1.1Version 1.3.0其中:带*号是通过第三方扩展实现3 功能扩展之路FeatureDescriptionPlanned ReleaseSpatial relationships among geometryGeometry has certain relationships with other geometry: they intersect, border, are contain

52、ed, etc. This logic is called topology and most GIS packages provide for some level of it. SharpMap will implement the Dimensionally Extended Nine-Intersection Model (DE-9IM) which is described in section 6.1.14 - Relational Operators of OpenGIS Simple Features Specification for GIS - Simple Feature

53、 Access - Common Architecture /files/index.php?artifact_id=13227 HYPERLINK /SharpMap/Release/ProjectReleases.aspx?ReleaseId=465 1.0Updatable ProvidersAllow features to be updated, added or deleted from SharpMap providers HYPERLINK /SharpMap/Release/ProjectReleases.aspx?ReleaseId=463 2.0Rendering Int

54、erface / Rendering EnginesProvide an interface for the rendering of layers and maps so other formats besides GDI+ images can be produced. Will include GDI+ and WPF in v2.0, with other providers, such as SVG, GML, etc being able to be independently written. See SharpMap v2 Architecture for more infor

55、mation. HYPERLINK /SharpMap/Release/ProjectReleases.aspx?ReleaseId=463 2.0可见,当前1.0版的主要功能是实现了多种空间数据类型的访问和简单的空间查询及显示。而2.0主要实现两大功能:空间数据的增、删、改和绘制接口。就我看来,表现层应该作为SharpMap发展的重点,毕竟现在GIS软件在这方面还比较欠缺。基于.NET 2.0的GIS开源项目SharpMap分析手记(七):GDAL C#接口库的编译与SharpMap(Change Set 21021)对影像的支持研究粟卫民 HYPERLINK / / HYPERLINK /

56、suen/ /suen/ 日期:2007-5-22保留所有版权。如需转载,请在醒目位置注明出处在4月11日发布的SharpMap(Change Set 21021)源代码中,增加了对GEOTIFF等影像的支持,它是利用 HYPERLINK / GDAL开源库来实现这一支持的。由于是Change Set版本,此源代码的编译和使用存在不少问题,应广大开源爱好者的要求,同时在他们的无私帮助下,我最终完成了一个同时支持矢量数据和影像的可编译运行的版本,当然还是存在不少问题,希望大家给我提出来。1 GDAL C#接口库的编译GDAL是一个操作各种栅格地理数据格式的库。包括读取、写入、转换、处理各种栅格数

57、据格式(有些特定的格式对写入等不支持)。它跨平台,开源,功能强大,连大名鼎鼎的GOOGLE EARTH都使用它。在青岛糨糊特别是青岛村里的月光的帮助下,我成功地编译好了GDAL C#接口库(还有小小问题,不影响使用),下面是编译步骤:(1)下载GDAL1.4.1,下面是下载地址: HYPERLINK /gdal/gdal-1.4.1.tar.gz /gdal/gdal-1.4.1.tar.gz(2)直接在.Net2005命令行下运行nmake E:downloadgdal141gdal-1.4.1makefile.vc文件换成你自己的路径就可以了;(3)在.Net下使用这个库还要编译swigc

58、sharp下makefile.vc,然后这个目录下会生成8个dll;(4)编译完成swigcsharp后生成的dll名字需要改一下,如gdal_gdal_wrap.dll改成gdal_wrap.dll,因为程序中用到ImportDll时名字没有最前面的gdal_编译的时候可能默认配置文件问题都多加了这几个字母;(5)编译完成swigcsharp后dll是可以直接用的,随便拷贝到别的机器上都可以用,只需要机器安装.Net2005运行时。2 SharpMap读取及显示影像过程分析SharpMap(Change Set 21021)中新增了一个DemoWinForm工程,此工程可以读取和显示矢量图层

59、,我对其进行了扩展,使它能够读取和显示栅格图层。下面详细分析下读取和显示栅格图层的过程。2.1 点击工具条“AddLayer”按钮它的消息响应函数是:BeginInvoke(MethodInvoker)delegate() loadLayer(); );这是对loadLayer()函数的异步调用,如果对BeginInvoke有疑问请参见 HYPERLINK /document/viewdoc/?id=1126 利用辅助线程更新用户界面UI。2.2 loadLayer()函数此函数采用工厂方法模式(Factory Method)来创建图层,如果对工厂方法模式不太熟悉的可参见“ HYPERLINK

60、 /archive/2006/01/04/310716.html .NET设计模式(5):工厂方法模式(Factory Method)”。DemoWinForm工程中采用Dictionary _layerFactoryCatalog来储存GIS数据文件扩展名及其相应的ILayerFactory,并利用TryGetValue方法来得到某扩展名相应的ILayerFactory。最后调用ILayerFactory的Create方法创建相应图层并使用addLayer函数来增加图层到地图。2.3 GdalRasterLayerFactory类Create函数如下: GdalRasterLayer gda

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论