私はこのようなPostgres/PostGISステートメントを読んでいました:
SELECT ST_AsBinary(
ST_GeomFromWKB(
E'\\001\\001\\000\\000\\000\\321\\256B\\312O\\304Q\\300\\347\\030\\220\\275\\336%E@',
4326
)
);
上記は、Well Known Binary(WKB)から何かを作成します。文字列が最初の引用符の前にE
を付けて単一引用符で囲まれている、ここでの引用の具体的な方法を見たことはありません。
このフォーマットは何と呼ばれていますか?そして、これのフォーマットルールは何ですか?例えばそれは 336%E@
最後の特別な、または単にバイナリ値ですか?
これはPostgres9.3/9.4の場合です。 PostGIS 2.1。
PostgreSQLのドキュメントに従って http://www.postgresql.org/docs/9.0/static/sql-syntax-lexical.html (鉱山を強調)
PostgreSQLは、SQL標準の拡張である「エスケープ」文字列定数も受け入れます。 エスケープ文字列定数は、開始の単一引用符の直前に
E
(大文字または小文字)の文字を書くことによって指定されます。たとえば、E'foo'
。 (行全体でエスケープ文字列定数を継続する場合は、最初の引用符の前にのみE
を記述します。)エスケープ文字列内で、バックスラッシュ文字(\
)はCのようなバックスラッシュエスケープシーケンスを開始します。バックスラッシュとそれに続く文字の組み合わせが特別なバイト値を表す
文字列で\\
を使用することは、エスケープシーケンスをエスケープしていることを意味します。これは、転送中および.sql
ファイルへの格納で安全であるためです。実際にST_GeomFromWKB
関数に渡されるverbatim文字列は次のようになります。
\001\001\000\000\000\321\256B\312O\304Q\300\347\030\220\275\336%E@
これらのスラッシュ間の3または4文字のシーケンスは、ST_GeoFromWKB
によって直接解釈されます。
ST_GeoFromWKB
( http://postgis.org/docs/ST_GeomFromWKB.html )のドキュメントには次のように記載されています:
ST_GeomFromWKB
関数は、ジオメトリの既知のバイナリ表現と空間参照システムID(SRID
)を取り、適切なジオメトリタイプのインスタンスを作成します。この関数は、SQLのジオメトリファクトリの役割を果たします。これはST_WKBToSQL
の別名です。
残念ながら、実際には「よく知られているバイナリ表現」がどのような形式であるかは明記されていません。
文字列の内容は、SRID
パラメータで指定されている使用している座標系に依存することがわかります。この場合、4326
はWGS84
に対応します: https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84
それを解くには、さらに読み、調査する必要があります。
seeは16進数のようには見えません。なぜなら、 bytea
string literalは エスケープ文字列構文 にあります(最近ではかなり古くなっています)。
_E'\\001\\001\\000\\000\\000\\321\\256B\\312O\\304Q\\300\\347\\030\\220\\275\\336%E@'
_
「標準準拠文字列」と同じ:
_'\001\001\000\000\000\321\256B\312O\304Q\300\347\030\220\275\336%E@'
_
どちらも "エスケープ形式" であり、 "16進形式" でより効率的に表すことができます。
_'\x0101000000d1ae42ca4fc451c0e71890bdde254540'
_
encode()
およびdecode()
を使用して、1つのフォームを別のフォームに変換できます。
フォローアップの質問にgis.SE で詳細に回答しました。