GIS地图开发-亚洲ca88官方网站发布时间:2021-10-01 22:15:13 来源:亚洲ca88官方网站首要说一下地图是怎样出来的,或许你感觉是废话,但实际上很多人并不知道怎么下手。我觉得这儿需求先给你个思路预备:地图便是运用绘图句子画出来的! 从底层制作地图,能运用的便是绘图函数,在,便是用Graphics类的办法,在窗口中制作点、线、面、规范、栅格等,组合起来,便是一张地图(瓦片图办法在外)。 .NET供给了很多绘图办法,基本上都是以Graphics类的函数办法供给,包含各类几许形状、图画、文字的制作,灵活运用这些办法,就能够画出精巧的图出来。假定你已了解.NET的绘图,这样就只有有一个问题要处理:图我会画了,但拿到地图元素一般为地理坐标(经纬度),应该画在地图上什么方位?这就需求涉及到坐标转化问题。 再一个,有时,还需求依据屏幕上点方位反算出它的经纬度,如在需求显现鼠标指针处的经纬度,所以还需求这么一个函数: 为了完结坐标转化,需求运用几个地图参数的变量:地图缩放倍数、地图中心点经纬度、地图巨细,关于地图参数,可参阅这篇文章: 别的,还需求对地图进行缩放、平移,这些操作实质上也是对地图参数的操作,如扩大便是对地图缩放倍数操作,平移便是对地图中心点进行操作,咱们将这些操作也写Coordinator类的办法。投影变换也作为坐标转化的一部分,Coordinator类还增加了投影方面办法,这个后边再讲。 有了坐标转化类Coordinator,就能够用经纬度数据来绘图了,如拿到某省的行政鸿沟经纬度坐标数据,就能够将经纬度数据转化为屏幕坐标,然后用Graphics的办法来画出来了,Graphics目标又从哪里来呢?能够从一个Image目标创立,也能够从一个控件的Paint事情中获得,总归,有了坐标,发挥你的想象力,自己画吧。 在气候数据剖析中,除了要制作点、线、面、文字、栅分外,还需求制作一些特殊符号,如风、气候现象、云等。这些符号,能够用图片、气候字库、符号库来完结,图片办法完结简略,颜色丰厚,但缩放作用欠好;字库办法,需求装置字库,程序布置比较费事;符号库办法代码编写较费事。FreeMicaps的气候现象符号选用符号库办法,祥见: 依据OGC规范,GIS体系首要需求对地图元素进行笼统和封装,但FreeMicaps中,经一再考虑,抛弃了这种办法,一个是因为工作量比较大,另一个是因为我不敢确保能很好地进行封装,或许给插件开发带来费事,不如把绘图权彻底交给图层,我们自由发挥。 为了使绘图进程便于办理,可将绘图进程分为组,如能够将一张地图的制作分为:制作世界地图、制作中国地图、制作河流、填地名几个进程,每次绘图如同便是在一张玻璃上制作,叠加起来就构成了一张地图图,这儿把每次绘图进程形象地称为一个图层。地图分层后,图层能够增删,每个图层能够独自进行躲藏、设置特点等,更重要的是能够将运用面向目标技能把每个图层作为一个目标进行办理。详细介绍见: 对图层进行笼统,它应该有一个图层制作办法(Render),一个图层标题(LayerName),一个用于表明数据源的字符串(DataSource),一个用于表明绘图款式的设置的LayerStyle,加上一些辅佐办法特点,终究构成如下笼统图层类(CustomLayer),各种图层均从它承继: FreeMicaps中,每种数据对应一种图层类,为了使图层类编写便利,运用了规划形式中的模板办法,界说制作流程,主程序在调用图层的Render()办法时,会主动判别是否现已读入数据,依据需求读数据绘图。 关于一种类型数据,需求从CustomLayer承继新建一个图层类。各种类型数据图层的工作办法彻底相同,仅在数据读取和制作方面不同,所以,写新图层类时,仅需完结DoLoad()和DoRender()两个笼统办法,完结读取数据和制作图层代码即可。FreeMicaps里运用了字符串作为数据源标识,通用GIS体系对数据源进行了笼统,我也测验这么做,但代码过于杂乱,增加图层开发难度,终究增大插件开发难度,所以抛弃了。 前面说了,一张地图有多个图层,所以还需求将图层放入一个列表,制作地图时遍历图层,调用每个图层的Render()办法,画出一张完好的地图。关于图层列表,我们立刻会想到运用List类,但图层制作是需求有次序的,如在卫星云图上面叠加地名,需求先画卫星云图,再填地名,不然云图会把地名盖住,所以在图层的款式(LayerStyle)中放了一个ZOrder特点,经过它来操控图层次序。但由于List自身的排序办法是一种“非安定排序”,也便是说当两个图层的ZOrder持平时,它们的次序是不确定的,为了防止这个问题,FreeMicaps从CollectionBase承继了一个类LayerList,完结对图层的办理,并完结了IXmlSerializable接口,完结图层序列化功用。别的,还增加了增加图层、删去图层事情。LayerList类如下: FreeMicaps中,每种数据对应一种图层类,为了使图层类编写便利,运用了规划形式中的模板办法,界说制作流程,主程序在调用图层的Render()办法时,会主动判别是否现已读入数据,依据需求读数据绘图。 关于一种类型数据,需求从CustomLayer承继新建一个图层类。各种类型数据图层的工作办法彻底相同,仅在数据读取和制作方面不同,所以,写新图层类时,仅需完结DoLoad()和DoRender()两个笼统办法,完结读取数据和制作图层代码即可。FreeMicaps里运用了字符串作为数据源标识,通用GIS体系对数据源进行了笼统,我也测验这么做,但代码过于杂乱,增加图层开发难度,终究增大插件开发难度,所以抛弃了。 前面说了,一张地图有多个图层,所以还需求将图层放入一个列表,制作地图时遍历图层,调用每个图层的Render()办法,画出一张完好的地图。关于图层列表,我们立刻会想到运用List类,但图层制作是需求有次序的,如在卫星云图上面叠加地名,需求先画卫星云图,再填地名,不然云图会把地名盖住,所以在图层的款式(LayerStyle)中放了一个ZOrder特点,经过它来操控图层次序。但由于List自身的排序办法是一种“非安定排序”,也便是说当两个图层的ZOrder持平时,它们的次序是不确定的,为了防止这个问题,FreeMicaps从CollectionBase承继了一个类LayerList,完结对图层的办理,并完结了IXmlSerializable接口,完结图层序列化功用。别的,还增加了增加图层、删去图层事情。LayerList类如下: 有了坐标转化类、图层类、图层列表类,就能够运用它们做出一个具有缩放平移、图层办理等功用的地图了,但为了更便利地对地图进行操作,还需求对这些类进行组合封装。新建一个类WeatherMap,增加Coordinator和LayerList类的实例作为它的特点,为了更契合我们操作习气,将Coordinator类的实例作为私有成员,将地图坐标转化等办法参加WeatherMap类,也便是说地图坐标转化中,不拜访Coordinator,而要调用WeatherMap类的办法。类图如下: 再回到笼统图层类CustomLayer,它有一个成员Map,即为WeatherMap目标,在将图层参加图层列表时会主动赋值。在编写CustomLayer的子类时,可调用它来进行坐标转化和地图操作。 为了使地图在制作杂乱图形进程中不至于假死,并在绘图进程中能随时中止绘图,如快速缩放平移地图中可停止前次绘图进程直接制作最终一次,地图制作运用了多线程,但多线程增加了代码编写难度,特别是多线程操作UI,对程序流程形成了必定紊乱,程序结构受到影响,所幸并不会对图层代码形成困难。 上面已完结了地图制作的中心代码,为了使代码编写愈加简单,需求对WeatherMap类再次进行封装(MapView类),参加UI部分,即给地图加一个具有界面的壳,并在上面完结地图的操作如缩放、拖动功用。 为了完结对地图的操作,FreeMicaps界说一个IMapTool接口,包含了鼠标和键盘操作办法,MapView类内建一个IMapTool接口成员,MapView的鼠标和键盘操作,将被IMapTool接口的实例接收,在完结IMapTool接口的类中,可对地图做各种操作,如平移、缩放等操作,这个目标可随时替换以完结不同办法的地图操作。在FreeMicaps中,已完结一个完结IMapTool接口的类ZoomTool,此类为默许的地图缩放和平移东西。IMapTool接口类图如下: 别的,在MapView中,还引入了一个当时图层的概念CurrentLayer,用它来表明当时操作的图层,后边用它来完结图层元素拾取、图层东西条等功用。 以上现已介绍完FreeMicaps地图部分规划结构,信任我们的已对规划思路已有必定了解,此结构不只适用于气候图剖析软件,也适用于一般的GIS体系。本文仅对FreeMicaps的地图部分结构进行了介绍,未涉及到详细的地图数据读取及制作,这些将在下一篇文章中介绍。 上一篇:不写代码15分钟搞定GIS开发 下一篇:GIS 地图制造 学习总结 |