SQL Server に座標 (Google マップの経度/緯度) を保存する最良の方法は何ですか?
-
23-08-2019 - |
質問
SQL Server 2008 で、ユーザーのリストと Google マップの座標 (経度と緯度) を保存するテーブルを設計しています。
フィールドは 2 つ必要ですか、それとも 1 つで済みますか?
この種のデータを保存するために使用する最適な (または最も一般的な) データ型は何ですか?
解決
SQL Server 2008 で導入された新しい空間データ型を見てみましょう。これらはこの種のタスク用に設計されており、インデックス作成とクエリをより簡単かつ効率的に行うことができます。
詳しくは:
他のヒント
公正警告! GEOGRAPHY 型を使用するというアドバイスに従う前に、Linq または Entity Framework はサポートされていないため (2010 年 11 月時点)、データにアクセスするために Linq または Entity Framework を使用する予定がないことを確認してください。そうすれば悲しいことになります。
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 ;
私は「新しいタイプである、のは、それを使ってみましょうここでは、」言った人には逆張りであることを憎みます。新しいSQL Server 2008の空間的なタイプは、それにはいくつかの長所を持っている - つまり効率が、しかし、あなたは盲目的に、常にそのタイプを使用すると言うことはできません。それは実際にいくつかの大きな画像の問題に依存します。
例えば、統合など。このタイプは、.NETでequivilentタイプを持っている - しかし、どのような相互運用性についてはどうですか?どのような支援または.NETの古いバージョンを拡張するでしょうか?どのような他のプラットフォームへのサービス層全体にこのタイプを暴露についてはどうですか?データの正規化について何を - 多分あなたは情報のスタンドアロンの作品として、緯度や長期に興味を持っています。おそらく、あなたはすでに長い/緯度処理するために、複雑なビジネスロジックを書いてます。
あなたがすべき多くの場合 -私はあなたが、空間タイプを使用してはならないことは言いませんよ。私はちょうどあなたがそのパスを下って行く前にいくつかのより重要な質問をする必要があると言っています。私はあなたの質問に答えるためには最も正確に私はあなたの特定の状況についての詳細を知っている必要があります。
長い保存/別々に又は空間タイプの両方で実行可能なソリューションであり、LAT、および1つはあなた自身の状況に応じて他のに好ましいかもしれない。
私はそれを行う方法:私は緯度と経度を格納した後、私は1二つの列の自動派生地理型である第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のために抽出するためにそれらを必要とするように、あなたはまた、緯度と経度の値を取得することができます。
あなたがやりたいことは、緯度と経度を新しい SQL2008 空間タイプ -> 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 /私たち/空間data.aspx に。
Alternativlyあなたは二つの基本的なフィールドとしての情報を格納することができ、通常、フロートはほとんどのデバイスによって報告された標準のデータ型であり、インチまたは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
追伸: 次回、地理データを使用してこのテーブルで選択を行うと、「結果とメッセージ」タブとは別に、視覚化のために以下のような「空間結果」タブも表示されます。
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 /ライブラリ/ 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);
}
}
あなただけの私は1つのフィールドが行うだろうと仮定URLにそれを代用しようとしている場合 - あなたは
のようなURLを形成することができるので、http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6
しかし、それは、データを2枚あるように私は別のフィールドに格納します。
floatとしての両方を格納し、them.i.emにユニークなキーワードを使用します。
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);