web-dev-qa-db-ja.com

MySQLはポイントデータ型をLAT LNGまたはLNG LATとして格納しますか?

位置形式を緯度に続いて経度として表示するのに慣れていますが、ライブラリを使用して、MySQLを逆順でPOINT(LNG LAT)として保存することを理解していると思います。私のライブラリは間違っていますか、これが実際の形式ですか? MySQLのドキュメントでこの詳細を見つけることができないようです。

9
Lazlo

コンストラクター構文

空間関数リファレンスを調べると、

_Point(x, y)
Constructs a Point using its coordinates
_

これは完全に正しいわけではありません。すべてのGIS実装は、_(x,y)_である投影座標に対して_(long,lat)_を実行する必要があります。しかし、地理座標系では、何をすべきかについていくつかの意見の相違があります。 MySQL(およびSQL Server)は_(lat,long)_を実行しますが、PostGISはどこでも_(long,lat)_を維持します。

これについては、 specOpenGIS®Implementation Standard for Geographic information-Simple feature access-Part 2:SQL option で触れています。 、

  • 楕円の2次元座標系を持つ測地CRSの場合、2次元の楕円座標系の軸は、北向きが正の測地緯度、東向きが正の測地経度です。軸の方向はそれぞれ「北」と「東」です。
  • 3次元楕円体座標系を持つ測地CRSの場合、WKT文字列の水平軸の名前と略語は、(ii)の要件に従う必要があります。縦軸の名前は「楕円体の高さ」でなければなりません。縦軸の省略形は「h」である必要があり、横軸の省略形が含まれている場合は含める必要があります。

上記の単語は、 地理情報-座標参照系の既知のテキスト表現

1.1仕様まで遡って、

空間参照系は、座標系とも呼ばれ、地理(緯度-経度)、投影された(X、Y)、またはジオセントリック(X、Y、Z)座標系。

そうは言っても、PostGISとOracleおよび多くのサードパーティライブラリは、すべてのタイプのポイントに対して_(x,y,[z])_を維持しているようです。これはWKTの仕様に違反していますが、かなり一般的な慣習です。たとえば、 GeoJSONもこれを行います。

ポイント座標は、x、y順です(東座標、投影座標の北座標、地理座標の経度、緯度)。

また、(lat、long)順序は、SRSID 4326の EPSGによって明示的に定義されています。

Geographic CRSで使用される、測地緯度、測地経度、および(3次元の場合は)楕円体の高さによって位置が指定される2Dまたは3D座標系。

この主題に関する Paul Ramsey(Captain PostGIS)のブログ "Let's Call the Whole Thing Off"

ニシティ

特記事項として、MySQLは2つの新しい機能を組み合わせて提供します。

これらの関数は、ST_X()およびST_Y()および地理的SRSのrequireとは別に存在するか、例外をスローし、エラー。

ストレージ

the docs から

内部的に、MySQLはWKTまたはWKB形式と同一ではない形式でジオメトリ値を格納します。 (内部形式はWKBに似ていますが、SRIDを示す最初の4バイトが含まれます。)

ここで格納が定義されます

_Table 11.1 WKB Components Example

Component       Size    Value
Byte order      1 byte  01
WKB type        4 bytes 01000000
X coordinate    8 bytes 000000000000F03F
Y coordinate    8 bytes 000000000000F0BF
_
14
Evan Carroll

順序を確認する簡単な方法は、範囲の緯度を超えて渡すことです。

SELECT ST_Longitude(ST_SRID(POINT(45, 160), 4326));

エラー3732(22S03)が発生します。関数st_sridのパラメーターに、範囲が範囲外の緯度160.000000のジオメトリが含まれています。 [-90.000000、90.000000]の範囲内である必要があります。

使用する機能によって順番が変わる場合がありますのでご注意ください。

SELECT ST_Longitude(ST_SRID(POINT(45, 90), 4326));
SELECT ST_Longitude(ST_GeomFromText('POINT(45 90)', 4326));
0
nfroidure