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


9

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


:あなたは、おそらくこのaが読み与えることができます stackoverflow.com/questions/159255/...
codedawg82

回答:


14

コンストラクター構文

見上げる空間関数参照を、あなたが表示されます

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

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

これは、地理情報の仕様OpenGIS®実装標準で触れられています-シンプルな機能アクセス-パート2:SQLオプション

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

上記の単語は地理情報-座標参照系のよく知られたテキスト表現に逐語的に見られることに注意してください

さえにまでさかのぼる1.1の仕様として、

空間参照系は、座標系とも呼ばれ、地理(緯度-経度)、投影(X、Y)、または地心(X、Y、Z)座標系です。

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

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

また、(緯度、経度)の順序はEPSGでSRSID 4326に対して明示的に定義されています。

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

「Let's Call the Whole Thing Off」というタイトルの付いたこのテーマに関するPaul Ramsey(キャプテンPostGIS)のブログをチェックすることも検討してください。

ニシティ

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

これらの関数はから離れST_X()ST_Y()おり、地理的なSRS を必要とするか、例外とエラーをスローします。

ストレージ

ドキュメントから

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

0

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

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));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.