GeoJsonデータの索引付け

GeoJsonデータの索引付けは、他のjsonデータの索引付けと同様です。GeoJsonの場合、ジオメトリ・オブジェクトへの索引パスの後にGEOMETRYまたはPOINTキーワードを使用する必要があります。POINTは、表内のすべての行で索引付きフィールドに単一点ジオメトリがあることが予想されている場合にのみ使用します(この場合は、GEOMETRYを使用することもできますが、パフォーマンスを改善するためにPOINTをお薦めします)。他のjsonデータの場合と同様、一部の行の索引パスの値が有効なGeoJsonポイントまたはジオメトリでない場合、値がNULL、json null、またはEMPTYでないかぎりエラーが発生します。

ジオメトリ・オブジェクトへのパスを含む索引は、ジオメトリ索引と呼ばれます。ジオメトリ索引は、その他のフィールドも索引付けできますが、いくつかの制限があります。(a)ジオメトリ索引では、複数のGeoJsonフィールドを索引付けできません。(b) POINTフィールドである場合を除き、GeoJsonフィールドを配列に含めることはできません。(c) GeoJsonフィールドがPOINTフィールドであり、索引付けされる配列またはマップがPOINTフィールドを含む場合を除き、ジオメトリ索引を複数キー索引にすることはできません。

ジオメトリの索引付けは、ジオハッシュに基づきます。ジオハッシュは、経度/緯度のペアの文字列へのエンコーディングです。これは、2次元の経度/緯度座標系をセルと呼ばれる長方形の階層に再帰的にパーティション化することで機能します。最初の(レベル0)セルは全世界です。つまり、-180から+180の経度と-90から+90の緯度を持つすべてのポイントです。最初の(レベル0)分割では、次の図に示す32個のレベル1セルが作成されます。各セルには名前が割り当てられます。これは、32-char-long string G = "0123456789bcdefghjkmnpqrstuvwxyz"からの文字です。この名前は、セルのジオハッシュと呼ばれます。

図10-4 32個のレベル1ジオハッシュ・セル

図10-4の説明が続きます
「図10-4 32個のレベル1ジオハッシュ・セル」の説明

次(レベル1)の分割では、レベル1の各セルを32個のレベル2セルに分割します。次の図は、gセル内のレベル2のセルをすべて示しています。

図10-5 レベル1およびレベル2のジオハッシュ・セル

図10-5の説明が続きます
「図10-5 レベル1およびレベル2のジオハッシュ・セル」の説明

ここで示されているように、レベル2の各ジオハッシュは2文字長で、1番目の文字は親セルのジオハッシュ、2番目の文字は同じ文字セットから取得されます。このプロセスは、ジオハッシュ長と呼ばれる特定のレベルLまで処理されます。偶数の分割では、各セルが8つの垂直スライスと4つの水平スライスに分割されます。奇数の分割では、各セルが4つの垂直スライスと8つの水平スライスに分割されます。どちらの場合も、32個の各サブセルについて、接頭辞として親セルのジオハッシュを使用し、Gから文字を付加して、ジオハッシュを形成します。各サブセルの余分な文字は、前出の偶数分割と奇数分割の両方の図で示されているのと同じ方法で選択されます。

Oracle NoSQL Databaseでは、ジオハッシュ長として10を使用します。レベル10のセルには、約1m四方の領域があります。ポイントに索引付けすると、そのポイントを含むレベル10のセルが計算され、そのセルのジオハッシュが索引エントリに配置されます。そのため、ポイントの場合は、各ポイントに対して単一の索引エントリが生成されます。POINTフィールド自体が索引付けされる配列またはマップ内にある場合を除き、POINTフィールド上のジオメトリ索引は単純(非複数キー)索引と同様に動作します。レベル10の同じセル内のすべてのポイントが同じジオハッシュを持つことに注意してください。

前述したジオ的ハッシュ・アルゴリズムを使用すると、通常、相互に近いポイント(ただし常にではない)がジオメトリ索引内でも近くなります。つまり、共通の長い接頭辞を持つことになります。したがって、前の項で説明した関数の1つを使用してポイントを検索すると、ジオメトリ索引の1つ以上の範囲スキャンに変換されます。これらの範囲スキャンでは偽陽性が返される可能性があるため、索引スキャンによって返される行に検索関数自体を適用して、偽陽性を排除する必要があります。

LineStringまたはPolygonを索引付けする場合、ジオメトリの最小境界ボックス(MBR)が最初に計算され、次にMBRを完全にカバーするセルのセットが検出されます。カバーするセルのレベルは、MBRのサイズと形状および位置によって異なります(通常は10未満)。次に、そのセルのジオハッシュを含む各変換セルに対して索引エントリが作成されます。そのため、LineStringまたはPolygonのジオメトリ索引は、常に複数キー索引になります。これは、単一の行に複数の索引エントリが作成されるためです。MultiPoints、MultiLineStrings、MultiPolygons、およびGeometryCollectionsの各構成ジオメトリが個別に索引付けされ、そのジオメトリに対する索引も複数キー索引になります。