web-dev-qa-db-ja.com

ジオメトリ列のSRID0とは何ですか?

そこで、ジオメトリ列を空間テーブルに追加し、msdn参照のいくつかを使用して、次のようにSRIDを0として指定することになりました。

  update dbo.[geopoint] set GeomPoint = geometry::Point([Longitude], [Latitude], 0) 

ただし、これは間違いだったと思いますが、列を更新する前に、0は実際にはデフォルト= 4326ですか?クエリでSRIDを0として指定している限り、クエリは機能しますが、私が持っている地理フィールドと比較して奇妙な結果が得られます... SRID 0はsys.spatial_reference_systemsに存在せず、できませんでしたそれに関する情報を掘り起こす。どんな助けでもいただければ幸いです。

12
zach

SRID 0は技術的には存在しません。つまり、SRIDがないことを意味します。つまり、設定を忘れた場合のデフォルトです。したがって、技術的には、ジオメトリの両方のセットのSRIDが0である限り、距離、交差、およびその他すべてのクエリを実行できます。SRIDが0のジオメトリのフィールドと実際に存在するSRIDのセットがある場合、おそらく非常に奇妙な結果が得られます。まさにこの状況で空間クエリから結果が得られず、SQL Serverが文句を言わず、結果が0であったときに、頭をかいたことを覚えています(Postgisが実際に失敗し、SRIDが一致しないという警告が表示されます)。

私の意見では、ジオメトリ(または、当然は常に4326になるジオメトリ)のSRIDを常に明示的に設定する必要があります。これは、奇妙なクエリ結果を防ぐだけでなく、ある座標系から別の座標系に変換できることを意味します。緯度/経度(4326)から球形メルカトル図法(3857)にオンザフライで変換できます。これは、メートル単位のGoogle Maps/Bing、または27700、British NationalGridなどのローカル座標系で使用されます。メートル単位で、非常に便利です。 SQL Serverは、私の知る限り、あるSRIDから別のSRIDへの変換をサポートしていませんが、空間型は基本的にCLR型であるため、必要に応じて.NETライブラリを利用できます。 1つのジオメトリからジオメトリを変換/投影する)を参照してください。別のSRID 例として。

ジオメトリを変更することにした場合は、次のようなことができます。

UPDATE your_table SET newGeom = geometry::STGeomFromWKB(oldGeom.STAsBinary(), SRID);

これにより、新しい列が作成されるか、適切に実行されます。

UPDATE geom SET geom.STSrid=4326;

ここで、4326はSRIDの単なる例です。

SRIDの適切なリファレンスは http://spatialreference.org/ にありますが、これは基本的にsys.spatial_reference_systemsにある情報と同じです。

20
John Powell

SRIDは、測定している距離が平らで無限の平面ではなく、長方形の回転楕円体であることを考慮に入れる方法です。これらは地理データ型には意味がありますが、ジオメトリには意味がありません。したがって、地理計算を行う場合(「私が持っている地理フィールドと比較して」のステートメントとして)、ジオメトリポイントの代わりに地理ポイントを作成します。地理空間データを計算するには(「このポイントからこの別のポイントまでの距離を見つける」など)、関係するすべてのオブジェクトのSRIDが同じである必要があります。

TL; DR:ポイントはデカルト平面上にありますか?ジオメトリを使用します。ポイントは地球上ですか?地理を使用します。

0
Ben Thul