空间数据库¶
- 作者
巴特·范登·艾金登
- 作者
杰夫麦克纳
- 联系
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 的语句 LAYER 的 CONNECTIONTYPE 预言空间现在可以有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”请求将花费大量时间。