空间分析入门

要开始分析空间数据,首先要将空间数据加载到数据库中。

装入空间数据

创建一个表格,几何图形列为 VARCHAR 列。 例如,下面的命令创建了一个适合加载点数据的表格:
CREATE TABLE PointData (PointID integer, the_geom varchar(200));
要在表格中插入点,请执行与以下命令类似的命令:
INSERT INTO PointData VALUES (1, inza..ST_Point(3423, 4356));
INSERT INTO PointData VALUES (1, inza..ST_WKTToSQL('Point (3423 4356)'));

请注意,只需执行其中一条 INSERT 命令即可将点插入PointData表。 执行两条 INSERT 命令的结果是两个点的PointID 相同。 在空间 API 函数中显示数据类型 ST_Geometry(或子类 ST_Point)的任何地方,都可以使用 the_geom 列。

以下命令将显示_geom 列中数据的几何类型:
SELECT inza..ST_GeometryType(the_geom) FROM PointData;

ST_GEOMETRYTYPE
---------------------
ST_Point
ST_Point
要创建包含多边形的表格,请执行以下命令:
CREATE TABLE Polys (PolyID integer, the_geom varchar(200));
要在表格中添加多边形,可发出与以下命令类似的命令,指定点作为两个正多边形的顶点:
INSERT INTO Polys VALUES (1, inza..ST_WKTToSQL('Polygon ((1000 1000, 1000 5000, 4000 5000, 4000 1000, 1000 1000))'));
INSERT INTO Polys VALUES (2, inza..ST_WKTToSQL('Polygon ((100 100, 100 500, 400 500, 400 100, 100 100))'));
利用 Polys 表中定义的多边形,可以通过 ST_Intersects()函数进行连接,从而发出基本的多边形内点查询,如下所示:
SELECT PointID, PolyID FROM PointData AS a, Polys AS b WHERE inza..ST_Intersects(a.the_geom, b.the_geom);

 POINTID | POLYID
---------+--------
       1 |      1
       1 |      1

空间数据表示法

创建几何对象或将现有空间数据加载到数据库时,数据将使用内部格式存储。 因此,如果使用标准的 "SELECT * FROM <table>查询来查看空间数据,返回的数据是不可读的。 要以可读形式显示数据,请使用空间转换功能。

例如,下面的命令将创建一个名为 "geoms的小表,并在表中添加多边形和线字符串对象:
CREATE TABLE geoms (PolyID INTEGER, the_geom VARCHAR(64000));
INSERT INTO geoms VALUES (1, inza..ST_WKTtoSQL('Polygon ((1 1, 1 4, 3.5 2.5, 6 4, 6 1, 1 1))'));
INSERT INTO geoms VALUES (2, inza..ST_WKTtoSQL('Linestring (1 1, 1 4, 6 4, 6 1)'));
要以可读形式显示 "geoms中的数据,请使用空间转换函数之一:
  • 要将空间数据呈现为文本,请使用ST_AsText:
    SELECT inza..ST_AsText(the_geom) FROM geoms;
    
    ST_ASTEXT
    ---------------------------------------------------------------------
    POLYGON ((1 1, 1 4, 3.5 2.5, 6 4, 6 1, 1 1))
    LINESTRING (1 1, 1 4, 6 4, 6 1)
  • 要以 Keyhole 标记语言(KML)呈现空间数据,请使用ST_AsKML:
    SELECT inza..ST_AsKML(the_geom) FROM geoms;
    ST_ASKML 
    ---------------------------------------------------------------------
    <LineString><coordinates>1,1 1,4 6,4 6,1</coordinates></LineString>
    <Polygon><outerBoundaryIs><LinearRing><coordinates>1,1 1,4 3.5,2.5 6,4 6,1 1,1</coordinates></LinearRing></outerBoundaryIs></Polygon>

如何存储空间数据

存储空间数据的列的数据类型取决于正在使用的盒的类型:
空间
空间数据保存在 VARCHAR 列中。
空间 ESRI
空间数据保存在 ST_GEOMETRY 列中。
注意:虽然空间数据以字符数据形式存储,但如果尝试使用非空间字符串函数或运算符对其进行操作,其内部格式可能会被破坏。

每列的最大大小为 64,000 字节,数据库行的最大大小为 65,535 字节。 虽然大多数几何对象都可以在一个 64,000 字节的字段内完全定义,但有些几何对象,例如有许多顶点的多边形、有许多点的线段或多点。 可能需要更多空间。

通常情况下,多边形只有一个环(外环),顶点使用 XY 坐标,在达到列大小限制之前,顶点数最多可达 3990 个。 如果多边形有内环(即孔),或其顶点使用 XYZ、XYM 或 XYZM 坐标,则一列中顶点的最大数量会减少。

