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)时候,这时候空间和属性一一对应,这样用多点,多线,多面这样的数据结构就可以方便表示一些同质的图形。其图形定义部分基本如下图所示。
![](http://img.blog.csdn.net/20140302213141906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FpeGluODk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](file:///C:\Users\happyKaiKai\AppData\Roaming\Tencent\Users\596084019\QQ\WinTemp\RichOle\97P%5~H6{KL){11%`6G((TD.jpg)
![](file:///C:\Users\happyKaiKai\AppData\Roaming\Tencent\Users\596084019\QQ\WinTemp\RichOle\97P%5~H6{KL){11%`6G((TD.jpg)
![](file:///C:\Users\happyKaiKai\AppData\Roaming\Tencent\Users\596084019\QQ\WinTemp\RichOle\97P%5~H6{KL){11%`6G((TD.jpg)
当然,这够了吗?这些东西我们可能会从文件中直接读取,或者创建中有一定的要求,比如闭合、坐标不重复。学过设计模式的话,你会想到一个东西,那就是工厂,创建一个GeometryFactory,从此我们的所有对象就是靠Factory创造。还有一个非常重要的结构Envelope,相信学习GIS的朋友不会陌生吧,翻译过来叫包络线,说白了,就是所有图形的一个矩形外框,用处很大了,以后我们会慢慢了解它的魅力。在NetTopologySuite里面,这些接口基本上做了简单实现。好了,这样似乎关于图形的东西就基本搭出来了,当然这不是图形的全部,还有一些东西如精度模型,位置关系,关系矩阵以后会陆续出现,还有个别如ordinate纵坐标?小程序猿自己也是一知半解,欢迎拍砖,一起学习进步。
上帝创世的时候首先创造的天地,天地构造了世界的基础。那么什么是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)时候,这时候空间和属性一一对应,这样用多点,多线,多面这样的数据结构就可以方便表示一些同质的图形。其图形定义部分基本如下图所示。
![](file:///C:\Users\happyKaiKai\AppData\Roaming\Tencent\Users\596084019\QQ\WinTemp\RichOle\97P%5~H6{KL){11%`6G((TD.jpg)
![](file:///C:\Users\happyKaiKai\AppData\Roaming\Tencent\Users\596084019\QQ\WinTemp\RichOle\97P%5~H6{KL){11%`6G((TD.jpg)
![](file:///C:\Users\happyKaiKai\AppData\Roaming\Tencent\Users\596084019\QQ\WinTemp\RichOle\97P%5~H6{KL){11%`6G((TD.jpg)
当然,这够了吗?这些东西我们可能会从文件中直接读取,或者创建中有一定的要求,比如闭合、坐标不重复。学过设计模式的话,你会想到一个东西,那就是工厂,创建一个GeometryFactory,从此我们的所有对象就是靠Factory创造。还有一个非常重要的结构Envelope,相信学习GIS的朋友不会陌生吧,翻译过来叫包络线,说白了,就是所有图形的一个矩形外框,用处很大了,以后我们会慢慢了解它的魅力。在NetTopologySuite里面,这些接口基本上做了简单实现。好了,这样似乎关于图形的东西就基本搭出来了,当然这不是图形的全部,还有一些东西如精度模型,位置关系,关系矩阵以后会陆续出现,还有个别如ordinate纵坐标?小程序猿自己也是一知半解,欢迎拍砖,一起学习进步。
相关文章推荐
- GIS是怎样建成的系列之二:图形,图形,我们去哪里呀(四叉树部分)
- GIS是怎样建成的之三:图形,图形,我们去哪里呀(区域树部分)
- 微信小程序开发系列(一) ——怎样开始进入小程序开发
- GIS是怎样建成的之四:gdal\ogr以及provider
- GIS是怎样建成的之五:瓦片(Tile)
- 怎样将GIS图形复制到Windows剪贴板,粘贴到Word中
- TheBeerHouse 系列四:从表示层开始下(我怎样限制你的自由??)
- 怎样将GIS图形复制到Windows剪贴板,粘贴到Word中
- 夏日激情-MOSS系列开始篇
- 从0开始学习 GitHub 系列之「01.初识 GitHub」----转载自stormzhang 原创文章
- [js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形)
- 从0开始学习 GitHub 系列之「01.初识 GitHub」
- [ZZ]TD-SCDMA试商用网已经建成 开始向用户放号
- /LGC图形渲染/Graphics 文化系列 -- John Carmark 与 id software
- 【信息安全】职业发展之惑系列三 -- 我该选择怎样的职业发展道路
- /LGC图形渲染/怎样写 Linux LCD 驱动程序
- ASP.NET MVC 3.0学习系列文章(开始学习MVC)
- 博士生(后):独孤必败是怎样练成的?(博士后系列3)
- svg学习系列02-简单的svg图形和线条
- nagios系列(五)之nagios图形显示的配置及自定义插件检测密码是否修改详解