どのデータ型への使用を保管する場合は、緯度経度のデータをSQLデータベース?[重複]

StackOverflow https://stackoverflow.com/questions/1196415

質問

格納する時は緯度や経度のデータは、ANSI SQL対応データベース、データ型が最も適切でしょうか。すべ float してください decimal, ど、どのホテルに泊まろうか--?

う意識が、Oracle、MySql、SQLサーバーを追加特別なデータ型の具体的取り扱いに地理データものに興味がある私にとってどのようお店の情報を"普通のバニラ"のSQLデータベースです。

役に立ちましたか?

解決

Decimal(9,6)

あなたは精度とスケールのパラメータに使用されていない場合は、ここでフォーマット文字列のビジュアルです。

###.######

他のヒント

私たちは、floatを使用していますが、小数点以下6桁を持つ数値のいずれかの味も動作するはずです。

、こちらをクリックして下さいたから緯度経度、私の答えは:ながの利用を考える WGS84 (ヨーロッパ ETRS89 では、標準のための地盤の参照です。

その詳細は別に使用したユーザ定義型のSQL2008年の最後にあgeoます。

バニラOracleでは、LOCATOR(空間の不自由バージョン)と呼ばれる機能は、座標データをNUMBER(NO精度)のデータ型を使用して格納されることを必要とします。あなたは、空間クエリをサポートする機能索引を作成しようとすると、それはそれ以外のギャグよ。

簡単代わりに整数と小数部分でそれらを分割し、幾分以下の変換アルゴリズムを使用して、ここで示唆されるように、別々にそれらを格納する、符号なし整数フィールドに緯度/経度小数点数を記憶することができます

格納されたMySQLの関数としての

CREATE DEFINER=`r`@`l` FUNCTION `PositionSmallToFloat`(s INT) 
RETURNS decimal(10,7)
DETERMINISTIC
RETURN if( ((s > 0) && (s >> 31)) , (-(0x7FFFFFFF - 
(s & 0x7FFFFFFF))) / 600000, s / 600000)

バック

CREATE DEFINER=`r`@`l` FUNCTION `PositionFloatToSmall`(s DECIMAL(10,7)) 
RETURNS int(10)
DETERMINISTIC
RETURN s * 600000

unsigned int型に格納する必要があること(10)は、このタイプなしでSQLiteのと同様のMySQLで動作します。

経験を通して、私はすべてあなたが店の座標であるとして、いくつかの計算を行うために、これらを取得するためにする必要がある場合、これは、本当に速く動作することを見つけます。

PHPでこれらの2つの機能は、

のように見えます
function LatitudeSmallToFloat($LatitudeSmall){
   if(($LatitudeSmall>0)&&($LatitudeSmall>>31)) 
     $LatitudeSmall=-(0x7FFFFFFF-($LatitudeSmall&0x7FFFFFFF))-1;
   return (float)$LatitudeSmall/(float)600000;
}

と再びます:

function LatitudeFloatToSmall($LatitudeFloat){
   $Latitude=round((float)$LatitudeFloat*(float)600000);
   if($Latitude<0) $Latitude+=0xFFFFFFFF;
   return $Latitude;
}

これは、例えば、整数とmemcachedのユニークなキーを作成する用語でも同様に、いくつかの付加的な利点を有しています。 (例:ジオコード結果をキャッシュします)。ホープこれは議論に値を追加します。

:あなたはGISの拡張なしで、単にそれらの緯度/経度のペアの数百万を維持したいとき

別のアプリケーションは、あなたは彼らが整数であるという事実から恩恵を受けるためにMySQLでそれらのフィールド上のパーティションを使用することができ、可能性があり

Create Table: CREATE TABLE `Locations` (
  `lat` int(10) unsigned NOT NULL,
  `lon` int(10) unsigned NOT NULL,
  `location` text,
  PRIMARY KEY (`lat`,`lon`) USING BTREE,
  KEY `index_location` (`locationText`(30))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY ()
PARTITIONS 100 */

私はあなたのデータのための適切な精度で小数点を使用することになります。

私はそれはあなたが最も頻繁に行うために必要とされます操作に依存だと思います。

あなたは10進数として完全な値が必要な場合は、

、その後、適切な精度とスケールで小数点を使用しています。フロートは、道のニーズを超えて、私は信じています。

あなたが頻繁にdegºmin'sec「分数表記へ/から変換されます場合は、私は(SMALLINT、SMALLINT、TINYINT、tinyint型?)整数型として各値を格納する検討したい。

あなたは彼らが具体的にタスクのこの種に設計されているSQL Server 2008で導入された新しい空間データ型を見て、インデックスを作成し、データをより簡単に、より効率的な照会ます。

必要があります

http://msdn.microsoft.com /en-us/library/bb933876(v=sql.105).aspxする

ます。http: //blogs.technet.com/andrew/archive/2007/11/26/sql-server-2008-spatial-data-types.aspxする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top