4. 设计与结构

GRASS是拥有面向栅格和矢量功能的、混合的和模块化结构的GIS。 每一个GIS功能都由它自己的模块来处理。 因此,GRASS地理信息系统结构清晰,并且看起来很透明。 这种结构的另一个优点是:只运行必需的模块,这样就节省了系统的资源。

4.1. 地理数据

GIS由四个部分构成 :

  • 输入
  • 管理
  • 分析
  • 表现

我们提到的四部分模型数据类型分成如下三部分:几何数据、属性数据和图形数据,分别具有以下特点:

几何数据描述了对象的空间位置,包括它们的形状以及相互的空间关系。 通常情况下,点、线或面间的空间关系在统一的坐标系统下描述, 从而反映现实世界的情况。 几何数据可以是栅格数据(像素), 也可以是矢量数据(多边形/区域,线,点)(见图 2)。

栅格数据在空间中连续延伸的数据,像元通常是正方形、等大小的, 从而形成规则的矩阵。 每个像元都有属性(属性、特征日期), 以反映某种现象(例如:温度或颜色值)。 像元以它们的坐标来存储,并调整为行列矩阵。 栅格数据通过地理坐标或指定的行(且/或)列数来获得。 对栅格数据的处理,使我们能够应用和分析遥感数据,如航拍的彩红外影像、卫星照片/影像等。随着分辨率的提高,内存和相应计算机资源的需求也随之增加,这也被视为栅格数据的一个缺点。 由于CPU速度和大容量存储能力的稳步增长,与过去几年相比,这一缺点变得不那么突出。此外,栅格数据没有所谓的邻接关系,因为每个像素都以自己在坐标系中的位置来确定。

|figure| [dattyp]

矢量数据用来存储线、(且/或)同类的面信息。一条线连接两个端点(节点),每个节点都有坐标。每个矢量对象可以赋予一个或多个属性值,也可以没有属性值。对GRASS的管理而言,dBase是默认的数据格式,同时也有对外部DBMS ( 数据库管理系统 – Database Management System)的接口,如 PostgreSQL, MySQL, Oracle等。与栅格数据相比,在执行分析时矢量数据内存需求更低,计算时间更短。与栅格数据不同,矢量数据有拓朴关系。这也就是说,线和面“知道”他们拥有哪些节点,同时也“知道”它们与哪些面相接。

点数据 (站点 – Sites)可以认为是一种特殊形式的矢量数据。它们用来存储选择性分布的空间信息。在GRASS 中可以存储为矢量站点,但在中则不可以。相应地,它也有数量数据的性质。

*属性数据 (类别 – categories)*是与前面提到的数据类型内部关联的属性。它们大都存储在 GIS 或数据库系统中,通过DBMI (数据库管理接口 – Database Management Interface)与 GIS 结合。

*图形数据*描述了空间对象在特定输出设备 (显示器,绘图仪等)、特定主题下的显示方法。

在 GIS 中,通过结合上面描述的数据类型,它们形成了定性、定量的的样本区。存储在 GIS 中的这些现象和对象(实体)出现了两种基本的结构:

  • 连续现象 -> 空间上连续的、无限的
  • 离散现象 -> 可界定的区域和对象,如:线

在设计 GIS 的时候,正确的选择所要使用的数据结构依赖于标准、空间分辨率、数据量、原始数据、计划的分析等。

在GRASS 里,不同的模块允许数据间的转换。如在一个连续地形模型中(栅格格式),等高线可以存储为矢量线。相似地,由数字等高线(矢量格式)组成的地图能够通过插值转换为一个连续的地形表面。在这一过程中,转换的质量依赖于原始数据的分辨率(见图 [abb:typvergl]).

[H]

image1 [abb:typvergl]

4.2. GIS数据的维度

[dimensionen]

空间数据大都是连续的,2维(2D)或2.5维(2.5D)的。数据中只要有第三个参数,我们就把它称为2.5维的。只有描述多面体(如建筑的表面)时,才将它存储为3D的。(见图[abb:datdim]).

[H]

image2 [abb:datdim]

4.3. GRASS数据库

[sec:grassdata]

以单独子目录存储在GRASS中的地理数据被称为GRASS数据库。通常情况下,在第一次使用GRASS以前,需要在用户的家目录下创建一个新的文件夹(如)。

cd              # 在Linux下自动切换到用户的家目录下

mkdir grassdata # 建立GRASS数据库的子目录

GRASS会为每一个项目区域自动创建一个子目录树(区域–Location)。所有项目数据都存储在Location子目录下。Location又可以被细分为地图子目录,称为地图集(mapsets)。GRASS就是以这样的结构组织和存取数据的。(请参阅 [subsubsec:permanent] 和 [subsubsec:mapsets])

[H]

image3 [abb:datenbank]

由于每个图层的不同部件(几何形状,属性和图形数据)存储在不同的子目录下,所以项目数据的管理应该使用GRASS命令来完成。例如,所有文件操作(拷贝、删除、重命名)都应该用适当的GRASS命令()来完成。

