H2 中 运行 空间查询的语法是什么?
What is the syntax for running a spatial query in H2?
我正在考虑在某些 GIS 处理任务中使用嵌入式 H2 数据库。我在他们的网站上注意到他们支持 JTS 几何和空间索引:
http://www.h2database.com/html/grammar.html#create_index
http://www.h2database.com/html/datatypes.html#geometry_type
但是,我无法找到使用几何/边界框的查询。 H2 在 Oracle ( http://docs.oracle.com/cd/A97630_01/appdev.920/a96630/sdo_operat.htm#BJAFBCFC ) 中有类似 SDO_FILTER 的东西吗?如果不是,我是否误解了此功能的用途?
我知道有一个单独的 H2 空间插件(http://www.h2gis.org/),但是没有这个可以进行简单的空间查询吗?
目前仅使用 h2 的空间查询仅限于使用几何边界框过滤行。
空间特征
当提供 JTS Topology Suite jar 时,H2 能够处理几何类型和空间索引。
下载JTS 1.13并放在h2 bin目录下
然后编辑 h2.sh:
#!/bin/sh
dir=$(dirname "[=10=]")
java -cp "$dir/h2-1.4.178.jar:jts-1.13.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console "$@"
运行 sh, 将打开web控制台。
此处 SQL 创建空间 table:
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 运算符。它将进行几何 envelope 交集测试:
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))')
如果 table 不是内存 table,则空间索引存储在磁盘上。否则会存入内存
我正在考虑在某些 GIS 处理任务中使用嵌入式 H2 数据库。我在他们的网站上注意到他们支持 JTS 几何和空间索引:
http://www.h2database.com/html/grammar.html#create_index http://www.h2database.com/html/datatypes.html#geometry_type
但是,我无法找到使用几何/边界框的查询。 H2 在 Oracle ( http://docs.oracle.com/cd/A97630_01/appdev.920/a96630/sdo_operat.htm#BJAFBCFC ) 中有类似 SDO_FILTER 的东西吗?如果不是,我是否误解了此功能的用途?
我知道有一个单独的 H2 空间插件(http://www.h2gis.org/),但是没有这个可以进行简单的空间查询吗?
目前仅使用 h2 的空间查询仅限于使用几何边界框过滤行。
空间特征
当提供 JTS Topology Suite jar 时,H2 能够处理几何类型和空间索引。
下载JTS 1.13并放在h2 bin目录下
然后编辑 h2.sh:
#!/bin/sh
dir=$(dirname "[=10=]")
java -cp "$dir/h2-1.4.178.jar:jts-1.13.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console "$@"
运行 sh, 将打开web控制台。
此处 SQL 创建空间 table:
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 运算符。它将进行几何 envelope 交集测试:
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))')
如果 table 不是内存 table,则空间索引存储在磁盘上。否则会存入内存