Yanıtlar:
SQL Server 2008'de tanıtılan yeni Uzamsal veri türlerine bir göz atın. Bu tür görevler için tasarlanmıştır ve indekslemeyi ve sorgulamayı çok daha kolay ve verimli hale getirir.
Daha fazla bilgi:
Adil Uyarı! GEOGRAPHY türünü kullanma tavsiyesini almadan önce, desteklenmediği için (Kasım 2010 itibariyle) verilere erişmek için Linq veya Entity Framework kullanmayı planlamadığınızdan emin olun ve üzüleceksiniz!
Temmuz 2017'yi güncelleyin
Bu yanıtı şimdi okuyanlar için, geçmiş teknoloji yığınına atıfta bulunduğu için geçersizdir. Daha fazla ayrıntı için yorumlara bakın.
SQL Server'ın cevabını bilmiyorum ama ...
In MySQL olarak kaydedinFLOAT( 10, 6 )
Bu, Google geliştirici belgelerinin resmi önerisidir .
CREATE TABLE `coords` (
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
lat
ve lng
daha iyi performans gösterdiği gerçek durumlar vardır georgraphy
. Örneğin: tüm noktayı bul bir dikdörtgen kullanmaktır. Ancak emin değilim, Google Haritalar'ın artık 6 basamak yerine 7 kullandığını görüyorum.
Bunu yapma şeklim: Enlem ve boylamı kaydediyorum ve ardından 1. iki sütunun otomatik olarak türetilmiş coğrafya türü olan üçüncü bir sütunum var. Tablo şuna benzer:
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)))
)
Bu size geoPoint sütunundaki uzamsal sorguların esnekliğini sağlar ve ayrıca enlem ve boylam değerlerini csv amacıyla görüntülemek veya çıkarmak için ihtiyaç duyduğunuzda alabilirsiniz.
Point
bunun yerine kullanmanın daha iyi olacağını düşünüyorum STGeomFromText
. Örneğin: [geography]::Point([Latitude], [Longitude], 4326)
.
"İşte yeni bir tip, kullanalım" diyenlere aykırı olmaktan nefret ediyorum. Yeni SQL Server 2008 uzamsal türlerinin bazı avantajları vardır - yani verimlilik, ancak körü körüne her zaman bu türü kullanın diyemezsiniz. Gerçekten bazı daha büyük resim sorunlarına bağlı.
Örnek olarak entegrasyon. Bu türün .Net'te eşdeğer bir türü vardır - peki ya birlikte çalışma? .Net'in eski sürümlerini desteklemeye veya genişletmeye ne dersiniz? Bu türü hizmet katmanında diğer platformlara göstermeye ne dersiniz? Verilerin normalleştirilmesine ne dersiniz - belki enlem veya bağımsız bilgi parçaları olarak uzun süredir ilgileniyorsunuz. Belki de uzun / lat ile başa çıkmak için karmaşık iş mantığı yazmışsınızdır.
Uzamsal türü kullanmamalısınız demiyorum - çoğu durumda kullanmalısınız. Sadece o yola girmeden önce daha kritik sorular sorman gerektiğini söylüyorum. Sorunuzu en doğru şekilde yanıtlayabilmem için özel durumunuz hakkında daha fazla bilgiye ihtiyacım var.
Uzun / lat ayrı ayrı veya uzamsal türde saklamak hem uygulanabilir çözümlerdir hem de kendi koşullarınıza bağlı olarak biri diğerine tercih edilebilir.
Yapmak istediğiniz, Enlem ve Boylamı yeni SQL2008 Uzamsal tür -> COĞRAFYA olarak depolamaktır.
İşte elimde olan bir tablonun ekran görüntüsü.
alt metin http://img20.imageshack.us/img20/6839/zipcodetable.png
Bu tabloda coğrafya verilerini depolayan iki alanımız var.
Onu veritabanına bir GEOGRAPHY türü olarak kaydetmek istemenizin ana nedeni, daha sonra tüm SPATIAL yöntemlerinden yararlanabilmenizdir -> örn. Poly'de Nokta, İki nokta arasındaki mesafe, vb.
BTW, ayrıca enlem / boylam verilerini almak ve bunları Sql 2008 DB'mizde depolamak için Google'ın Haritalar API'sini kullanıyoruz - bu nedenle bu yöntem işe yarıyor.
SQL Server, uzamsal bilgiler için desteğe sahiptir. Daha fazlasını http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx adresinde görebilirsiniz. .
Alternatif olarak, bilgileri iki temel alan olarak depolayabilirsiniz, genellikle bir kayan nokta çoğu cihaz tarafından bildirilen standart veri türüdür ve bir veya iki inç için yeterince doğrudur - Google Haritalar için yeterlidir.
NOT : Bu, son SQL sunucusu, .NET yığın güncellemelerine dayanan yeni bir cevaptır.
Google Haritalar'daki enlem ve boylam, coğrafi veri türü altında SQL sunucusunda Nokta (büyük P not edin) verisi olarak depolanmalıdır.
Mevcut verilerinizin bir tabloda Sample
sütunların altında varchar olarak depolandığını lat
ve lon
aşağıdaki sorgunun coğrafyaya dönüştürmenize yardımcı olacağını varsayarsak
alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go
Not: Bir dahaki sefere bu tabloda coğrafya verileriyle bir seçim yaptığınızda, Sonuçlar ve Mesajlar sekmesinden ayrı olarak, görselleştirme için aşağıdaki gibi Mekansal sonuçlar sekmesi de alacaksınız.
Entity Framework 5 kullanıyorsanız <kullanabilirsiniz DbGeography
. MSDN'den örnek:
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
Mücadele ettiğim ve kullanmaya başladığım bir DbGeography
şeydi coordinateSystemId
. Aşağıdaki koda ilişkin mükemmel bir açıklama ve kaynak için aşağıdaki yanıta bakın.
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);
}
}
Eğer onu bir URL ile değiştirecekseniz, sanırım bir alan yapacaktır - böylece şöyle bir URL oluşturabilirsiniz
http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6
ama iki parça veri olduğu için onları ayrı alanlarda saklarım
Her ikisini de kayan nokta olarak saklayın ve bunlarda benzersiz anahtar kelimeler kullanın. İ.em
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
House A
, House B
Alice'in eskiden yaşadığı evde yaşıyor ve oraya taşınacak . Yakında Bob adresini (konumunu) kaydedemeyecek, çünkü Alice onun adresini henüz güncellemedi - ya da asla yapmayacak.