空间数据库

作者

巴特·范登·艾金登

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2021-05-05

Oracle Spatial是Oracle数据库的一个空间组件。记住,所有Oracle数据库都附带Locator,它的功能比Oracle Spatial少。定位器和空间定位器之间的差异可以在 Oracle Spatial FAQ .

您还可以看到原始的 OracleSpatial wiki page 这份文件是以此为基础的。

二进制文件

中包含具有Oracle空间支持的MapServer Windows插件 MS4W 。但您需要在运行MapServer的服务器上安装Oracle客户端软件。出于开发目的,可以从Oracle网站获得Oracle客户端软件。Oracle技术网络开发许可协议适用于本软件。即时客户端将是令人满意的,您可以下载 instant client 。确保您的MapServer是在与Oracle客户端相同的版本上编译的。

安装

看见 Oracle安装 有关MapServer本机Oracle支持的更多配置和安装信息。

备注

如果您收到错误消息,如“错误:.”。这可能与MapServer无法访问或定位Oracle_主页有关。

使用Oracle Spatial和MapServer的两个选项

MapServer中的Oracle空间层可以通过两个接口使用:

  • 本机内置支持通过 maporaclespatial.c

  • OGR,但请注意:默认情况下,GDAL/OGR不是使用Oracle Spatial支持进行编译的,因此如果不亲自在OCI(Oracle客户端)中进行编译,它将无法工作。这需要重新编译GDAL/OGR以及根据新的GDAL/OGR重新编译MapServer本身!

本地Oracle空间支持的映射文件语法

这个 DATA 的语句 LAYERCONNECTIONTYPE 预言空间现在可以有4个选项。这一更改是向后兼容的,即指定数据的旧方法仍然有效。新选项是旧DATA语句的扩展,因为它们需要包括用于查询模式(UNIQUE)的主键的标识。

以下选项是有效的数据语句:

"[geom_column]
FROM
[table]| [(
            SELECT [...]
            FROM [table]|[Spatial Operator]
            [WHERE condition] )]
