Jawaban:
Lihat tipe data Spasial baru yang diperkenalkan di SQL Server 2008. Mereka dirancang untuk jenis tugas ini dan membuat pengindeksan dan pembuatan kueri jauh lebih mudah dan lebih efisien.
Informasi lebih lanjut:
Peringatan Adil! Sebelum mengambil saran untuk menggunakan tipe GEOGRAFI, pastikan Anda tidak berencana menggunakan Linq atau Entity Framework untuk mengakses data karena tidak didukung (per November 2010) dan Anda akan sedih!
Perbarui Juli 2017
Bagi mereka yang membaca jawaban ini sekarang, jawaban ini sudah usang karena mengacu pada tumpukan teknologi yang sudah ketinggalan zaman. Lihat komentar untuk lebih jelasnya.
Saya tidak tahu jawaban untuk SQL Server tetapi ...
Di MySQL, simpan sebagaiFLOAT( 10, 6 )
Ini adalah rekomendasi resmi dari dokumentasi pengembang Google .
CREATE TABLE `coords` (
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
lat
dan lng
mengungguli georgraphy
, bahkan dengan indeks kepadatan tinggi di SQL 2014. Misalnya: menemukan semua titik dalam persegi panjang. Hanya saja saya tidak yakin, saya melihat bahwa Google Maps sekarang menggunakan 7, bukan 6 digit?
Cara saya melakukannya: Saya menyimpan lintang dan bujur dan kemudian saya memiliki kolom ketiga yang merupakan tipe geografi turunan otomatis dari dua kolom pertama. Tabelnya terlihat seperti ini:
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)))
)
Ini memberi Anda fleksibilitas kueri spasial di kolom geoPoint dan Anda juga bisa mengambil nilai lintang dan bujur saat Anda membutuhkannya untuk ditampilkan atau diekstrak untuk tujuan csv.
Point
daripada STGeomFromText
. Sebagai contoh: [geography]::Point([Latitude], [Longitude], 4326)
.
Saya benci menjadi pelawan bagi mereka yang mengatakan "ini adalah tipe baru, mari kita gunakan". Jenis spasial SQL Server 2008 yang baru memiliki beberapa kelebihan - yaitu efisiensi, namun Anda tidak dapat secara membabi buta mengatakan selalu menggunakan jenis itu. Itu benar-benar tergantung pada beberapa masalah gambaran yang lebih besar.
Sebagai contoh, integrasi. Tipe ini memiliki tipe yang setara di .Net - tapi bagaimana dengan interop? Bagaimana dengan mendukung atau memperluas versi .Net? Bagaimana dengan mengekspos jenis ini di seluruh lapisan layanan ke platform lain? Bagaimana dengan normalisasi data - mungkin Anda tertarik pada informasi lintang atau bujur sebagai informasi yang berdiri sendiri. Mungkin Anda sudah menulis logika bisnis yang kompleks untuk menangani long / lat.
Saya tidak mengatakan bahwa Anda tidak boleh menggunakan tipe spasial - dalam banyak kasus Anda harus menggunakannya. Saya hanya mengatakan Anda harus mengajukan beberapa pertanyaan kritis sebelum menempuh jalan itu. Agar saya dapat menjawab pertanyaan Anda dengan paling akurat, saya perlu tahu lebih banyak tentang situasi spesifik Anda.
Menyimpan panjang / lintang secara terpisah atau dalam tipe spasial keduanya merupakan solusi yang layak, dan satu mungkin lebih disukai daripada yang lain tergantung pada keadaan Anda sendiri.
Yang ingin Anda lakukan adalah menyimpan Latitude dan Longitude sebagai tipe Spasial SQL2008 yang baru -> GEOGRAPHY.
Ini screen shot dari sebuah tabel, yang saya punya.
teks alt http://img20.imageshack.us/img20/6839/zipcodetable.png
Dalam tabel ini, kami memiliki dua bidang yang menyimpan data geografi.
Alasan utama mengapa Anda ingin menyimpannya ke database sebagai tipe GEOGRAFI adalah agar Anda dapat memanfaatkan semua metode SPASIAL darinya -> mis. Titik di Poly, Jarak antara dua titik, dll.
BTW, kami juga menggunakan Google Maps API untuk mengambil data lintang / bujur dan menyimpannya di DB Sql 2008 kami - jadi metode ini berfungsi.
SQL Server memiliki dukungan untuk informasi terkait spasial. Anda dapat melihat lebih lanjut di http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx .
Sebagai alternatif, Anda dapat menyimpan informasi sebagai dua bidang dasar, biasanya pelampung adalah tipe data standar yang dilaporkan oleh sebagian besar perangkat dan cukup akurat dalam satu atau dua inci - lebih dari cukup untuk Google Maps.
CATATAN : Ini adalah jawaban terbaru berdasarkan SQL server terbaru, pembaruan tumpukan .NET
latitute dan longitude dari Google Maps harus disimpan sebagai data Point (note capital P) di SQL server dengan tipe data geografi.
Dengan asumsi data Anda saat ini disimpan dalam tabel Sample
sebagai varchar di bawah kolom lat
dan lon
, di bawah kueri akan membantu Anda mengonversi ke geografi
alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go
PS: Lain kali ketika Anda melakukan seleksi pada tabel ini dengan data geografi, selain dari tab Hasil dan Pesan, Anda juga akan mendapatkan tab hasil Spasial seperti di bawah ini untuk visualisasi
Jika Anda menggunakan Entity Framework 5 <Anda dapat menggunakan DbGeography
. Contoh dari 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
Sesuatu yang saya perjuangkan kemudian saya mulai gunakan DbGeography
adalah coordinateSystemId
. Lihat jawaban di bawah untuk penjelasan dan sumber yang sangat baik untuk kode di bawah ini.
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);
}
}
Jika Anda hanya akan menggantinya menjadi URL, saya kira satu bidang akan melakukannya - sehingga Anda dapat membentuk URL seperti
http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6
tetapi karena ini adalah dua bagian data, saya akan menyimpannya di bidang terpisah
Simpan keduanya sebagai float, dan gunakan kata kunci unik di atasnya. I.em
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
House A
, dan akan pindah ke House B
, rumah tempat Alice dulu tinggal. Bob segera tidak akan dapat menyimpan alamatnya (lokasi), karena Alice belum mengupdatenya - atau tidak akan pernah.