ユーザーのリストと Google マップの座標 (経度と緯度) を格納する SQL Server 2008 のテーブルを設計しています。
2 つのフィールドが必要ですか、それとも 1 つでもかまいませんか?
この種のデータを格納するために使用するのに最適な (または最も一般的な) データ型は何ですか?
ユーザーのリストと Google マップの座標 (経度と緯度) を格納する SQL Server 2008 のテーブルを設計しています。
2 つのフィールドが必要ですか、それとも 1 つでもかまいませんか?
この種のデータを格納するために使用するのに最適な (または最も一般的な) データ型は何ですか?
公正警告!GEOGRAPHY 型を使用するようアドバイスを受ける前に、データにアクセスするために Linq または Entity Framework を使用する予定がないことを確認してください (2010 年 11 月現在)。
2017年7月更新
この回答を今読んでいる人にとっては、過去のテクノロジースタックを参照しているため、時代遅れです。詳細については、コメントを参照してください。
SQL Server 2008 で導入された新しい空間データ型を見てみましょう。これらは、この種のタスク用に設計されており、インデックス作成とクエリをより簡単かつ効率的に行うことができます。
詳しくは:
SQL Serverの答えはわかりませんが...
MySQLで名前を付けて保存します。FLOAT( 10, 6 )
これは、 Google 開発者向けドキュメントからの公式の推奨事項です。
CREATE TABLE `coords` (
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
私のやり方:緯度と経度を保存し、最初の 2 つの列の自動派生地理型である 3 番目の列を作成します。テーブルは次のようになります。
CREATE TABLE [dbo].[Geopoint]
(
[GeopointId] BIGINT NOT NULL PRIMARY KEY IDENTITY,
[Latitude] float NOT NULL,
[Longitude] float NOT NULL,
[ts] ROWVERSION NOT NULL,
[GeographyPoint] AS ([geography]::STGeomFromText(((('POINT('+CONVERT([varchar](20),[Longitude]))+' ')+CONVERT([varchar](20),[Latitude]))+')',(4326)))
)
これにより、geoPoint 列に対する空間クエリの柔軟性が得られ、必要に応じて緯度と経度の値を取得して、表示または csv 目的で抽出することもできます。
私は「ここに新しい型がある、それを使おう」と言った人々に逆らうのは嫌いです。新しい SQL Server 2008 空間型にはいくつかの利点があります。つまり、効率性ですが、常にその型を使用すると盲目的に言うことはできません。それは実際には、いくつかのより大きな問題に依存しています。
例として、統合。この型は .Net に同等の型がありますが、相互運用性についてはどうでしょうか。古いバージョンの .Net のサポートまたは拡張についてはどうですか? この型をサービス レイヤーを介して他のプラットフォームに公開するのはどうですか? データの正規化についてはどうですか - 独立した情報として緯度または経度に興味があるかもしれません。経度/緯度を処理するための複雑なビジネス ロジックを既に記述している可能性があります。
空間型を使用すべきではないと言っているのではありません - 多くの場合、使用すべきです。その道をたどる前に、もっと重要な質問をするべきだと言っているだけです。あなたの質問に最も正確に答えるためには、あなたの特定の状況についてもっと知る必要があります.
経度/緯度を別々に、または空間タイプで保存することは、どちらも実行可能な解決策であり、状況によっては、一方が他方よりも望ましい場合があります。
あなたがしたいことは、緯度と経度を新しい SQL2008 Spatial タイプ -> GEOGRAPHY として保存することです。
これが私が持っているテーブルのスクリーンショットです。
代替テキスト http://img20.imageshack.us/img20/6839/zipcodetable.png
このテーブルには、地理データを格納する 2 つのフィールドがあります。
データベースに GEOGRAPHY タイプとして保存する主な理由は、すべての SPATIAL メソッドを活用できるようにするためです。ポリゴン内のポイント、2 点間の距離など
ところで、Google の Maps API を使用して緯度/経度データを取得し、それを Sql 2008 DB に保存しているため、この方法は機能します。
SQL Server は、空間関連の情報をサポートしています。詳細については、http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx を参照してください。
または、情報を 2 つの基本フィールドとして保存することもできます。通常、ほとんどのデバイスで報告される標準データ型は float であり、1 ~ 2 インチ以内の精度で、Google マップでは十分以上です。
Entity Framework 5 < を使用している場合は、DbGeography
. MSDN の例:
public class University
{
public int UniversityID { get; set; }
public string Name { get; set; }
public DbGeography Location { get; set; }
}
public partial class UniversityContext : DbContext
{
public DbSet<University> Universities { get; set; }
}
using (var context = new UniversityContext ())
{
context.Universities.Add(new University()
{
Name = "Graphic Design Institute",
Location = DbGeography.FromText("POINT(-122.336106 47.605049)"),
});
context. Universities.Add(new University()
{
Name = "School of Fine Art",
Location = DbGeography.FromText("POINT(-122.335197 47.646711)"),
});
context.SaveChanges();
var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)");
var university = (from u in context.Universities
orderby u.Location.Distance(myLocation)
select u).FirstOrDefault();
Console.WriteLine(
"The closest University to you is: {0}.",
university.Name);
}
https://msdn.microsoft.com/en-us/library/hh859721(v=vs.113).aspx
私が苦労して使い始めDbGeography
たのはcoordinateSystemId
. 以下のコードの優れた説明とソースについては、以下の回答を参照してください。
public class GeoHelper
{
public const int SridGoogleMaps = 4326;
public const int SridCustomMap = 3857;
public static DbGeography FromLatLng(double lat, double lng)
{
return DbGeography.PointFromText(
"POINT("
+ lng.ToString() + " "
+ lat.ToString() + ")",
SridGoogleMaps);
}
}
これをURLに置き換えるだけの場合は、1つのフィールドで十分だと思います。次のようなURLを作成できます。
http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6
しかし、それは2つのデータなので、別々のフィールドに保存します
両方をfloatとして保存し、それらに一意のキーワードを使用します。i.em
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);