[USING [UNIQUE column]
        | [SRID #srid]
        | [FUNCTION]
        | [VERSION #version]
]"

注意:变量绑定是通过使用 BINDVALS 和名称值对。

实例

例1

最简单的数据语句,在这种情况下,只需要定义一个几何列和一个表。此选项假定您没有定义SRID。

LAYER
    ...
    CONNECTIONTYPE oraclespatial
    DATA "MYGEOMETRY FROM MYTABLE"
    ...
END
例2

它由第一个选项加上使用唯一参数组成。当您想要使用任何查询函数时,这些新特性是必需的。使用时,必须传递数值列类型。此选项假定您没有定义SRID。

LAYER
    ...
    CONNECTIONTYPE oraclespatial
    DATA "MYGEOMETRY FROM MYTABLE USING UNIQUE MYTABLE_ID"
    ...
END
例3

此选项是第一个选项的扩展。在此模式下,当数据中的srid值与空值不同时,必须定义using srid参数。

LAYER
    ...
    CONNECTIONTYPE oraclespatial
    DATA "MYGEOMETRY FROM MYTABLE USING SRID 90112"
    ...
END
例4

此选项是示例2和3的组合。

LAYER
    ...
    CONNECTIONTYPE oraclespatial
    DATA "MYGEOMETRY FROM MYTABLE USING UNIQUE MYTABLE_ID SRID 90112"
    ...
END

在数据语句中使用嵌套select

可以将日期的来源定义为子选项,而不仅仅是表。作为在From令牌中使用的数据源,您可以定义返回SDO几何体的任何SQL、表、函数或运算符。例如:

DATA "[geom_column] FROM (SELECT [columns] FROM [table]|[Spatial function])"

如果层定义包含classitem、labelitem或filter,则需要通过查询返回所使用的字段。定义类项时,可以使用表达式而不会出现任何问题。

附加关键字-[函数]

您可以为影响将在Oracle中执行的查询的[函数]选项的数据语句添加三个关键字:

使用滤波器
"[geom_column] FROM [table]|([Subselect]) USING FILTER"

使用此关键字将触发MapServer以使用Oracle Spatial SDO_筛选器运算符。此运算符仅对查询数据执行Oracle空间主筛选器。在Oracle用户指南中,他们解释道:主过滤器比较几何近似值,它返回精确结果的超集。因此,初级过滤器应尽可能高效(即,有选择性但速度快)。此运算符使用空间索引,因此需要正确定义空间索引以检索准确的结果。如果查询结果不准确,可以尝试下一个选项。

使用关联
"[geom_column] FROM [table]|([Subselect]) USING RELATE"

使用此关键字将触发MapServer以使用Oracle Spatial SDO_Relate运算符。此运算符应用主Oracle空间过滤器和辅助Oracle空间过滤器。它的性能可以稍微慢一点,但结果是非常正确的。当你想要一个完美的结果或者你不能重新调整空间索引时,你可以使用这个模式。

使用geomrelate
"[geom_column] FROM [table]|([Subselect]) USING GEOMRELATE"

使用此关键字可触发mapserver使用几何函数sdo_geom.relate,该函数用于搜索几何体之间的关系。sdo-geom.relate不使用空间索引,您的性能比操作员慢,但非常准确。当不能使用空间索引或空间索引不存在时,可以使用此模式。

不使用
"[geom_column] FROM [table]|([Subselect]) USING NONE"

使用此关键字将触发MapServer不使用任何几何函数或空间运算符。因此,内部SQL不会根据范围限制来自源的数据。所有来自源的数据都将返回到MapServer。当数据源不包含任何空间索引时,NONE标记非常有用。它通常发生在源函数如SDO_BUFFER、SDO_XOR、SDO_INTERSECTION。。。。。。因此,当无法使用空间索引或空间索引不存在时,建议使用此模式。

其他关键字-[版本]

可以定义用于改进内部SQL的数据库版本。这在使用大地测量SRID和从数据中检索范围的MapServer函数时非常有用。

使用8i版
"[geom_column] FROM [table]|([Subselect]) USING VERSION 8i"

这表示MapServer使用与Oracle8i版本兼容的内部SQL。

使用9i版
"[geom_column] FROM [table]|([Subselect]) USING VERSION 9i"

第二个指示mapserver使用9i版本,如果使用9i版本,建议使用此参数,因为内部SQL将使用特定的空间函数,这些函数需要从9i Oracle空间版本正确检索数据。

使用10G版
"[geom_column] FROM [table]|([Subselect]) USING VERSION 10g"

这表示MapServer使用与Oracle10g版本兼容的内部SQL。

更多信息

  • 你可以定义任何 PROJECTION 对你 LAYER 毫无问题,可以用于Oracle中带有或不带有SRID的数据。

  • Oracle Spatial的本机支持数据库中SDO_几何图形的默认定义,即Oracle Spatial SDO包。

  • 有关主Oracle空间过滤器和辅助Oracle空间过滤器的信息,请参阅《Oracle空间用户指南》(“查询模型”部分)。有关sdo ou filter和sdo ou relate操作符的信息可以在“空间操作符”部分找到,有关sdo ou geom.relate函数的信息可以在Oracle空间用户指南的“几何函数”部分找到。

层的示例

LAYER
    NAME kwadranten
    TYPE POLYGON
    CONNECTIONTYPE oraclespatial
    CONNECTION "user/pwd"
    DATA "GEOMETRIE FROM KWADRANTEN USING SRID 90112"
    CLASS
        STYLE
            OUTLINECOLOR 0 0 0
            COLOR 0 128 128
        END
    END
END

您可以为数据库指定sid,sid别名需要在Oracle客户机的tnsnames.ora文件中提供,例如。

tnsnames.ora示例:

MYDB =
    (DESCRIPTION =
        (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = server_ip)(PORT = 1521))
        )
        (CONNECT_DATA =
            (SERVICE_NAME = DB1)
        )
    )

因此,在此之后,可以将层连接定义为:

CONNECTION "user/pwd@MYDB"

用于OGR Oracle空间支持的映射文件语法

映射文件的语法:

CONNECTION "OCI:user/pwd@service"
CONNECTIONTYPE OGR
DATA "Tablename"

备注

确保为该层设置了wms扩展数据块元数据,否则“getCapabilities”请求将花费大量时间。