zoukankan      html  css  js  c++  java
  • GIS底层开发总结

    GIS底层开发总结

    基本理解点:

    1 位置都是相对的。比如你在路旁边,你感觉你和路很近很近。其实也许你们真的离得很远很远。

    基本趋势:

    1 LBS位置服务必然是移动GIS的最大关注点

    2 无线GIS还是应该支持OGC标准,方便各种无线GIS产品之间的耦合。

    3 地图显示基本策略

           1)多图层信息存储在一个文件中。

           2)例如使用者可以放大地图10次,文件中图层只有15个,每3层(分别是点线面)一起显示,代表一个逻辑显示的图层。那么对用户来说,表示每放大2次才会显示下一个图层(好像这就是无极缩放),一个有5个显示级别。每个显示级别一个索引。

           3)显示的时候采用空间索引,可以利用网格或者四叉树来保持空间索引。这样可以快速的找到要显示的要素(点/线/面)信息。

           4)网格数据是二维的,同一层的空间数据,可以用网格索引,逻辑上的相邻网格一般在物理存储上也应该相邻,因为用户一般都会访问相邻的地图。所以我们可以利用hilbert算法。

    关键技术:

    1:地图坐标到屏幕坐标的转化,动态图层时这一步将非常耗时。

    2:矢量地图的索引机制

           2.1 网格索引: 首先将原始的地图数据划分为N个网格,视为一级索引,当然,一级网格是用hilbert保存的,将每个矢量数据分别放入相应的网格之中;然后将一级网格划分为更小的网格,视为二级网格。二级网格用数组保存即可。

           使用的数据结构可以为四叉树或者简单的网格编号索引。我个人倾向于四叉树。呵呵。

           另外2个提高索引效率的方法,1是尽量把多层数据放到同一文件中,避免多次操作文件的开销。2是同一显示级别的多图层共享同一网格数据模型(4叉或者……hehe)

    3:开创剪裁:白菜的解释就是按照屏幕尺寸对已经画好的即将显示的FB数据进行剪裁使适合屏幕大小(好像也不是很白菜,呵呵),算法都很成熟了。直接照用,知道瓶颈在于线性方程组求交集就OK!!!啦啦啦。

    GIS学习步骤

    作为GIS初学者,首先需要了解GIS数据模型。对于简单实体型矢量数据而言,每一个要素对应一条记录,包含要素的属性信息和几何信息,属性信息用通常的数据类型来表达,而几何信息需要新的字段类型来表达即Geometry空间数据类型,它记录了这个要素的几何坐标。接下来,需要了解Geometry对象模型以及它是如何表达各种复杂的几何要素的,在对要素的属性信息和几何信息了解的基础上,一个图层上的众多要素又是怎么组织在一起存放到文件或数据库表中的,这里就牵涉到空间索引的安排了。空间索引给要素存放的位置作了一个登记,当进行要素读取时,先查找空间索引获取到要素存放的地址,然后迅速定位到该地址读取数据;同时,有意识地将要素按空间索引的某种规律排放能快速获取多个要素,提高I/O的效率。

        GIS内核有各个模块组成,它们松散耦合共同完成数据读取、数据组织、图层管理、图层渲染、地图管理、空间分析等各方面的工作,所以,有必要了解一下GIS内核所包含的模块以及之间的关联关系,对进行GIS面向对象设计有更深入的了解。

    地图显示是GIS的核心问题,如何将要素的几何信息转换为图形显示,就要涉及到地图坐标和屏幕坐标的转换、图形的窗口裁减、网格化的地图标注等内容,而要素的符号化,是形象化地图表达的关键,通过符号化能表达要素的质量和数量特征,符号库的建立、符号化渲染是地图符号要介绍的重点内容。

    地图工具,是与用户的交互接口,它能浏览地图、选择要素、编辑地图等,这些是建立在前面的基础上实现的,只有读取到要素数据并将其在画布上渲染出来,才能进行对地图的进一步操作。

    空间分析,内容很多,常用的有空间关系判断与查询、叠置分析、缓冲区分析、路径规划等,主要是一些计算几何和图论的算法,这里作一些简单介绍。

    OGC标准,相对于GIS内核,是一套外围框架和标准,是对GIS内核的封装,对外开放了符合OGC标准的WEB接口,屏蔽了内核实现的差异,实现异构系统的共享与互操作,是当前GIS发展的必然趋势。WMS、WFS、WCS等标准都是基于HTTP协议之上实现,是SOA架构思想、Web Services技术在GIS上的应用。

    GIS基本数据结构

    数组或链表,在GIS中应用最为广泛,几乎到处可见其身影。比如,线或多边形就是Point类型的数组,读shapefile文件时,文件已经记录下该要素包含的点数,数组的长度就被确定了,如果添加节点,最好采用封装好的动态数组或链表来存储;网格索引,用二维数组表示,每个数组元素记录下该网格范围所对应的数据存储地址,方便空间数据的检索;图层管理,一张地图是由若干个图层叠加而成,用数组或链表来存储这些图层信息,图层顺序调的整转化为数组或链表的删除和插入。

    堆栈和队列,也属于线性结构,只是比数组和链表多了一些限制,堆栈是先进后出,队列是先进先出。比如,线性四叉树索引,用中序遍历的方法降四叉树线性化,其中树的中序遍历,非递归算法就需要用到堆栈;GPS轨迹跟踪,随着GPS点的增加,轨迹会越来越长,在实时跟踪过程中,可能只需要保留当前最近一段时间的点,更早之前的点被保存到数据库中,不再绘制,所以,采用循环队列来存储GPS当前一些点,利用了GPS时间顺序先进先出的特点,同时能循环利用队列;客户端图片瓦片缓存池,也可以采用循环队列,当前可视范围内获取到的新瓦片插入到队列中,当队列满的时候,淘汰最早存放在队列中的瓦片,同时保持队列缓存池的容量。

    优先队列,是不同于先进先出队列的另一种队列,每次从队列中取出的是具有最高优先权的元素,二叉堆就是优先队列,分最大堆和最小堆,它能快速地从一个集合中找出最大(小)的元素。最优路径,算法中经常执行一步就是从后继节点中找出最优的节点,采用的就是最小堆,它能迅速地找出到当前节点权值最小的节点。

    树,是一种递归定义的数据结构,一对多的关系,树是没有回路的连通图。四叉树索引,就是典型的树结构,按MBR(Minimum Bounding Rectangle 最小外包矩形)相交条件从树根一步步往下查找,筛选出要素子集;OGC中XML解析,XML(GML)结构本身也是树状结构;等高线,嵌套关系的表达,是树结构;属性数据词典库,采用Trie数据结构,多叉树的形式,建立属性词典库,通过字符串的匹配实现属性查询。

    图,是一种数据元素间为多对多关系的数据结构,通常采用邻接矩阵或邻接表的方式来存储。道路网或管网的拓扑构建,道路网或管网属于网状结构,用图来描述节点与弧段之间的拓扑关系,便于最优路径、最大流最小割通路、爆管、旅行商等网络分析。

    哈希,设计Hash函数代入key算出地址,存储value值,哈希查找效率高,但可能存在冲突,对内存空间占用相对较大一点。道路网或管网构建,以节点的node_id为key,以后继节点的集合为value;GML引擎,以图层编号为key,属于该图层的要素集合为value;线标注,线被裁减后,通过统一的key来拼接,以不同裁减路段集合为value。

                                                                                                             sylar

    2010:3:15传说中的315

                                                                                               于中南财经政法大学文泰楼

  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/SuperXJ/p/1686700.html
Copyright © 2011-2022 走看看