web-dev-qa-db-ja.com

C#の緯度/経度の値の倍精度または小数

C#で地理位置データを保存するときに使用する最適なデータ型は何ですか?正確さのために10進数を使用しますが、10進浮動小数点数の操作は2進浮動小数点数(倍精度)よりも遅くなります。

ほとんどの場合、緯度または経度に6桁または7桁以上の精度は必要ありません。 doubleの不正確さはその場合でも重要ですか、それを無視できますか?

71
KRTac

二重に行く、いくつかの理由があります。

  • 三角関数はdoubleでのみ使用可能です
  • 倍精度(100ナノメートルの範囲)は、Lat/Lon値に必要なものをはるかに超えています
  • GeoCoordinate Class およびサードパーティのモジュール(例 DotSpatial )も座標にdoubleを使用します
92

Doubleには、最大15桁の精度があります。したがって、緯度/経度の値(最大180度)の場合、これらの数字のうち3桁が小数点の左側にあると仮定します。これにより、右側に12桁の精度が残ります。緯度/経度の程度は〜111kmであるため、この12桁のうち5桁でメーターの精度が得られます。さらに3桁あれば、ミリメートルの精度が得られます。残りの4桁により、約100ナノメートルの精度が得られます。パフォーマンスとメモリの観点からdoubleが勝つため、decimalの使用を検討する理由はありません。

49
MarkPflug

空間プログラミングを始めたとき、私はかなり前にこの質問に直面しました。少し前に本を読んで、これに至りました。

//sql server has a really cool dll that deals with spacial data such like
//geography points and so on. 
//add this namespace
Using Microsoft.SqlServer.Types;

//SqlGeography.Point(dblLat、dblLon、srid)

var lat_lon_point = Microsoft.SqlServer.Types.SqlGeography.Point(lat, lon, 4326);

これは、空間データを使用してアプリケーションで作業する場合の最良の方法です。データを保存するには、これをSQLで使用します

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

それ以外の場合、SQLではない他のものを使用している場合は、ポイントを16進数に変換して保存します。 Spacialを使用して久しぶりに、これが最も安全であることがわかりました。

5
Jonny