我正在考虑在某些GIS处理任务中使用嵌入式H2数据库。我在他们的网站上注意到他们支持JTS几何和空间索引:
http://www.h2database.com/html/grammar.html#create_index http://www.h2database.com/html/datatypes.html#geometry_type
但我无法使用几何/边界框查找查询。 H2中是否有类似SDO_FILTER的内容(http://docs.oracle.com/cd/A97630_01/appdev.920/a96630/sdo_operat.htm#BJAFBCFC)?如果没有,我是否误解了此功能的目的?
我知道H2(http://www.h2gis.org/)有一个单独的空间插件,但是没有这个可以进行简单的空间查询吗?
答案 0 :(得分:4)
目前仅使用h2的空间查询仅限于使用几何边界框过滤行。
当提供JTS Topology Suite jar时,H2能够处理几何类型和空间索引。
下载JTS 1.13并将其放在h2 bin目录中。
然后编辑h2.sh:
#!/bin/sh
dir=$(dirname "$0")
java -cp "$dir/h2-1.4.178.jar:jts-1.13.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console "$@"
运行sh,将打开Web控制台。
这里用SQL创建一个空间表:
CREATE TABLE GEOTABLE( GID SERIAL, THE_GEOM GEOMETRY);
INSERT INTO GEOTABLE(THE_GEOM) VALUES ('POINT(500 505)');
INSERT INTO GEOTABLE(THE_GEOM) VALUES ('LINESTRING(550 551, 525 512, 565 566)');
INSERT INTO GEOTABLE(THE_GEOM) VALUES ('POLYGON ((550 521, 580 540, 570 564, 512 566, 550 521))');
为了创建空间索引(RTREE):
CREATE SPATIAL INDEX GEOTABLE_SPATIALINDEX ON GEOTABLE(THE_GEOM);
&&
运算符就像PostGIS运算符一样。它将执行几何包络交点测试:
SELECT * FROM GEOTABLE WHERE THE_GEOM && 'POLYGON ((490 490, 536 490, 536 515, 490 515, 490 490))'
空间索引使用的证据:
EXPLAIN SELECT * FROM GEOTABLE WHERE THE_GEOM && 'POLYGON ((490 490, 536 490, 536 515, 490 515, 490 490))'
简介是:
PUBLIC.GEOTABLE_SPATIALINDEX: THE_GEOM && 'POLYGON ((490 490, 536 490, 536 515, 490 515, 490 490))' WHERE INTERSECTS(THE_GEOM, 'POLYGON ((490 490, 536 490, 536 515, 490 515, 490 490))')
如果表不是内存表,则空间索引存储在磁盘上。否则它将存储在内存中。