PHPでのOracle利用(9)

前回の問題解決
…原因はスペルミスorz
USER_SDO_GEOM_METADATAに追加していたエントリーのジオメトリカラム名称を間違えていただけでした。geomをgoemとか書いてた…。これじゃジオムじゃなくてゴエム(笑

INSERT INTO user_sdo_geom_metadata
(TABLE_NAME,
COLUMN_NAME,
DIMINFO,
SRID)
VALUES (
'gis_t',
'geom',
SDO_DIM_ARRAY(
SDO_DIM_ELEMENT('X', 0, 20, 0.005),
SDO_DIM_ELEMENT('Y', 0, 20, 0.005)
),
NULL);

最後の要素は、矢張りジオメトリの設定

SDO_DIM_ELEMENT('X', 0, 20, 0.005)

XはXX〜XXまでの範囲でX.XXXの整合性を持つ…という定義
予め空間の範囲を設定しなければならないらしい
MySQLPostGISでは桁とか違ったが、Oracleは自由に設定できるらしい。いや、流石

改めて、索引作成から検索を行ってみる

CREATE INDEX gis_sp_index ON gis_t(geom)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;

改めて名称を正しい物に修正して索引作成

索引が作成されました

成功
続いて空間検索してみる
条件式はDB内に格納されているデータと同じもの。正しく動作したのならばDB内の全てのデータが返されるはず
構文は前回ままに

SELECT SDO_UTIL.TO_WKTGEOMETRY(geom) FROM gis_t 
WHERE SDO_FILTER(
geom,
SDO_UTIL.FROM_WKTGEOMETRY(
'POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))'
))='TRUE';

実行結果

SDO_UTIL.TO_WKTGEOMETRY(GEOM)
--------------------------------------------------------------------------------
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0))

成功
次は、色々なデータを放り込んで「hitするデータhitしないデータ」の動きを見てみる
後、「範囲内に収まっていないはみ出した空間」がどう扱われるのかもテストしなければ