从其他数据库加载空间数据

从其他数据库加载空间数据时,有些几何图形可能太大,无法存储在单列中。 数据也有可能包含非简单几何类型,或者使用了加载函数不支持的字符或其他值。

功能处理引擎(FME)工作台应用程序是 Safe Software Inc、 帮助准备数据集并将其加载到Netezza Performance Server数据库中。 例如,FME 工作台可以在以下方面为您提供帮助:
  • 它可以检测到顶点超过 3990 个的多边形,并采取用户指定的操作,如将几何体切成更小的几何体、跳过并忽略几何体、中止加载过程,或对几何体进行泛化(或平滑),使其足够小以适应目标区域。
  • 它可以检测非简单几何图形,ESRI 空间插件支持这些几何图形,但空间插件不支持。 它可以将其过滤掉,或者进行缓冲,以便随后将其转化为简单的几何图形。
  • 它可以加载二进制空间数据,同时检测和转义加载功能不支持的已知二进制值。
有关 FME Workbench 应用程序的更多信息,请参阅 Safe Software Inc.

在用户数据库中使用空间功能

安装空间或空间 ESRI 卡盒后,所有空间函数和存储过程默认都会在 INZA 数据库中注册。 不过,您也可以在用户数据库中注册空间函数和存储过程。 这样,您就可以在单一系统中使用多个版本的空间功能,例如用于测试目的。

要在用户数据库中注册空间函数和存储过程,请执行以下步骤:
  1. 输入以下命令创建新用户数据库,其中 "newdb代表要创建的用户数据库名称。
    % nzsql -c "create database newdb;"
     CREATE DATABASE
  2. 输入以下命令注册 nzspatial:
    % nzcm -d newdb -r nzspatial
  3. 输入以下命令运行create_inza_db.sh脚本:
    % /nz/export/ae/utilities/bin/create_inza_db.sh newdb
在用户数据库中,空间函数和存储过程的注册方式如下:
  • 在 INZA 模式中,当启用全模式支持Netezza Performance Server功能时
  • 在默认模式中,当全模式支持Netezza Performance Server功能禁用时

从空间卡盒升级到空间 ESRI 卡盒

您可以使用 "convert.sh脚本来帮助您将数据从空间盒 (nzspatial) 使用的众所周知的二进制 (WKB) 格式迁移到空间 ESRI 盒 (nzspatial_esri) 使用的 ESRI 二进制格式。

注意:强烈建议在迁移数据前备份数据库。

脚本使用了 ST_CONVERT 函数,因此无需单独调用该函数。 脚本位于 "/nz/export/ae/products/netezza/nzspatial_esri/<version>/scripts/convert.sh中。

convert.sh脚本将包含 WKB 几何数据 VARCHAR 列的表转换为包含 ESRI 二进制几何数据 ST_GEOMETRY 列的新表。 列名保持不变。 该脚本还对已知二进制 (WKB) 数据库中的两个非标准 SRID 进行了规范化处理:
  • SRID 1111 将转换为您指定的 SRID(默认为 4269)。
  • SRID 1234 将转换为您指定的 SRID(默认为 27700)。
新表可以在同一个数据库中,也可以在不同的数据库中。
您必须以用户 nz 的身份运行 "convert.sh脚本。 在运行脚本之前,必须满足以下条件:
  • nzspatial 函数。
  • nzspatial_esri 函数。
  • 目标数据库已 INA 初始化。
语法

convert.sh命令

阅读语法图跳过可视化语法图 convert.sh <nzspatial db><nzspatial表<几何列> <nzspatial函数库><nzspatial_esri函数数据库><nzspatial_esri db><nzspatial_esri表><新球体 Srid><新球体 Srid>
表 1. convert.sh脚本的参数
参数 描述
<nzspatial db> 包含 nzspatial 表数据的源数据库名称。
<nzspatial表 包含 nzspatial 数据的源表名称。
<几何列> 几何列名称。
<nzspatial函数库> 包含 nzspatial 函数的数据库名称。
<nzspatial_esri函数数据库> 包含 nzspatial_esri 函数的数据库名称。
<nzspatial_esri db> 包含新创建的 nzspatial_esri 表数据的目标数据库名称。 默认为源数据库。
<nzspatial_esri表> 包含新创建的 nzspatial_esri 数据的目标表名称。 默认名称为 <nzspatial_table>_tmp。
<新球体 Srid> 要分配给新创建的 nzspatial_esri 数据的 SRID,之前分配给 SRID 1111(球形)。 默认值为 4269。
<新的卡方网格> 要分配给新创建的 nzspatial_esri 数据的 SRID,之前分配给 SRID 1234(笛卡尔)。 默认值为 27700。