您的位置:首页 > 其它

GIS是怎样建成的系列之一:从图形开始

2014-03-02 21:26 183 查看
从进入大学稀里糊涂与GIS结缘已经有六年了,回首这些年与GIS的关系有如恋人,曾经自以为了解它,GIS原理从本科到研究生学了两遍,学过的专业课不下十门,ArcGIS从应用到开发,从Engine到Server甚至silverlight、flex等富客户端API,涉猎也算广泛了吧。然而,去年接触了第一个开源GIS的sharpmap忽然发现其实GIS也可以是这样的。就如某朋友谈到女孩子之后,说女孩子啊,当你了解到某一个阶段,忽然就会发现完全不了解她了,当时就是这种感觉。从这之后,一个原来不太愿意想的问题出现在眼前,GIS是怎样建成的?不是二次开发的几个API,也不是所有GIS原理书本那些只为了考试背诵的大段文字。从今天起,小菜鸟从NetTopologySuite几何图形库开始来学习建立一个GIS系统是如何建成的。

上帝创世的时候首先创造的天地,天地构造了世界的基础。那么什么是GIS中的天地?小菜鸟觉着是图形。地图和对地图一切的操作其基础就是一个个图形。那么什么是图形呢?从传统认识的是点、线、面、体。但这还不够具体,好在相比当年上帝相比现在的上帝们已经有了一个使用指南OpenGIS标准,它定义了一系列GIS的规范,其中就包括了GeoAPI——一组GIS的Java接口。NetTopologySuite也不例外,它使用的是GeoAPI的.Net版本中的Geometries图形定义问题。好吧,那让我们试着看看上帝该怎么实现这些东西。

首先具体化的图形都存在一个问题——坐标问题。所以上帝说得有坐标,于是便有了坐标的接口ICoordinate,包括X,Y,Z坐标,这应该是一个坐标最基本的东西吧。在此基础上坐标之间还有距离和比较,也就是Distance和Equal(按照需求分为Equal2D和Equal3D)。有了坐标之后我们就有了构建图形的原子了,那么原子怎么构成更大粒度的元素的。定义一个IGeometry接口。好了,定义了图形的总接口我们可以玩我们想的点(定义IPuntal)、线(定义曲线ICurve,二维线Ilinear)、面(定义IPoliygonal,ISurface)了。为了区分维度,定义Demension来区分。在此基础上我们就有了IPoint(具体点),IPolygon(具体多边形,包括轮廓和内部岛屿),ILineString(多线),ILineRing(带有方向的多线)等。

定义了单体的图形到这里就基本定义完成了, 那么开始定义其集合IGeomertyCollection,然后对应定义多点(IMutiPoint),多线(IMutiPoint,IMultiLineString),多面(IMutiCurve,IMultiSuface)。这就出了一个问题,作为一个集合性操作,定义一个IGeomertyCollection是不是已经足够了呢?就图形本身来看其似乎作用并不大,但就我的理解这类数据结构的作用是当图形(Geometry)变成了要素(Feature)时候,这时候空间和属性一一对应,这样用多点,多线,多面这样的数据结构就可以方便表示一些同质的图形。其图形定义部分基本如下图所示。










当然,这够了吗?这些东西我们可能会从文件中直接读取,或者创建中有一定的要求,比如闭合、坐标不重复。学过设计模式的话,你会想到一个东西,那就是工厂,创建一个GeometryFactory,从此我们的所有对象就是靠Factory创造。还有一个非常重要的结构Envelope,相信学习GIS的朋友不会陌生吧,翻译过来叫包络线,说白了,就是所有图形的一个矩形外框,用处很大了,以后我们会慢慢了解它的魅力。在NetTopologySuite里面,这些接口基本上做了简单实现。好了,这样似乎关于图形的东西就基本搭出来了,当然这不是图形的全部,还有一些东西如精度模型,位置关系,关系矩阵以后会陆续出现,还有个别如ordinate纵坐标?小程序猿自己也是一知半解,欢迎拍砖,一起学习进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: