回答:
SQL Server 2008で導入された新しいSpatialデータ型を見てください。これらはこの種のタスク用に設計されており、インデックス作成とクエリをはるかに簡単かつ効率的にします。
詳しくは:
公正警告!GEOGRAPHYタイプを使用するためのアドバイスを受ける前に、LinqまたはEntity Frameworkを使用してデータにアクセスすることを計画していないことを確認してください(2010年11月現在)。
2017年7月の更新
現在この回答を読んでいる人にとっては、時代遅れのテクノロジースタックに言及しているため、時代遅れです。詳細についてはコメントを参照してください。
SQL Serverの答えはわかりませんが...
MySQLのようにそれを保存FLOAT( 10, 6 )
これは、Googleデベロッパードキュメントの公式の推奨事項です。
CREATE TABLE `coords` (
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
lat
とlng
アウトパフォームgeorgraphy
も、例えばSQL 2014での高密度インデックスとは、すべての点が長方形をwithingている見つけます。よくわかりませんが、Googleマップで6桁ではなく7桁が使用されるようになりました。
私が行う方法:緯度と経度を保存してから、3番目の列があり、これは最初の2列の自動派生地理タイプです。テーブルは次のようになります。
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の目的で表示または抽出することもできます。
Point
代わりに使用した方がよいと思いますSTGeomFromText
。次に例を示します[geography]::Point([Latitude], [Longitude], 4326)
。
「ここは新しいタイプです、使ってみよう」と言った人に逆らうのは嫌いです。新しいSQL Server 2008の空間タイプにはいくつかの長所があります。つまり効率ですが、常にそのタイプを常に使用するとは言い切れません。それは実際にはいくつかの大きな問題に依存します。
例として、統合。このタイプには.Netで同等のタイプがありますが、相互運用性についてはどうですか?古いバージョンの.Netのサポートまたは拡張についてはどうですか?このタイプをサービス層全体で他のプラットフォームに公開するのはどうですか?データの正規化についてはどうでしょうか。おそらく、緯度または経度のスタンドアロン情報に興味があります。多分、あなたはすでにlong / latを処理するための複雑なビジネスロジックを書いています。
空間タイプを使用するべきではないと言っているわけではありません-多くの場合、使用する必要があります。その道を進む前に、もっと重要な質問をするべきだと言っているだけです。私があなたの質問に最も正確に答えるには、あなたの特定の状況についてもっと知る必要があります。
long / latを個別に、または空間タイプで格納することはどちらも実行可能なソリューションであり、状況によっては一方が他方よりも望ましい場合があります。
実行したいことは、緯度と経度を新しいSQL2008空間タイプとして保存することです->地理学。
これが私が持っているテーブルのスクリーンショットです。
代替テキスト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マップには十分です。
注:これは、最近のSQLサーバー、.NETスタックの更新に基づく最近の回答です
Googleマップの緯度と経度は、地理データタイプの下のSQLサーバーのポイント(大文字のPに注意)データとして保存する必要があります。
現在のデータがSample
列の下のvarcharとしてテーブルに格納されていると仮定するlat
とlon
、以下のクエリは地理に変換するのに役立ちます
alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go
PS:次回、地理データを使用してこのテーブルを選択すると、[結果とメッセージ]タブの他に、視覚化のために以下のような[空間結果]タブも表示されます
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);
}
}
両方をフロートとして保存し、それらに固有のキーワードを使用します。
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
House A
、House B
アリスがかつて住んでいた家に移動するとします。すぐにボブは自分の住所(場所)を保存できなくなります。これは、アリスが彼女のアドレスをまだ更新していないか、更新しないためです。