GeoJsonデータについて

GeoJson仕様(Internet Engineering Task Force)は、地形(ジオメトリ)を表すjsonオブジェクトの構造およびコンテンツを定義します。Oracle NoSQL Databaseには、このようなjsonオブジェクトをジオメトリとして解釈し、特定の条件を満たすジオメトリを含む行を検索できる複数の関数が実装されています。検索は、特殊な索引を使用して効率的に実行されます。

GeoJson仕様によれば、jsonオブジェクトがジオメトリ・オブジェクトになるためには、typeおよびcoordinatesという2つのフィールドを持つ必要があります。ここで、typeフィールドの値はジオメトリの種類を指定し、coordinatesの値は、要素がジオメトリの形状を定義する配列である必要があります(GeometryCollectionの種類は、以下で説明するようにこのルールの例外です)。typeフィールドの値は、7種類のジオメトリ・オブジェクトに対応する7つの文字列(Point、LineSegment、Polygon、MultiPoint、MultiLineString、MultiPolygon、GeometryCollection)のいずれかにする必要があります。coordinatesの値はジオメトリの種類によって異なりますが、すべての場合で多数の位置によって構成されています。位置は、2つの倍精度浮動小数点数の配列で地表の位置を指定します。ここで1番目の数値と2番目の数値は、それぞれその位置の経度と緯度です(GeoJsonでは位置の高度が3番目の座標として許可されますが、Oracle NoSQL Databaseでは高度はサポートされません)。経度と緯度は度数で指定され、それぞれ-180から+180までの範囲と-90から+90までの範囲である必要があります。

7種類のジオメトリ・オブジェクトを次のように定義します(それぞれの例を示します)。

Point
タイプがPointの場合、coordinatesフィールドは単一の位置です。
{ "type" : "point", "coordinates" : [ 23.549, 35.2908 ] }
LineString
LineStringは1つ以上の接続された線で、ある線の終了点が次の線の開始点になります。coordinatesのメンバーは2つ以上の位置の配列です。1番目の位置は1番目の線の開始点で、後続の各位置は現在の線の終了点と次の線の開始点です。線は相互に交差することがあります。
{
"type" : "LineString",
"coordinates" : [ [121.9447, 37.2975],
[121.9500, 37.3171],

[121.9892, 37.3182],
[122.1554, 37.3882],
[122.2899, 37.4589],
[122.4273, 37.6032],
[122.4304, 37.6267], 
[122.3975, 37.6144]
]
}
Polygon
polygonは、外側の境界線および領域内の潜在的なホールの境界線を指定することによって、表面を定義します。より正確には、ポリゴンは1つ以上の線形リングで構成され、(a)線形リングは4つ以上の位置を持つクローズされたLineStringであり、(b)最初と最後の位置は同等で同じ値が含まれている必要があり、(c)線形リングは表面の境界、または表面のホールの境界で、(d)線形リングは隣接する領域に関して右手の法則に従う必要があります。つまり、外部リングの場合はその位置が反時計回りに配置され、ホールの場合はその位置が時計回りに配置される必要があります。次に、ポリゴンのcoordinatesフィールドを線形リング座標配列の配列にし、最初の座標を外部リング、その他の座標を内部リングにする必要があります。外部リングが表面の境界となり、内部リング(存在する場合)が表面内のホールの境界となります。次の例は、ホールのないポリゴンを示しています。
{
"type" : "polygon",
"coordinates" : [ [
[23.48, 35.16],
[24.30, 35.16],
[24.30, 35.50],
[24.16, 35.61],
[23.74, 35.70],
[23.56, 35.60],
[23.48, 35.16]
]
]
}
MultiPoint
タイプがMultiPointの場合、coordinatesフィールドは2つ以上の位置の配列です。
{
"type" : "MultiPoint",
"coordinates" : [ [-121.9447, 37.2975],
[-121.9500, 37.3171],
[-122.3975, 37.6144]
]
}
MultiLineString
タイプがMultiLineStringの場合、coordinatesのメンバーはLineString座標配列の配列です。
{
"type": "MultiLineString",
"coordinates": [
[ [100.0, 0.0], [01.0, 1.0] ],
[ [102.0, 2.0], [103.0, 3.0] ]
]
}
MultiPolygon
タイプがMultiPolygonの場合、coordinatesのメンバーはPolygon座標配列の配列です。
{
"type": "MultiPolygon",
"coordinates": [
[
[
[102.0, 2.0],
[103.0, 2.0],
[103.0, 3.0],
[102.0, 3.0],
[102.0, 2.0]
]
],
[
[
[100.0, 0.0],
[101.0, 0.0],
[101.0, 1.0],
[100.0, 1.0],
[100.0, 0.0]
]
]
]
}
GeometryCollection
GeometryCollectionにはcoordinatesフィールドのかわりに、geometriesフィールドがあります。geometriesの値は配列です。この配列の各要素はGeoJSONオブジェクトであり、このオブジェクトの種類は前述の6種類のいずれかです。そのため、一般にGeometryCollectionは、異種ジオメトリ構成です。
{
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [100.0, 0.0]
},
{
"type": "LineString",
"coordinates": [ [101.0, 0.0], [102.0, 1.0] ]
}
]
}

GeoJson仕様では、FeatureおよびFeatureCollectionと呼ばれるエンティティの2つの追加の種類が定義されており、ジオメトリと他のジオメトリ以外のプロパティを組み合せることができます。仕様では、前述の定義を使用するか、FeatureまたはFeatureCollectionを使用します。FeatureとFeatureCollectionは、次のように定義されます。

Feature
Featureオブジェクトには、値がFeatureのtypeメンバーが含まれます。Featureオブジェクトには、geometryメンバーがあり、その値は前述の7種類のジオメトリ・オブジェクト、またはJSON null値です。Featureオブジェクトにはpropertiesメンバーがあり、その値はJSONオブジェクトまたはJSON null値です。
FeatureCollection
FeatureCollectionオブジェクトには、値がFeatureCollectionのtypeメンバーが含まれます。FeatureCollectionオブジェクトにはfeaturesメンバーがあり、その値はJSON配列です。配列の各要素は、前述の定義どおりFeatureオブジェクトです。この配列は空にできます。