7. 数据导入

[sec:import]

在开始数据导入之前,有必要提到GRASS的数据结构(请参阅[sec:grassdata])的模型。本节使用的术语在模型中有详细的解释。

互操作性是使用GIS的一个重要条件,例如原始数据的导入或从其它软件的数据转换。GRASS提供了大量的模块来导入矢量数据、栅格数据和站点。特定的命令语法可以用参数或来显示。

v.in.ogr -help
g.manual v.in.ogr &
r.in.gdal -help

7.1. 导入栅格数据

[sec:rasterimport]

GRASS支持多种栅格数据的导入,通常被认为是三类。

影像格式: 每个栅格总是有正的、整数值,如PPM,PNG,JPEG和GIF。

ASCII格式: 每个ASCII格式的栅格能包含正值,也能包含负值;可以是整数值,也可以是浮点值。ArcInfo的ASCII-GRID就是一个例子。

二进制格式:在二进制格式的栅格中,每个像素可以是正值,也可以是负值;可以是整型,也可以是浮点。并且它们能以不同的分辨率存储在不同的通道中。(Geo)TIFF和ERDAS/IMG都是很好的例子。

现在,要提到GRASS导入栅格数据的一个特性:栅格地图总是以原始分辨率和边界坐标来导入,但以当前区域的分辨率和边界来导出(请参阅[sec:rasterexport])。

对于未配准的数据分两种情况:

  1. 如果区域的分辨率已定义,地图必须适应它,那么扫描分辨率必须与所需的分辨(GRID RESOLUTION)率一致。
  2. 如果区域的参数,尤其是分辨率,与将要导入的地图一致,那么地图就可以毫无改变地导入。

表[tab:imrast]列出了用于导入栅格数据的模块,如其它GIS系统的格式,以及其它遥感影像格式。

[H]

|l|p10.5cm|

*GRASS模块 * & *导入的栅格格式* r.in.ascii & GRASS ASCII r.in.bin & BIL,GMT 二进制文件,LANDSAT TM5 r.in.gdal & ARC/INFO ASCII/Binary GRID, BIL, ERDAS (LAN, IMG), & USGS DOQ, JPEG, SAR CEOS, EOSAT, GeoTIFF, PPM/PNM, SDTS DEM, & GIF, PNG

