GIS地图开发(gis地图开发工具)
大家好,下面小编给大家分享一下。很多人不知道GIS地图开发。以下是详细的解释,现在让我们来看看!
很多朋友对gis地图开发工具,GIS地图开发不是很了解,125小编刚好整理了这方面的知识,今天就来带大家一探究竟。
一、地图是怎么制作的首先说说地图是怎么制作的。你可能认为这是废话,但实际上很多人都不知道如何下手。
我觉得需要先给大家一个思路:地图是用绘图语句绘制的!要从底层绘制地图,可以使用绘图功能。在.NET中,可以使用Graphics类的方法在窗口中绘制点、线、面、标准、网格等。
合并后,它是一张地图(瓦片),图表除外)。关于.NET的绘图,本文不做讲解。
如果您不熟悉它,我建议您先阅读此信息。二、坐标转换——地图绘制的关键。
NET提供了大量的绘图方法,基本都是Graphics类的函数形式,包括各种几何形状、图像、文字的绘制。灵活运用这些方法,你可以画出漂亮的图画。
假设你已经熟悉.NET绘图,那么只需要解决一个问题:我可以画地图,但是地图元素通常是地理坐标(经纬度),应该画在地图的什么地方?这就涉及到坐标变换的问题。不管怎么实现,我们首先需要这样一个函数:///“概括”///将经纬度转换为屏幕坐标///“/概括”///《param name="xy"》经纬度《/param》///“返回”屏幕坐标“/returns”公共点WorldToScreen(PointF xy)还有一个,有时候,需要根据点在屏幕上的位置,反算出它的经纬度。
比如需要显示鼠标指针的经纬度,那么也需要这样一个函数:///“概括”///将屏幕坐标转换为经纬度///“/概括”///"param name="xy""屏幕坐标"/param"///“返回”纬度和经度“/returns”公共PointF ScreenToWorld(点xy)通过这两个函数,可以将经纬度表示的地理坐标转换成屏幕坐标,然后在屏幕上绘图。为了完成坐标变换,需要用到几个地图参数变量:地图缩放因子、地图中心点经纬度、地图大小、地图参数,请参考这篇文章:http://hi.baidu.com/geochenyj/blog/item/6b5c5c1294057557f819b835.html此外,还需要对地图进行缩放和平移。
这些操作本质上是对地图参数的操作。例如,放大是对地图缩放因子的操作,平移是对地图中心点的操作。
我们也把这些操作写在了Coordinator类的方法中。投影变换也是坐标变换的一部分,Coordinator类也增加了投影方法,后面会讲到。
将以上两个坐标转换函数和三个地图参数封装成一个类Coordinator。类看起来像这样:三、绘图借助坐标转换类Coordinator,可以使用经纬度数据进行绘图。
如果得到某省行政边界的经纬度坐标数据,可以将经纬度数据转换成屏幕坐标,然后用Graphics方法绘制出来,那么Graphics对象从哪里来呢?它可以从Image 对象创建,或从控件的Paint 事件中获取。总之,有了坐标,发挥你的想象力,自己画。
在气象数据分析中,除了绘制点、线、面、文字、网格外,还需要绘制一些特殊的符号,如风、天气现象、云等。这些符号可以用图片、天气等来实现字体和符号库。
图像法实现简单,色彩丰富,但缩放效果不佳;字体方法需要安装,程序部署比较麻烦;符号库方式写代码比较麻烦。 FreeMicaps天气现象符号使用符号库方法,参见:http://blog.csdn.net/HZGJF/archive/2009/05/27/4220508.aspx风符号和云覆盖符号是使用计算坐标绘制的。
为了方便使用,FreeMicaps将符号绘制功能封装成三个符号类,由静态方法提供。.NET的绘图是对GDI+的封装,包括对点、线、面等各种图形元素的封装,图形图像的绘制,坐标旋转,各种抗锯齿和平滑功能,功能非常强大(的当然,效率也不会太高),用它来绘制漂亮的图形。
按照OGC标准,GIS系统首先需要对地图元素进行抽象和封装,但在FreeMicaps中,经过深思熟虑,放弃了这种方式。一是因为工作量比较大,二是因为我不能保证能很好的封装,可能会给插件的开发带来麻烦。
不如把绘图权完全交给图层,让大家自由发挥。四、Layer 为了便于绘制过程的管理,可以对绘制过程进行分组。
比如地图的绘制可以分为:绘制世界地图、绘制中国地图、绘制河流、填充地名等。叠加形成地图。
在这里,每一个绘制过程都形象地称为一层。地图分层后,可以添加或删除图层,隐藏每一层,设置属性等,更重要的是,可以使用面向对象技术将每一层作为一个对象进行管理。
详见:http://blog.csdn.net/HZGJF/archive/2008/10/03/3014558.aspx对图层进行抽象,应该有一个图层绘制方法(Render),一个图层标题(LayerName),一个用来表示数据源的字符串(DataSource),一个用来表示绘制样式设置的LayerStyle,添加一些辅助方法属性,最终形成如下抽象层类(CustomLayer),各个层都继承自它:在FreeMicaps 中,每个数据对应一个图层类。为了方便图层类的编写,使用设计模式中的模板方法来定义绘制过程。
当主程序调用图层的Render()方法时,会自动判断数据是否已经读入,根据需要读取数据绘制。对于一类数据,需要从CustomLayer继承一个新的图层类。
各类数据层的工作方式完全相同,只是在数据读取和绘制方面有所不同。因此,在编写新的图层类时,只需要实现DoLoad()和DoRender()两个抽象方法即可完成读取数据和绘制图层代码。
FreeMicaps 使用字符串作为数据源标识符。一般的GIS 系统对数据源进行抽象。
我也尝试过这样做,但是代码太复杂,增加了层开发的难度,最终增加了插件开发的难度,所以放弃了。前面说了一张地图有多个图层,所以需要把图层放到一个列表中,在绘制地图的时候遍历图层,调用每个图层的Render()方法绘制出一张完整的地图。
对于图层列表,大家马上就会想到使用List类,但是图层的绘制需要有顺序。比如在卫星云图上叠加地名,需要先绘制卫星云图,然后填写地名,否则云图会覆盖地名,所以在ZOrder属性中放置了一个ZOrder属性图层样式(LayerStyle),通过它来控制图层顺序。
但是由于List本身的排序方式是一种“不稳定排序”,也就是说当两层的ZOrder相等时,它们的顺序是不确定的。为了避免这个问题,FreeMicaps从CollectionBase继承了一个类LayerList,实现了层的管理,并实现了IXmlSerializable接口来完成层的序列化功能。
此外,还添加了添加层和删除层事件。 LayerList类如下:在FreeMicaps 中,每个数据对应一个图层类。
为了方便图层类的编写,使用设计模式中的模板方法来定义绘制过程。当主程序调用图层的Render()方法时,会自动判断数据是否已经读入,根据需要读取数据绘制。
对于一类数据,需要从CustomLayer继承一个新的图层类。各类数据层的工作方式完全相同,只是在数据读取和绘制方面有所不同。
因此,在编写新的图层类时,只需要实现DoLoad()和DoRender()两个抽象方法即可完成读取数据和绘制图层代码。 FreeMicaps 使用字符串作为数据源标识符。
一般的GIS 系统对数据源进行抽象。我也尝试过这样做,但是代码太复杂,增加了层开发的难度,最终增加了插件开发的难度,所以放弃了。
前面说了一张地图有多个图层,所以需要把图层放到一个列表中,在绘制地图的时候遍历图层,调用每个图层的Render()方法绘制出一张完整的地图。对于图层列表,大家马上就会想到使用List类,但是图层的绘制需要有顺序。
比如在卫星云图上叠加地名,需要先绘制卫星云图,然后填写地名,否则云图会覆盖地名,所以在ZOrder属性中放置了一个ZOrder属性图层样式(LayerStyle),通过它来控制图层顺序。但是由于List本身的排序方式是一种“不稳定排序”,也就是说当两层的ZOrder相等时,它们的顺序是不确定的。
为了避免这个问题,FreeMicaps从CollectionBase继承了一个类LayerList,实现了层的管理,并实现了IXmlSerializable接口来完成层的序列化功能。此外,还添加了添加层和删除层事件。
五、封装地图有了坐标转换类、图层类、图层列表类,可以用它们制作地图,具有缩放和平移、图层管理等功能,但为了更方便要对地图进行操作,还需要对这些类进行组合封装。创建一个新类WeatherMap,并添加Coordinator 和LayerList 类的实例作为其属性。
为了更符合您的操作习惯,将Coordinator类的实例作为私有成员,在WeatherMap类中添加地图坐标转换等方法,即地图坐标转换,而不是访问Coordinator,调用WeatherMap类的一个方法。类图如下:回到抽象图层类CustomLayer,它有一个成员Map,也就是WeatherMap对象,在图层添加到图层列表时会自动赋值。
编写CustomLayer的子类时,可以调用它进行坐标变换和地图操作。为了防止在绘制复杂图形的过程中地图假死,以及在绘制过程中随时中断绘制,例如快速缩放和平移地图,可以终止上一次绘制过程,最后一次绘制过程可以直接画出来。
地图绘制使用了多线程,但是多线程增加了代码编写的难度,尤其是多线程操作UI,给程序流程造成了一些混乱,影响了程序结构。幸运的是,它不会给图层代码带来困难。
六、再次封装——在UI上添加已经完成的地图绘制核心代码。为了让代码写起来更简单,需要重新封装WeatherMap类(MapView类),增加UI部分,也就是给地图增加一个shell,带有界面的shell,可以在上面进行缩放、拖动等地图操作被实施。
MapView 继承自PictureBox 类,并具有WeatherMap 类的内置实例。在MapView的Refresh()方法中调用了WeatherMap.Render()绘制地图。
为了完成对地图的操作,FreeMicaps定义了一个IMapTool接口,它包括了鼠标和键盘的操作方法。 MapView 类有一个内置的IMapTool 接口成员。
MapView 的鼠标和键盘操作将由IMapTool 接口的实例接管。当实现了IMapTool接口的类中,就可以对地图进行各种操作,比如平移、缩放等,可以随时更换这个对象来实现不同的地图操作。
在FreeMicaps中,已经完成了一个实现了IMapTool接口的ZoomTool类,它是默认的地图缩放和平移工具。 IMapTool接口类图如下:另外,在MapView中还引入了一个当前图层的概念CurrentLayer,用于表示当前正在操作的图层,后期用于实现图层元素拾取、图层工具栏等功能。
MapView类图如下:七、概览图分类图如下:活动图的地图绘制部分如下:上面已经介绍了FreeMicaps地图的设计框架。相信大家对设计思路都有一定的了解。
该框架不仅适用于气象图分析软件,也适用于通用的GIS系统。本文只介绍FreeMicaps的地图部分框架,不涉及具体的地图数据读取和绘制,将在下一篇介绍。
以上就是关于gis地图开发工具,GIS地图开发的知识,希望能够帮助到大家!
以上解释了GIS地图开发。本文到此结束,希望对大家有所帮助。如果信息有误,请联系我们进行更正。
本网站文章仅供交流学习 ,若来源标注错误或侵犯到您的权益烦请告知,我们将立即删除. 邮箱jdapk@qq.com