シンプルフィーチャーのためのZM値とSRID

この文書は、PostGISに添付されるドキュメントのひとつであるZMSgeoms.txtを翻訳したものです。「改訂提案」とありますが、PostGISのEWKT, EWKBに関する技術資料とみなすことができます。

タイトル
シンプルフィーチャーのためのZM値とSRID
著者
Sandro Santilli
日付
2005年11月27日
区分
シンプルフィーチャー改訂提案

1. 背景

OpenGIS 99-402r2文書では、ZジオメトリのセマンティクスとWell-Known表現について紹介されています。この提案は、Well-Known表現を任意にM値(「測定された(measured)」値)やSRIDを持てるように拡張するものです。M値はZ値のように2次元頂点の属性ですが、M値のセマンティックはこの文書では特に指定しません。さまざまな種類の「測定」に使われえるからです。SRIDは全体のフィーチャーの属性です。

この文書では、既存の2次元OpenGISシンプルフィーチャー仕様およびOpenGIS 99-402r2文書に記述されているZジオメトリとの互換性を持つ方法によって、Z値やM値、または両方を持ち、かつSRIDを持つことができるようにする方法を定義します。

2. 提案

2.1. ZMジオメトリ

ZMジオメトリの定義は次の通りです。

  1. 2,3,4次元のいずれかである。
  2. 3次元ジオメトリの3番目の次元がZまたはMを持つ(それぞれ3DZ, 3DM)。
  3. 4次元ジオメトリはZとMの両方を(この順番で)持つ。
  4. M値とZ値は全ての頂点と関係する。
  5. M値とZ値はサーフェス内部では定義されない。

あらゆるZMジオメトリはZ値とM値を捨てることで2次元ジオメトリに変換できます。結果として出てくる2次元ジオメトリは、ZMジオメトリの「影」です。2次元ジオメトリは安全にZMジオメトリに変換されるものではありません。Z値とM値が定義されてなく、必ずしも0になるわけではないためです。

2.2. Well-Knownバイナリ書式への拡張

2次元OpenGISシンプルフィーチャー仕様には、次のジオメトリ型があります。

enum wkbGeometryType {
	wkbPoint = 1,
	wkbLineString = 2,
	wkbPolygon = 3,
	wkbMultiPoint = 4,
	wkbMultiLineString = 5,
	wkbMultiPolygon = 6,
	wkbGeometryCollection = 7
}

99-402r2文書では、Z軸の存在を指定する型にビットORを施すための、Z存在フラグ(wkbZ)が紹介されています。

	wkbZ = 0x80000000

この提案では、M存在フラグ(wkbM)を使ってXY,XYM,XYZ,XYZMジオメトリに対応 できるようにし、SRID存在フラグを使ってSRIDを組み込めるようにすることを 提案します。

	wkbM = 0x40000000
	wkbSRID = 0x20000000

これらから、存在しえる型は次の通りです。

enum wkbGeometryTypeZ {

	wkbPoint = 1,
	wkbLineString = 2,
	wkbPolygon = 3,
	wkbMultiPoint = 4,
	wkbMultiLineString = 5,
	wkbMultiPolygon = 6,
	wkbGeometryCollection = 7,

	// | 0x80000000
	wkbPointZ = 0x80000001,
	wkbLineStringZ = 0x80000002,
	wkbPolygonZ = 0x80000003,
	wkbMultiPointZ = 0x80000004,
	wkbMultiLineStringZ = 0x80000005,
	wkbMultiPolygonZ = 0x80000006,
	wkbGeometryCollectionZ = 0x80000007,

	// | 0x40000000
	wkbPointM = 0x40000001,
	wkbLineStringM = 0x40000002,
	wkbPolygonM = 0x40000003,
	wkbMultiPointM = 0x40000004,
	wkbMultiLineStringM = 0x40000005,
	wkbMultiPolygonM = 0x40000006,
	wkbGeometryCollectionM = 0x40000007,

	// | 0x40000000 | 0x80000000
	wkbPointZM = 0xC0000001,
	wkbLineStringZM = 0xC0000002,
	wkbPolygonZM = 0xC0000003,
	wkbMultiPointZM = 0xC0000004,
	wkbMultiLineStringZM = 0xC0000005,
	wkbMultiPolygonZM = 0xC0000006,
	wkbGeometryCollectionZM = 0xC0000007,

	// | 0x20000000 
	wkbPointS = 0x20000001,
	wkbLineStringS = 0x20000002,
	wkbPolygonS = 0x20000003,
	wkbMultiPointS = 0x20000004,
	wkbMultiLineStringS = 0x20000005,
	wkbMultiPolygonS = 0x20000006,
	wkbGeometryCollectionS = 0x20000007,

	// | 0x20000000 | 0x80000000
	wkbPointZS = 0xA0000001,
	wkbLineStringZS = 0xA0000002,
	wkbPolygonZS = 0xA0000003,
	wkbMultiPointZS = 0xA0000004,
	wkbMultiLineStringZS = 0xA0000005,
	wkbMultiPolygonZS = 0xA0000006,
	wkbGeometryCollectionZS = 0xA0000007,

	// | 0x20000000 | 0x40000000
	wkbPointMS = 0x60000001,
	wkbLineStringMS = 0x60000002,
	wkbPolygonMS = 0x60000003,
	wkbMultiPointMS = 0x60000004,
	wkbMultiLineStringMS = 0x60000005,
	wkbMultiPolygonMS = 0x60000006,
	wkbGeometryCollectionMS = 0x60000007,

	// | 0x20000000 | 0x40000000 | 0x80000000
	wkbPointZMS = 0xE0000001,
	wkbLineStringZMS = 0xE0000002,
	wkbPolygonZMS = 0xE0000003,
	wkbMultiPointZMS = 0xE0000004,
	wkbMultiLineStringZMS = 0xE0000005,
	wkbMultiPolygonZMS = 0xE0000006,
	wkbGeometryCollectionZMS = 0xE0000007,
}

SRIDフラグがセットされる場合、SRIDの値は4バイト整数として、タイプを示 す整数の次に来ます。

wkbZまたはwkbMフラグのみセットされる場合、ポイントの座標はXYZまたはXYM です。wkbZとwkbMの両方のフラグがセットされる場合、ポイントの座標はXYZM (Zが先です)です。

たとえば、(10,20)の位置にあり、Z==30, M==40, SRID==4326となるZMポイン トジオメトリは次のようになります。

WKBPoint {

	byte    byteOrder;      // wkbXDR or wkbNDR

	uint32  wkbType;        // (wkbPoint+wkbZ+wkbM+wkbSRID) =
			        // 0xE0000001

	uint32  SRID;           // 4326

	Point {
		Double    x;    // 10.0
		Double    y;    // 20.0
		Double    z;    // 30.0
		Double    m;    // 40.0
	}
}

2.3. Well-Knownテキスト書式への拡張

ジオメトリSRIDが存在することとその値は、WKTテキストの前に"SRID=#;"を置 くことで表現されます。次のようになります。

	"SRID=4326;POINT(1 2)"

3DZジオメトリは次のように表現されます。

	"POINT(1 2 3)"

4次元ジオメトリは次のように表現されます。

	"POINT(1 2 3 4)"

3DMジオメトリは次のように表現されます。

	"POINTM(1 2 3)"
	または
	"GEOMETRYCOLLECTIONM(POINTM(1 2 3), LINESTRINGM(1 2 3, 4 5 6))"

ジオメトリの座標構造は一貫なければならず、単一のジオメトリに複数の次元を混合させることはできないことに注意してください。