一直认为地理信息系统建设是个小众化的圈子,但是随着越来越多的人开始使用GIS软件,发现GIS已经从蛰伏期转变到了繁荣期,而且技术也越来越成熟。慢慢想来,几乎每个行业都在使用GIS技术,如国土,环保,航测等等。虽然GIS技术是一个跨学科综合型的IT技术,但在早先的应用仅局限在一些专业软件内部,如ArcGIS,mapGIS等等。
为什么GIS没有像其他IT技术一样很快的流行开?我觉得可能和他的一些专业背景知识有关。大部分人觉得GIS有难度,而且难度大部分是集中在投影啊坐标系的理解上,这些知识点的理解造成了GIS使用的局限。其实GIS的快速发展和组件式GIS的流行分不开,Esri在这方面抢在了所有人的前面,简单的搭建环境后,就能开发出独立的GIS功能,这是何等的强大。随着时间的推移,众多厂商开始介入GIS领域,最先进入大众眼球的是Google Earth,这个软件的强大,以至于让Esri感到害怕,随着国内大厂商如高德,天地图的在线功能,使得很多人开始了解GIS,熟悉GIS,GIS也变得大众化。
因为一直在GIS的圈子,从参与者的角度来说,GIS技术发展的确很快,web GIS,云等等很多新奇概念的涌现越来越快,但是无论现在还是以后只要还和地理位置相关,GIS背后的基石是不会变的,这个基石就是计算机图形学,算法,如此而已。这里就从最实用的角度出发,告诉你一个真实的GIS技术如何实现。
大部分人如果使用GIS,最先想到的功能是显示地图。这也是GIS产生的缘由所在。如果要我们自己动手写一个展示地图的系统如何实现呢?如果你说我会用第三方组件,那我知道你肯定熟悉GIS,只是你仍然不清楚组件背后的实现技术。要自己写一个GIS系统出来,需要越过三个坎。
第一个坎,你了解坐标系转换么?从地理坐标直接转化为屏幕坐标,这个过程如何实现?
第二个坎,如何给出正确的地理对象的描述,也就是怎么用地理坐标去描述,河流,大洲,城市这些地物?
第三个坎,计算机图形学,如何用合适的方式显示你的地理信息。
做了很长时间的GIS,我终究觉得,隐藏在GIS背后的东西才是我需要真正抓住的本质。随着对Arcgis的逆向工程的开始,我逐渐明白,其实本质的东西是非常容易理解和掌握的,就和我下面给大家讲得例子一样简单。
我们的GIS开发之路从绘制世界地图开始。
本文解决的第一个问题,如何绘制地理坐标到屏幕上?这个问题的解决,很多监控类项目,就不需要第三方组件了。 这个问题其实很简到,就是一个坐标系的转换问题,如何把地理坐标系转换到屏幕坐标系。我们可以参考ArcMap的绘制。以下是实现的几个步骤:
第一步,我们要确定坐标,屏幕坐标系是左上角为原点,水平向右是X 轴,竖直向下是Y轴。地理坐标则是笛卡儿坐标系,在这里需要注意,我们的地理坐标原点(0,0)需要和屏幕中心(w,h)对应。屏幕坐标的原点(0,0)和地理坐标的(-180*1.1,90*1.1)对应,因为坐标系线性转换需要三个点,我们再选一个点,屏幕上的(0,h)点,对应地图上的(-180*1.1,0)通过上面三个点就能确定出一个坐标对应关系。有了关系,我们可以得到从地图到屏幕的坐标转换,具体就是一个方程系数求解过程:
X=ax+by+c
Y=dx+ey+f
X,Y指屏幕坐标,x,y地理坐标
把上述三个对应点代入方程就可以得到六个方程,求解除a,b,c,d,e,d,f六个参数,这样对于地理上的任意一个点就可以得到转换方法。
在上述对应点中,w,h分别指屏幕宽度的一半,和屏幕高度的一半。为什么要1.1这个是比例系数,为了不让地图画到屏幕边界上。事实上ArcMap的全图就是按1.1绘制的
第二步,如何得到地理对象的描述数据,很简单,用ArcGIS的工具自己转出一份数据,可以是文本的或其他来源。我这里是用ArcToolBox下的工具转出的一份数据他的格式类是如下
Polygon
0 0
0 35.488323 -21.6850039673 1.#QNAN 1.#QNAN
1 35.452215 -21.7874959673 1.#QNAN 1.#QNAN
2 35.445546 -21.7872259673 1.#QNAN 1.#QNAN
3 35.435556 -21.7833379673 1.#QNAN 1.#QNAN
4 35.428059 -21.7761109673 1.#QNAN 1.#QNAN
5 35.42319 -21.7627819673 1.#QNAN 1.#QNAN
6 35.424432 -21.7275019673 1.#QNAN 1.#QNAN
7 35.435826 -21.6552859673 1.#QNAN 1.#QNAN
8 35.471385 -21.5336059673 1.#QNAN 1.#QNAN
9 35.483328 -21.5252809673 1.#QNAN 1.#QNAN
10 35.496801 -21.5463949673 1.#QNAN 1.#QNAN
11 35.497215 -21.5813869673 1.#QNAN 1.#QNAN
12 35.494722 -21.6583369673 1.#QNAN 1.#QNAN
13 35.488323 -21.6850039673 1.#QNAN 1.#QNAN
0 1
0 55.721934 -21.3644419673 1.#QNAN 1.#QNAN
1 55.674162 -21.3738919673 1.#QNAN 1.#QNAN
2 55.659438 -21.3736129673 1.#QNAN 1.#QNAN
3 55.533339 -21.3547309673 1.#QNAN 1.#QNAN
4 55.427769 -21.3125029673 1.#QNAN 1.#QNAN
.....
7 187
0 -81.71028 12.4908400327 1.#QNAN 1.#QNAN
1 -81.713052 12.4902730327 1.#QNAN 1.#QNAN
2 -81.720135 12.4963210327 1.#QNAN 1.#QNAN
3 -81.720144 12.5452720327 1.#QNAN 1.#QNAN
4 -81.713898 12.5650000327 1.#QNAN 1.#QNAN
5 -81.704727 12.5802730327 1.#QNAN 1.#QNAN
6 -81.692361 12.5902720327 1.#QNAN 1.#QNAN
7 -81.681318 12.5857630327 1.#QNAN 1.#QNAN
8 -81.690984 12.5322220327 1.#QNAN 1.#QNAN
9 -81.702522 12.5072200327 1.#QNAN 1.#QNAN
10 -81.71028 12.4908400327 1.#QNAN 1.#QNAN
END
第三步,在MFC中我自己用程序解析了一下数据源,然后把地理坐标转成屏幕坐标绘制出来,就能得到如下效果
普通渲染下的效果:
下一次我们需要了解如何对地理对象作简单描述。