导入栅格数据最常用的模块是。如表[tab:imrast]所述,它能够读取和写入()多种不同的格式。 以导入一幅配准过的ERDAS IMG地图为例。我们准备了一幅小的、30米分辨率的ASTERDEM地图,基于Osnabrueck的矢量数据。在主页可以找到。 (http://www.gdf-hannover.de/download)

r.in.gdal in=asterdem30m.img out=asterdem30m
 Projection of input dataset and current location appear to match.
 Proceeding with import...
  100%
 CREATING SUPPORT FILES FOR asterdem30m
 COPYING COLOR TABLE FOR asterdem30m

用标记可以获得定义区域必需的空间范围。

# Adapting the current region to the map:
g.region rast=asterdem30m -p

用显示管理器(Display Manager)或命令,可以显示导入的地图。为了看到地图,我们先要用启动一个GRASS监视器。

# Starting the Display Manager
d.m&

# Displaying the map in the prompt:
d.mon x0
d.rast asterdem30m

7.2. 导入矢量数据

[sec:vectimport]

最新的GRASS ,其矢量库进行了彻底的重组。这是很必要的,因为旧版本的 主要着眼于栅格数据和站点数据的分析。本课程将关注GRASS 的新的矢量功能。矢量数据的变化可以在第[sec:vectstruk]章中看到。

要导入矢量数据,需要考虑大量的、不同的格式和标准。与栅格格式相比,矢量数据更加复杂。这就使得矢量数据的导入也更为复杂。 表[tab:vecimp]列出了GRASS支持的格式。可能最常用的格式是ESRI的Shapefile。

矢量数据一旦导入,就变成了GRASS自己的二进制矢量格式。几何形状、拓扑结构和所有的属性都存储在GRASS内部的数据库中。拓扑结构会在地图导入过程中创建。 当前的拓朴状态可以用来显示。矢量相关的更多命令在第[sec:vectstruk]章中描述。

[H]

|l|p10.5cm|

*GRASS模块* & *导入的矢量格式* v.in.ogr & SHAPE file, UK.NTF, SDTS, TIGER, S57, MapInfo-File, & DGN, VRT, AVCBin, REC, Memory, GML, ODBC v.in.ascii & GRASS ASCII v.in.e00 & ArcInfo-E00-format v.in.db & Create vectors from database with x|y[|z] coordinates

将Shapefile导入GRASS需要调用。注意,Shapefile不是拓朴格式,因此各个对象间没有邻近关系。例如,两个区域间的边界线会存储两次。 这可能会带来一些问题,所以在导入过程中GRASS会进行改正。

本练习的数据来自FRIDA,他们维护了大量的、详尽的、Osnabrueck城的矢量数据,由Intevation GmbH 提供。

12323 primitives registered
0 areas built
0 isles built
Number of nodes     :   8937
Number of primitives:   12323
Number of points    :   0
Number of lines     :   12323
Number of boundaries:   0
Number of centroids :   0
Number of areas     :   0
Number of isles     :   0

导入过程中,一个名为streets的子目录被创建在目录下。在这个目录下存储了拓朴信息(topo),头信息(head),几何形状(coor),历史信息(hist),空间索引(sidx),类别索引(cidx)以及到相关属性数据的链接(dbln)。

根据默认设置,GRASS里的属性数据以DBASE格式存储在目录下。如果需要,您可以使用合适的编辑器来查看刚刚导入的属性数据(streets.dbf)。在GNU/Linux下可以使用OpenOffice、 Gnumeric或Koffice。

基于数据库(PostgreSQL 或 PostGIS)的,导入或生成矢量数据的方法在第[sec:vectstruk]章中可以看到。

如果矢量数据自己包含投影信息,那么在GRASS会话中可以基于这些信息生成一个新的区域。Shapefile的这些信息存储在后缀名为的文件中。用导入的数据创建新区域使用下面的语法:

v.in.ogr dsn=./frida-1.1-shp-joined/streets-joined.shp \
out=streets location=osnabrueck

7.3. 导入站点

[sec:punktimport]

在GRASS 中,站点(Site)不再单独存储在目录下,而是存储为矢量点,并用矢量模块来进行分析。以Shapefile格式的站点数据为例,使用来导入,与前面提到的类似:

268 primitives registered
0 areas built
0 isles built
Number of nodes     :   268
Number of primitives:   268
Number of points    :   268
Number of lines     :   0
Number of boundaries:   0
Number of centroids :   0
Number of areas     :   0
Number of isles     :   0

通常站点以坐标对形式存储在简单的ASCII表中。为了将其导入GIS,GRASS提供了模块。站点应该以X值 Y值的顺序列出,分隔符没有特殊的意义。例如,将要的入的文件(coord.txt),它的列以’|’分隔:

1664619|5103481
1664473|5095782
1664273|5101919

缺少的类别值(IDs)可以使用模块来添加,所以它可以用来添加额外的属性:

v.category in=punkte out=points2 op=add
v.category points2 op=report

站点的信息以GRASS矢量格式存储在当前的区域下,在GRASS数据库的目录里。

如果有第三列包含了高程数据,那么需要在命令中添加参数:

1664619|5103481|101.2
1664473|5095782|102.2
1664273|5101919|101.7
cat coords3d.txt | v.in.ascii -z out=elevation
v.category in=elevation out=elevation2 op=add
v.category elevation2 op=report

如何从已有的数据库中提取站点,将在第[sec:vectstruk]章中介绍。