1基于MapWinGis开发探索(一)地理信息系统(GIS)是储存和处理与地理空间分布有关信息的集合。在各行各业得到越来越广泛的应用,GIS以其混合数据结构和独特的地理空间分析功能独树一帜。用过几种商业化的GIS平台,SuperMap、ArcGis都很不错,可毕竟是商业的,而且之前开发一个系统是基于SuperMap二次开发的。SuperMap自身存在着一些问题。找了几种开源地图引擎,MapWinGis其效率是相当不错的,研究了一段时间也比较喜欢。下面先介绍下:MapWinGis是一个相当高效的地图引擎,放大、缩小、漫游速度很快,被誉为开源中的ArcGis。开发语言是VC,基于微软的COM思想编写。系统来说,MapWinGis是一套类似于AO的二次开发组件库(只是没有AO那么强大),其核心库是一个名字为MapWinGis的ActiveX控件,开发人员可以利用这个ActiveX组件在自己的系统中添加GIS的相关功能,例如:地图显示;在图层上标绘点、线、图形;计算长度,存取GIS数据等相关工作。ESRI在AO的基础之上开发了ArcGIS的桌面产品,类似的,他们也在MapWinGis这套组件库的基础上,二次开发了MapWindowGIS,这是一套桌面GIS系统,相当于一个简化版的ArcMap,桌面GIS系统的开发语言使用的是VB.NET。用户可以直接通过它浏览数据,并通过一系列插件来完成其他功能。还有一套MapWinX,是DOTNET平台下的一个辅助工具。二次开发环境支持VB、C#、VB.NET等。MapWinGis的主要功能包括:1、直接打开,编辑,保存Image,Grid,Shapfile,TIN,DBF格式的文件。2、在地图中对图形进行浏览,标注,支持矢量数据的符号化,栅格数据的透明显示。3、在地图中对矢量数据进行空间数据查询。4、动态的在图层上标绘空间数据。5、存取地图中的相关数据。自我感觉MapWinGis存在的缺点也是相当大的:21.首先只支持点、线、面、至于矢量图片等貌似不支持,需自行扩展。2.MapWinGis渲染的效果始终感觉没有被的GIS引擎好。3.空间数据库只能由PostGreSQL支持。4.最大的一个缺点感觉就是必须本地必须存在几个文件(.shp.dbf.shx.mwsr)。当有多个客户端时,必须通过服务器下载更新,无法直接操作PostGreSQL数据库,这个相对于SuperMap实在弱了一点。5.数据量大的问题。速度比较慢,这是每个GIS引擎必然遇到的。6.当前的官方版本不支持中文路径的读取,不过这个通过改源代码已经解决。MapWinGis.ocx。通过注册这个主键即可。当然MapWinGis优点也是很多的,对.Net的二次开始相当支持。速度、效率总体不错。当前开发的系统就是基于MapWinGis的网络资源管理系统,效果相当不错。3一直想深入研究,希望能向其他GIS爱好者学习学习。未完待续……基于MapWinGis的开发探索(二)——注册、加载、基本操作此次主要是控件的注册,以及用C#开发的图层加载和一些基本操作。一、注册MapWinGis.ocx主键(1)如果直接安装MapWinGis的安装文件,则无需在注册。(2)如果没直接安装,则要注册MapWinGis.ocx主键。可自行下载(官网)。注册命令行:cmd--》regsvr32C:\Program4Files\MapWindow\MapWinGIS.ocx后面为存放的绝对路径。如果有新版本的MapWinGis.ocx。需要反注册regsvr32-uC:\ProgramFiles\MapWindow\MapWinGIS.ocx,然后在注册新版的MapwinGis.ocx。二、在VS2005内,c#开发。工具箱的选择项添加MapWinGISActiveX。工具箱就会出现MapControl控件,即可添加axMap地图控件。跟平常添加新控件操作一样,主要是为了得到地图控件。三、往地图控件加载图层。usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;namespaceWin{publicpartialclassForm1:Form,MapWinGIS.ICallback{publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){MapWinGIS.Shapefileshpfile=newMapWinGIS.Shapefile();OpenFileDialogopenFileDialog=newOpenFileDialog();openFileDialog.InitialDirectory=E:\\;//注意这里写路径时要用c:\\而不是c:\openFileDialog.Filter=shp文件(*.shp)|*.shp;openFileDialog.RestoreDirectory=true;openFileDialog.FilterIndex=1;if(openFileDialog.ShowDialog()==DialogResult.OK){shpfile.Open(openFileDialog.FileName,this);}5this.axMap1.AddLayer(shpfile,true);}#regionICallbackMembersvoidMapWinGIS.ICallback.Error(stringKeyOfSender,stringErrorMsg){MessageBox.Show(ErrorMsg,Error);}voidMapWinGIS.ICallback.Progress(stringKeyOfSender,intPercent,stringMessage){Application.DoEvents();//Allowtheinterfacetorefresh}#endregion}}四、基本的地图操作放大:axMap1.CursorMode=MapWinGIS.tkCursorMode.cmZoomIn;缩小:axMap1.CursorMode=MapWinGIS.tkCursorMode.cmZoomOut;漫游:axMap1.CursorMode=MapWinGIS.tkCursorMode.cmPan;全幅:axMap1.ZoomToMaxExtents();全幅图:6放大图:7缩小图:8漫游图:9源代码下载:/Files/wakerobin/TestWinGis.rar10基于MapWinGis的开发探索(三)--改善缩放、渲染、显示文本继续对MapWinGis进行研究探索,紧接上一篇文章。MapWinGis自身有很多功能,此篇主要也是基于其内在方法来写的。除了第二点显示文本是根据其源代码进行扩展的。原图:一、改善缩放功能上一版本放大缩小都必须点击下工具栏的放大、缩小。是鼠标处于缩放状态,此时必须单击鼠标左右键才能缩放。现在采用滚轮滚动时候就能缩放,操作比较方便。其实只需加载一个鼠标滚轮事件,在其设置即可。privatevoidAddLayer(){11this.MouseWheel+=newMouseEventHandler(Map_MouseWheel);}privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse){//滚轮缩放事件释放this.MouseWheel-=newMouseEventHandler(Map_MouseWheel);}privatevoidMap_MouseWheel(objectsender,MouseEventArgse){boolresult=axMap1.Focus();if(result){axMap1.ZoomIn(0.0005*e.Delta);}axMap1.set_ShapePointType(layerHandle2,0,MapWinGIS.tkPointType.ptImageList);}滚轮缩放图:12二、渲染各种图层现在就针对加载的两个图层进行渲染,一个点图层(各省市),一个面图层(中国)。填充颜色、设置边框、点大小即可。橙色图层整个中国,蓝色为边框,红色为各省市。//渲染privatevoidbtnRender_Click(objectsender,EventArgse){axMap1.set_ShapeLayerDrawFill(layerHandle1,true);fillcolor=(uint)ColorTranslator.ToOle(Color.Orange);linecolor=(uint)ColorTranslator.ToOle(Color.Blue);linewidth=2.0F;//图层一(面)填充颜色、边框线颜色、线宽axMap1.set_ShapeLayerFillColor(layerHandle1,fillcolor);axMap1.set_ShapeLayerLineColor(layerHandle1,linecolor);axMap1.set_ShapeLayerLineWidth(layerHandle1,linewidth);13//图层二(点)点的颜色、大小axMap1.set_ShapeLayerPointColor(layerHandle2,pointcolor);axMap1.set_ShapeLayerPointSize(layerHandle2,pointsize);}渲染后的图:三、显示文本MapWinGis的一大缺点就是只支持点、线、面图层,无法自行设置添加文本图层这个SuperMap比较起来还是存在着很大的缺陷,这时地图上的信息就没法丰富了。可以自行往它所在的dbf文件内添加列。讲信息存放在这里,然后就可读取设置每个图层所要显示的Lable。这样就可以一定程度上解决文本的显示功能、丰富地图信息。该文本也支持放大缩小。//设置文本(具体下次再说里面的代码,根据MapWinGisVB源代码扩展的)privatevoidbtnShowLable_Click(objectsender,EventArgse){ShowLable.GetLable(shpFile2,layerHandle2,axMap1);14}显示文本图:四、为点图层设置图片点图层的每个Shape元素,默认的都是一个圆圈,大小可自行设置。此时可以通过设置点的类型丰富地图。该图片可自行添加,支持多种格式的图片,缺点在于改图片不支持放大缩小。后期将会针对这一缺点进行改进。使其支持矢量式的放大、缩小。privatevoidbtnSetImage_Click(objectsender,EventArgse){//设置点类型MapWinGIS.Imageimage=newMapWinGIS.Image();stringfileName=Application.StartupPath+@\MapIcon\City2.png;image.Open(fileName,MapWinGIS.ImageType.PNG_FILE,false,null);image.TransparencyColor=(uint)ColorTranslator.ToOle(Color.White);image.UseTransparencyColor=true;axMap1.set_Shape