4.3.1. PERMANENT地图集

[subsubsec:permanent]

所有关于投影、分辨率和项目区域范围的信息都存储在PERMANENT地图集中,它是GRASS自动生成的。如果需要,项目的核心数据(原始地图)可以存在这里,因为只有项目的创建者对它有写权限。由于内部结构的原因,它能够保证数据不被其他用户更改。

所有的用户都能够创建额外的地图集,来创建、保存和改变他们自己的文件,以及对PERMANENT地图集中核心数据的分析结果。

*PERMANENT地图集中的文件*

在GRASS中,每个项目(区域)都能够单独地获取一个地图集。如果在PERMANENT中没有存储地图(核心数据),那么它只包含项目区域的辅助文件:

lp11cm

*DEFAULT_WIND* & 指定了PERMANENT的边界坐标、范围和分辨率 & *MYNAME* & 项目的名称 -> 如:hanover & *PROJ_INFO* & 指定了投影 -> 如:tmerc (横轴墨卡托投影), 贝塞尔 (椭球), 波茨坦 (日期) & *PROJ_UNITS* & 指定了使用的单位 -> 如:米 & *WIND* & 指定了当前区域(REGION),以及地图集的投影 & *VAR* & 指定了数据库的驱动和路径

4.3.2. 地图集的设计

[subsubsec:mapsets]

每个GRASS用户都能在自己所管理的项目数据中够创建一个或多个地图集。他们可能管理整个项目,也可能只管理一小部分。

GRASS数据库的结构能够让多个用户在同一时间、同一项目上协同工作,而不改变或毁坏其他用户的数据。其他用户的数据可以赋予只读权限,然后再集成到用户’自己’的项目中。所有分析结果都能够存储在用户的地图集中。

*地图集的文件结构*

lp12cm

*cats/* & 栅格地图的类别值(如颜色或温度值)和属性(带说明的分类)

*cell/* & 栅格地图

*cellhd/* & 栅格地图的头信息

*cell_misc/* & 栅格地图的统计值

*colr/* & 栅格地图的色彩信息

*dbf/* & 以 DBASE 格式存储的内部矢量的属性

*fcell/* & 浮点型栅格地图(f:浮点数)

*hist/* & 栅格地图的’历史信息’

*vector/* & 矢量数据(几何形状、拓朴等)

*WIND* & 当前区域地图集投影信息

GRASS 允许一个用户同时开启多个GRASS会话。

4.4. GRASS命令的结构

[befehle]

GRASS中的命令有非常清晰的结构。一个命令的类型可以通过首段的缩写(前缀)辨认出来。每个命令都是都立的程序,在GRASS中也被称为模块。它们有自解释的名称。如数字化栅格地图的模块叫做。为了将矢量转换为栅格,我们需要使用。表[tab:kommandos]详细地描述了GRASS命令和模块名称的结构。

除了GRASS自己的模块外,所有Unix/Linux程序也都是可以使用的。可以通过Shell、命令解释程序来调用它们。如果您喜欢设计、集成或修改自己的且/或已有的GRASS模块,这将非常有用。即使对初学者来说这会有些困难,但GRASS提供了这样的可能,使得每一个用户都能够毫无限制地实现自己的需求和想象。此外,创建简单的Unix/Linux Shell脚本是简单易学的。

[H]

前缀 功能分类 命令的含义
d.* display 图形显示和可视化
r.* raster 栅格数据处理
i.* imagery 影像处理
v.* vector 矢量数据处理
g.* general 普通文件操作命令
p.* paint 地图设计命令
ps.* postscript 用于postscript的地图设计命令
db.* database 数据库管理模块
r3.* voxel raster 3D栅格数据处理

4.5. GRASS模块的帮助

[subsec:helpme]

几乎所有的400个GRASS模块都有帮助文件,里面描述了命令和语法。使用参数“ -help”可以得到模块的简单帮助。

模块的详细描述和示例可以用 module name来显示。

此时,浏览器会启动,它会显示帮助文本。一个全面的索引也集成到了帮助中,在本书的最后(请参阅[sec:commandindex])也能看到。

4.6. GRASS的变量

[sec:env:sub:var]

在GRASS会话过程中设置了一些变量。使用模块可以显示和修改它们。如果该模块调用时未使用任何参数,那么GRASS将显示当前环境变量的设置:

g.gisenv
GISDBASE=/home/holl/grassdata
GRASS_DB_ENCODING=utf-8
MAPSET=PERMANENT
LOCATION_NAME=spearfish
GRASS_GUI=tcltk

要显示当前的地图集,需要使用参数’MAPSET’:

要修改一个变量,请使用下面的语法:

这将把变量OVERWRITE置于覆盖模式,默认情况下覆盖模式是不开启的。

GRASS特定变量的详细列表能够在帮助页面找到:

注意: 除了刚刚提到的变量’OVERWRITE’,您也可以使用开关或(带两个减号)来强制矢量和栅格模块覆盖已有地图。因此,您可以在每个命令中单独强制覆盖,而全局仍然是写保护的。

figure