基于NET 20的GIS开源项目SharpMap分析手记.docx
- 文档编号:10156420
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:42
- 大小:44.93KB
基于NET 20的GIS开源项目SharpMap分析手记.docx
《基于NET 20的GIS开源项目SharpMap分析手记.docx》由会员分享,可在线阅读,更多相关《基于NET 20的GIS开源项目SharpMap分析手记.docx(42页珍藏版)》请在冰豆网上搜索。
基于NET20的GIS开源项目SharpMap分析手记
基于.NET2.0的GIS开源项目SharpMap分析手记
基于.NET2.0的GIS开源项目SharpMap分析手记
(一)
SharpMap介绍:
SharpMap是一个“小巧可爱”的基于.net2.0使用C#开发的Map渲染类库,可以渲染各类GIS数据(目前支持ESRIShape和PostGIS格式),可应用于桌面和Web程序。
其网址为:
http:
//sharpmap.iter.dk/和
SharpMap的发布许可(License)为GNUGeneralPublicLicense,开发者为MortenNielsen(http:
//www.iter.dk/)。
目前的稳定版本为0.8(9.0beta已发布),代码行数近10000行,实现了以下功能:
①支持的数据格式:
PostGreSQL/PostGIS,ESRIShapefile
支持WMSlayers
支持ECW和JPEG2000栅格数据格式
②WindowsForms控件,可以移动和缩放
③通过HttpHandler支持ASP.net程序
④点、线、多边形、多点、多线和多多边形等几何类型和几何集合(GeometryCollections)等OpenGISSimpleFeaturesSpecification
⑤可通过DataProviders(增加数据类型支持)、LayerTypes(增加层类型)和GeometryTypes等扩展
⑥图形使用GDI+渲染,支持anti-aliased等
⑦专题图
上面这段话是根据马兄的BLOG整理的,如果不希望我引用请马兄告知我删除。
下面就是实用的STEPBYSTEP。
(1)下载VS.NET2005
由于SharpMap基于.NET2.0,为了分析SharpMap,首先要作的就是下载一个VS.NET2005,这个比较大,估计有1.6G,所以建议找个速度快点的网站或者…
(2)安装VS.NET2005
还算比较好装,我装的时候没碰到什么问题,一次成功;
(3)设置IISASP.NET为2.0
这点必须注意,因为默认的IISASP.NET为1.1(我安装操作系统的是WindowsServer2003);
做法是打开IIS信息服务管理器,在“默认网站”上单击右键选择“属性”,弹出如下对话框,在ASP.NET页设置ASP.NET的版本为2.0.50727;
(4)下载SharpMap
到
(5)解压和试运行
解压后可以看到一个demo文件夹,在VS2005中打开Simple.aspx,在VS2005中单击右键,选择“在浏览器中查看
基于.NET2.0的GIS开源项目SharpMap分析手记
(二):
源代码
解压下载的0.9版源代码,有两个文件夹:
SharpMap和SharpMap.UI。
其中SharpMap.UI是用户界面相关命名空间,如窗体Forms、Ajax等。
SharpMap工程是主体,包括数据转换、坐标、数据、几何体、图层等命名空间,下面分别介绍:
SharpMap命名空间,包括Map类,通过创建Map对象的实例来生成地图。
Map对象由包含Layer对象组成Layers集合,通过GetMap方法来Render地图。
Converts命名空间,提供数据转换服务。
CoordinateSystems命名空间,提供坐标系统及其投影和转换。
Data命名空间,提供对各种数据支持,现在包括MSSQL和ShapeFile支持。
Providers名称空间,包括了IProvider接口和Shape文件、PostGIS数据的读取实现。
该名称空间为SharpMap提供数据读(写)支持,通过面向接口的设计,可以比较容易的增加各类数据格式。
Geometries命名空间,包括了SharpMap要使用到的各种几何类及其接口类,例如点、线、面等类。
是SharpMap的基础之一,所有几何对象都继承自Geometry这个抽象类,其中定义了几何对象应该具备的公共操作,例如大小、ID、外接矩阵、几何运算等等。
Layers命名空间,提供各种图层支持,包括注记层、矢量层等。
Layer是一个抽象类,实现了ILayer接口,Layer目前有3个子类,分别是VectorLayer、LabelLayer和WmsLayer,分别代3种不同数据类型的图层。
Rendering命名空间,目前包括矢量渲染器类和几个专题图渲染器类,该类可以将几何对象根据其Style设置渲染为一个System.Drawing.Graphics对象。
Styles命名空间,该命名空间主要提供了图层的样式设置类,例如线样式、点样式、填充样式等。
Utilities名称空间包括Algorithms类(目前仅实现了一个方法);Providers类,是Provider的一个Helper,应用了反射机制;Surrogates主要用于系统的Pen和Brush的序列化;Transform提供了从图片坐标到地理坐标的互相变换,也即桌面GIS的二次开发中经常使用的屏幕坐标和地理坐标的转换,主要用于地图的渲染、交互操作等。
Utilities.SpatialIndexing用于对象的空间索引。
Web名称空间实现了HttpHandler和Caching类,用于网络环境。
Web命名空间,包括对网络支持如HTTP等,Web.Wms提供对WMS的支持。
SharpMap.UI工程包括:
Forms名称空间,包含MapImage控件,一个简单的UserControl(用户控件),封装了Map类,用于WindowsForm编程。
Web.UI.Ajax提供对Ajax支持。
基于.NET2.0的GIS开源项目SharpMap分析手记(三):
地图渲染分析
1运行过程
我们通过实例来讲述SharpMap的运行过程和渲染(绘制)机制。
首先打开Simple.aspx,可知此页面有一组单选框(3个,分别是放大、缩小和漫游)和一个图像按钮,用于显示地图。
它的代码在Simple.aspx.cs中。
打开Simple.aspx.cs,在Page_Load函数中是页面初始化代码。
可知地图生成分两步:
1.1初始化地图
myMap=MapHelper.InitializeMap(new
System.Drawing.Size((int)imgMap.Width.Value,(int)imgMap.Height.Value));
我们找到MapHelper.InitializeMap函数,发现地图的初始化分为以下几步:
(1)创建地图,创建图层
//Initializeanewmapofsize'imagesize'
SharpMap.Mapmap=newSharpMap.Map(size);
//Setupthecountrieslayer
SharpMap.Layers.VectorLayerlayCountries=new
SharpMap.Layers.VectorLayer("Countries");
//SetthedatasourcetoashapefileintheApp_datafolder
layCountries.DataSource=new
SharpMap.Data.Providers.ShapeFile(HttpContext.Current.Server.MapPath(@"~\App_data\countries.shp"),true);
(2)基本的图层显示设置
//Setfill-styletogreen
layCountries.Style.Fill=newSolidBrush(Color.Green);
//Setthepolygonstohaveablackoutline
layCountries.Style.Outline=System.Drawing.Pens.Black;
layCountries.Style.EnableOutline=true;
layCountries.SRID=4326;
(3)加入图层到地图
//Addthelayerstothemapobject.
//Theorderweaddtheminaretheordertheyaredrawn,soweaddtheriverslasttoputthemontop
map.Layers.Add(layCountries);
map.Layers.Add(layRivers);
map.Layers.Add(layCities);
map.Layers.Add(layLabel);
map.Layers.Add(layCityLabel);
(4)地图放缩、背景、中心等设置
//limitthezoomto360degreeswidth
map.MaximumZoom=360;
map.BackColor=Color.LightBlue;
map.Zoom=360;
map.Center=newSharpMap.Geometries.Point(0,0);
1.2绘制并生成地图
我们回到Simple.aspx.cs的Page_Load函数,发现下一步调用GenerateMap();
//Thisistheinitialviewofthemap.Zoomtotheextentsofthemap:
//myMap.ZoomToExtents();
//orcenteron0,0andzoomtofullearth(360degrees)
//myMap.Center=newSharpMap.Geometries.Point(0,0);
//myMap.Zoom=360;
//Createthemap
GenerateMap();
在同一文件中,GenerateMap()包含以下两步:
(1)保存当前地图状态
//Savethecurrentmapcenterandzoomintheviewstate
ViewState.Add("mapCenter",myMap.Center);
ViewState.Add("mapZoom",myMap.Zoom);
(2)渲染地图
//Rendermap
System.Drawing.Imageimg=myMap.GetMap();
stringimgID=SharpMap.Web.Caching.InsertIntoCache(1,img);
imgMap.ImageUrl="getmap.aspx?
ID="+HttpUtility.UrlEncode(imgID);
它的核心就是通过myMap.GetMap()创建了一个地图图片。
我们来看看这个GetMap()函数。
在Map.cs文件中找到GetMap()函数,它分为以下几步:
①创建图像,得到图像绘制环境参数
System.Drawing.Imageimg=newSystem.Drawing.Bitmap(this.Size.Width,this.Size.Height);
System.Drawing.Graphicsg=System.Drawing.Graphics.FromImage(img);
g.Transform=this.MapTransform;
g.Clear(this.BackColor);
g.PageUnit=System.Drawing.GraphicsUnit.Pixel;
②绘制图层
intSRID=(Layers.Count>0?
Layers[0].SRID:
-1);//GettheSRIDofthefirstlayer
for(inti=0;i<_Layers.Count;i++)
{
if(_Layers.Enabled&&_Layers.MaxVisible>=this.Zoom&&_Layers.MinVisible _Layers.Render(g,this); } 关键在于_Layers.Render(g,this),它是ILayer接口的一个函数,我们找VectorLayer的实现来看看,它分为两种,一种是专题地图,一种是非专题地图绘制。 对于专题地图,它针对SharpMap.Data.FeatureDataTable的每一个feature进行绘制,先绘制其外框,再绘制内部几何体。 对于非专题地图,它针对this.DataSource.GetGeometriesInView(envelope)得到的几何体进行绘制,也是先绘制其外框,再绘制内部几何体。 最后的绘制工作都调用SharpMap.Rendering.VectorRenderer类的函数完成。 SharpMap.Rendering.VectorRenderer类包含绘制注记、线串、多线串、多点、多多边形、点、多边形等。 绘制好图层后将激发LayerRendered事件: if(LayerRendered! =null)LayerRendered(this,g);//Fireevent 绘制好地图后将激发Map类的MapRendered事件: if(MapRendered! =null)MapRendered(g);//Firerenderevent 2SharpMap.Rendering.VectorRenderer的各个函数具体分析现在我们对渲染地图的全过程已经有了个总体概念和初步理解,下面来具体看一下SharpMap.Rendering.VectorRenderer的各个函数: 2.1DrawLabel /// ///Rendersalabeltothemap. /// /// /// /// /// /// /// /// /// /// publicstaticvoidDrawLabel(System.Drawing.Graphicsg,System.Drawing.PointFLabelPoint,System.Drawing.PointFOffset,System.Drawing.Fontfont,System.Drawing.Colorforecolor,System.Drawing.Brushbackcolor,System.Drawing.Penhalo,floatrotation,stringtext,SharpMap.Mapmap) 这里面要注意的是这是绘制使用的函数是DrawPath和FillPath,而且是作者从DrawString改进的,可能是为了绘制过程的统一,因为其它几何体的具体绘制也使用DrawPath。 if(halo! =null) g.DrawPath(halo,path); g.FillPath(newSystem.Drawing.SolidBrush(forecolor),path); //g.DrawString(text,font,newSystem.Drawing.SolidBrush(forecolor),LabelPoint.X,LabelPoint.Y); 2.2DrawLineString /// ///RendersaLineStringtothemap. /// /// /// /// /// publicstaticvoidDrawLineString(System.Drawing.Graphicsg,Geometries.LineStringline,System.Drawing.Penpen,SharpMap.Mapmap) 这个函数很简单,也是采用DrawPath进行具体绘制。 2.3DrawMultiLineString /// ///RendersaMultiLineStringtothemap. /// /// /// /// /// publicstaticvoidDrawMultiLineString(System.Drawing.Graphicsg,Geometries.MultiLineStringlines,System.Drawing.Penpen,SharpMap.Mapmap) 它通过循环调用DrawLineString来进行绘制。 2.4DrawMultiPoint /// ///Rendersa /// /// /// /// /// /// /// /// publicstaticvoidDrawMultiPoint(System.Drawing.Graphicsg,Geometries.MultiPointpoints,System.Drawing.Bitmapsymbol,floatsymbolscale,System.Drawing.PointFoffset,floatrotation,SharpMap.Mapmap) 它通过循环调用DrawPoint来进行绘制。 2.5DrawMultiPolygon /// ///RendersamultipolygonbytrenderingeachpolygoninthecollectionbycallingDrawPolygon. /// /// /// /// /// /// /// publicstaticvoidDrawMultiPolygon(System.Drawing.Graphicsg,Geometries.MultiPolygonpols,System.Drawing.Brushbrush,System.Drawing.Penpen,boolclip,SharpMap.Mapmap) 它通过循环调用DrawPolygon来进行绘制。 2.6DrawPoint /// ///Rendersapointtothemap. /// /// ///
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于NET 20的GIS开源项目SharpMap分析手记 基于 NET 20 GIS 项目 SharpMap 分析 手记