SQL Server 2008 ile Gelen Yeni Veri Tipleri-1 (Uzaysal Veri Tipleri)

Dark-Man

Kıdemli Üye
5 Ocak 2013
4,430
9
I Don't Know
[FONT=&quot]SQL Server 2008 ile birlikte gelen birçok yenilikten biri de,yeni veri tipleridir.SQL Server 2008’de daha önceki sürümlerde kullandığımız int,varchar,float gibi veri tiplerine ek olarak sınırlarımızı daha da genişleten yeni veri tipleri karşımıza çıkmaktadır.[/FONT] [FONT=&quot][FONT=&quot]SQL Server 2008 ile gelen;bu yeni veri tiplerini aşağıdaki gibi bir gruplamaya sokabiliriz.(Bu makalemizde ilk grup olan Uzaysal Veri Tipleri üzerinde duracağız)[/FONT][/FONT]
[FONT=&quot][FONT=&quot][/FONT]Ø [FONT=&quot]Uzaysal Veri Tipleri:[FONT=&quot]Bu veri tipleri [/FONT][FONT=&quot]GEOMETRY [/FONT][FONT=&quot]ve [/FONT][FONT=&quot]GEOGRAPHY [/FONT][/FONT][FONT=&quot]veri tiplerini içermektedir. Bu verilere de Uzaysal Veriler denmektedir.

[/FONT]Ø [FONT=&quot]Yeni Date ve Time Veri Tipleri:[FONT=&quot] [/FONT][/FONT][FONT=&quot]Bu veri tipleri,esnek Date ve Time verilerinin tutulmasını sağlamaktadır.Örneğin;1753 yılından önceki yılların yada 3.33 milisaniye den daha kısa zaman aralıklarının,veri tabanında saklanmasına imkan sağlıyorlar.

[/FONT]Ø [FONT=&quot]Hierarchyid Veri Tipleri :[/FONT][FONT=&quot]Hiyerarşik verilerin tutulduğu tipler.Örneğin; çalışan => müdür ilişkisinin tutulmasına imkan sağlayan veri tipleridir.[/FONT]Ø [FONT=&quot]FileStream Desteği :[/FONT][FONT=&quot]Büyük objelerin dosyalarda tutulması ve bu dosyaların database ile entegrasyonun sağlanması ise veri tiplerine getirilen bir başka kullanışlı yeniliktir.[/FONT][FONT=&quot]Şimdi,Uzaysal Veri Tiplerine ve sağladığı imkanlara bakalım.

[FONT=&quot]1)SQL Server 2008’de Uzaysal Veri Tipleri :
[/FONT][/FONT][FONT=&quot] [/FONT][/FONT][FONT=&quot][FONT=&quot][FONT=&quot] İstanbul’un enlem ve boylam bilgisini tutmak için (28:58E ,41:01N);veri tabanında float bir veri tanımlaması yapmış olalım.Bunun yanında enlem ve boylamla ilişkili;alansal kodları da,koordinatlarıyla bağlantılı olarak veri tabanımızda tutmak istediğimizde,gene float tiplerde veriler tanımlayarak,bir veri tabanı yapısına ulaşmış olalım.Oluşturmuş olduğumuz bu karmaşık veri tabanını başka bir uygulamanın kullanması gerektiğinde(örneğin bir web servisi),karmaşıklığından dolayı,işin içinden çıkmak oldukça zor olacaktır.Tüm bu uzaysal formatların daha da anlaşılabilir olarak tanımlanması için belirli standartların olması gerekliliği ortaya çıkmaktadır.
[FONT=&quot][FONT=&quot][FONT=&quot]Bu amaçla;Open Geospatial Consortium (OGC) adlı organizasyon,açık GIS(Geographical Information System)yazılım standartlarını hazırlamaktadır.(www.opengeospatial.orgadresinden ayrıntılı bilgi alınabilir)İşte SQL Server uzaysal bilgileri de ,OpenGis standartlarını kullanmaktadırlar.[/FONT][/FONT][/FONT]
[FONT=&quot][FONT=&quot][FONT=&quot][/FONT][/FONT][/FONT][FONT=&quot][FONT=&quot][FONT=&quot][FONT=&quot]SQL Serverda uzaysal veriler için 2 tane Veri Tipi mevcutdur.
[/FONT]
[/FONT][/FONT]
[/FONT][FONT=&quot][FONT=&quot][FONT=&quot][FONT=&quot]a) [/FONT][FONT=&quot]GEOMETRY[/FONT][FONT=&quot];harita bilgilerini 2 boyutlu olarak tutmaktadır.( X ve Y düzleminde)
[/FONT]
[FONT=&quot][/FONT][FONT=&quot]b) [/FONT][FONT=&quot]GEOGRAPHY ; verileri dünya yüzeyi ile ilişkili olarak tutmaktadır.

[/FONT][FONT=&quot][/FONT][FONT=&quot]Şimdi bu 2 uzaysal veri formuna ayrıntılı olarak bakabiliriz.

[/FONT][FONT=&quot]a)[/FONT][FONT=&quot]GEOMETRY[/FONT][FONT=&quot]Tipi :[/FONT][FONT=&quot]GEOMETRY [/FONT][FONT=&quot]data tipi .NET CLR (Common Language Runtime)destekli bir SQL Server tipidir.2 boyutlu koordinat düzleminde;nokta,doğru,çember,çokgen gibi geometrik cisimlerin X ve Y eksenindeki koordinat bilgilerini tutar.[/FONT][FONT=&quot]SQL Server’da;uzaysal veriler binary olarak tutulmaktadır ve text hale dönüştürülmesinde OGC tarafından tanımlanmış WKT (Well Konown Text ) formatını kullanmaktadır.WKT ‘lerin temsil etdiği uzaysal verilere,şunlar örnek olarak gösterilebilirler.
[/FONT]
[/FONT][/FONT]
[/FONT][FONT=&quot][FONT=&quot][FONT=&quot][FONT=&quot][/FONT][FONT=&quot] [FONT=&quot]Geometrik Tip[/FONT] [FONT=&quot]WKT Gösterimi[/FONT] [FONT=&quot]Açıklama[/FONT] Point[FONT=&quot][/FONT] POINT ( 10 15 )[FONT=&quot][/FONT] [FONT=&quot] Bir nokta[/FONT] Multipoint[FONT=&quot][/FONT] MULTIPOINT (10 10, 50 50)[FONT=&quot][/FONT] [FONT=&quot] İki Nokta[/FONT] LineString[FONT=&quot][/FONT] LINESTRING (10 10,20 20,31 35)[FONT=&quot][/FONT] [FONT=&quot] Üç noktası verilmiş doğru[/FONT] Polygon[FONT=&quot][/FONT] POLYGON (( 10 10, 10 20, 20 20, 20 15, 10 10))[FONT=&quot][/FONT] [FONT=&quot] Beş noktadan oluşan çokgen[/FONT][FONT=&quot]Bu yukardaki verilerin,temsili için STAsText() fonksiyonu kullanılmaktadır.Bu fonksiyon dışında 60’dan fazla fonksiyon GEOMETRY tipinin işlemlerinde kullanılırlar.(Aynı zamanda GEOGRAPHY tipi için de kullanılabilirler) Bu fonksiyonlardan bazıları şunlardır.


[FONT=&quot]Fonksiyon[/FONT]
[FONT=&quot]Açıklama[/FONT] STAsText[FONT=&quot][/FONT] [FONT=&quot]Tipin değerini WKT formatında döndürür.[/FONT] STGeometryType[FONT=&quot][/FONT] [FONT=&quot]Tipin tutduğu değerin bilinen ismini(WKT) döndürür.[/FONT] STGeomFromText[FONT=&quot][/FONT] [FONT=&quot]WKT formatındaki değerin,geometrik değerini oluşturur.[/FONT] STArea[FONT=&quot][/FONT] [FONT=&quot]Tipin tutduğu değerin,toplam alanı döndürür.[/FONT] STSrid[FONT=&quot][/FONT] [FONT=&quot]Tutulan Geometrik tipin;Uzaysal Referans ID(SRID) sini döndürür.[/FONT] STTouches[FONT=&quot][/FONT] [FONT=&quot]İki geometrik cisim komşu ise 1 değerini komşu değilse 0 değerini döndürür.[/FONT] STWithin [FONT=&quot]Bir noktanın bir geometrik cisim içerisinde olması durumunda 1 değerini yoksa 0 değerini döndürür.[/FONT] STDistance [FONT=&quot]Bir nokta ile bir geometrik cisim arasındaki uzaklığı döndürür.[/FONT] GeomFromGML [FONT=&quot]Geography Markup Language (GML) formatında,verilen geometrik cismi döndürür.[/FONT] AsGML [FONT=&quot]GML formatında,geometrik değeri döner.[/FONT][FONT=&quot]
Bütün geometrik tipler,bir SRID’ye sahiptir ve bu fonksiyonlar çalışırken SRID ‘ye göre işlemlerini gerçekleştirir.(GEOMETRY data tipinde kullanılan bütün fonksiyonların ayrıntılı bilgisine,SQL Server Books Online’dan erişebilir.)

[/FONT][/FONT][FONT=&quot][FONT=&quot]Buraya kadar SQL Server [/FONT][FONT=&quot]GEOMETRY tipleri hakkında sizlere, temel teorik bilgileri vermeye çalıştım.Bundan sonraysa SQL Server’da bu tipleri ve fonksiyonları örnek sorgularla inceleyeceğiz.[/FONT] [FONT=&quot]
Öncelikle hayali kordinatlara sahip çokgensel bir alanımızın olduğunu varsayalım.
1000002147_sql1.jpg
[/FONT]
[/FONT][/FONT]
[/FONT][/FONT]
[/FONT][/FONT][/FONT][/FONT][FONT=&quot][FONT=&quot]İlk olarak Geometrik Verilerimizin tutulacağı [/FONT][FONT=&quot]AlanKodlari [/FONT][FONT=&quot]adlı tablomuzu oluşturuyoruz
[/FONT]

CREATE[/FONT]
[FONT=&quot]TABLE AlanKodlari
[/FONT][FONT=&quot]([/FONT][FONT=&quot]ID INT PRIMARY KEY,
[/FONT][FONT=&quot]AKodununGeometrisi GEOMETRY NOT NULL,
[/FONT][FONT=&quot]AKodununTexti AS AKodununGeometrisi.STAsText()
[/FONT][FONT=&quot])

[/FONT]
[FONT=&quot]Buradaki AkodununGeometrisi kolonu ,Alan Kodlarımızı tutacak.

[/FONT][FONT=&quot]Şimdi yukardaki şekildeki noktalarımızı,[/FONT][FONT=&quot]KodunDatasi[/FONT][FONT=&quot]adlı değişkene giriyoruz ve ardından da AlanKodlari tablosunun,1 numaralı ID li kayıdının noktasal değerlerini veriyoruz.

[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@KodunDatasi GEOMETRY
[/FONT][FONT=&quot]SET[/FONT][FONT=&quot]@KodunDatasi = geometry::STGeomFromText('POLYGON((1 10,
[/FONT][FONT=&quot]15 15, 30 13, 29 4, 7 1, 1 10))'[/FONT][FONT=&quot],[/FONT][FONT=&quot]0)
[/FONT][FONT=&quot]INSERT[/FONT][FONT=&quot]INTO AlanKodlari
[/FONT][FONT=&quot]VALUES [/FONT][FONT=&quot]([/FONT][FONT=&quot]'1'[/FONT][FONT=&quot],[/FONT][FONT=&quot]GEOMETRY[/FONT][FONT=&quot]::[/FONT][FONT=&quot]STGeomFromText('POLYGON((1 10,
[/FONT][FONT=&quot]15 15, 30 13, 29 4, 7 1, 1 10))'[/FONT][FONT=&quot],[/FONT][FONT=&quot]0)
)

[/FONT][FONT=&quot]Buradaki [/FONT][FONT=&quot]STGeomFromText [/FONT][FONT=&quot]fonksiyonu WKT alır ve SQL Server’ın storage engine’ninde binary olarak saklar.Bu örnek için çokgenin taslağı bir Alan Kodu olarak saklanmaktadır.

[/FONT][FONT=&quot]Şimdi de vermiş olduğumuz noktasal kordinatların oluşturacağı çokgensel şeklin toplam kapladığı alanı [/FONT][FONT=&quot]STArea()[/FONT][FONT=&quot]fonksiyonu ile hesaplayalım.

[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@KodunDatasi GEOMETRY;
[/FONT][FONT=&quot]SET[/FONT][FONT=&quot]@KodunDatasi=(SELECT AKodununGeometrisi from AlanKodlari where ID=1)
[/FONT][FONT=&quot]SELECT[/FONT][FONT=&quot]@KodunDatasi.STArea() as 'Kaplanan Toplam Alan'
1000002147_2.jpg

[FONT=&quot]Örnek olarak bu alan içinde,hayali bir noktaya bir Lise kurulacak olsun.Bu;lisenin bulunduğu noktanın;alanımız içinde olup olmadığını [/FONT][FONT=&quot]STWithin()[/FONT][FONT=&quot]fonksiyonunu kullanarak bulabiliriz.

[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@Lise GEOMETRY
[/FONT][FONT=&quot]SET[/FONT][FONT=&quot]@Lise=GEOMETRY::STGeomFromText('POINT(23 32)',0);
[/FONT][FONT=&quot]IF [/FONT][FONT=&quot]([/FONT][FONT=&quot]@Lise.STWithin(@KodunDatasi)=1)
[/FONT][FONT=&quot]SELECT[/FONT][FONT=&quot] 'Lise nin bulunduğu nokta Alanımız içerisinde' as 'Sonuc'
[/FONT][FONT=&quot]ELSE[/FONT]
[FONT=&quot]SELECT[/FONT][FONT=&quot] 'Lise nin bulunduğu nokta Alanımız dışında !!!' as 'Sonuc'[/FONT]
1000002147_2jpg.jpg

Şimdi de sorgumuzu biraz daha geliştirelim;bir eğlence merkezinin açılma şartının değerlendirilmesi için,Liseye olan uzaklığını [FONT=&quot]STDistince()[/FONT][FONT=&quot]fonksiyonunu kullanarak bulduktan sonra,değerlendirmenin yapılmasını sağlayalım.(1 KM’den küçükse kurulamasın kriteri olsun mesela)

[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@EglenceMerkezi GEOMETRY
[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@Lise GEOMETRY
[/FONT][FONT=&quot]SET[/FONT][FONT=&quot]@Lise=GEOMETRY::STGeomFromText('POINT(23 32)',0);
[/FONT][FONT=&quot]SET[/FONT][FONT=&quot]@EglenceMerkezi=GEOMETRY::STGeomFromText('POINT(12 8)',0);
[/FONT][FONT=&quot]IF [/FONT][FONT=&quot]([/FONT][FONT=&quot]@EglenceMerkezi.STDistance(@Lise)<1.0)
[/FONT][FONT=&quot]SELECT[/FONT][FONT=&quot]'Eğlence Merkezi Okula çok yakın !!!' as 'Sonuc'
[/FONT][FONT=&quot]ELSE[/FONT]
[FONT=&quot]SELECT[/FONT][FONT=&quot]'Eğlence Merkezi Okula yakın değil' as 'Sonuc'
1000002147_eglence.jpg

[FONT=&quot]Şimdi de [/FONT][FONT=&quot]STTouches()[/FONT][FONT=&quot]fonksiyonunu kullanarak;doğru şeklinde olan ve kordinatları verilen bir nehirin,alanımız ile sınır olup olmadığını bulalım.

[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@Nehir GEOMETRY
[/FONT][FONT=&quot]SET[/FONT][FONT=&quot]@Nehir=GEOMETRY::STGeomFromText('LINESTRING(.5 12, 1 10, 1 8, .5 3, 0
0)'
,0)[/FONT]
[FONT=&quot]SELECT[/FONT][FONT=&quot]@Nehir.STTouches(@KodunDatasi)
1000002147_3.jpg

[FONT=&quot]Çıkan sonucun 1 olması,bize nehirin alanımızla sınır olduğunu gösteriyor.

[/FONT][FONT=&quot]SQL Server 2008’in fonksiyonlarının,iletişimde bulunduğu bir başka data grubu ise XML datalardır.XML datalar için Geometrik veriler,[/FONT][FONT=&quot]Geography Markup Language (GML) [/FONT][FONT=&quot]aracılığıyla tanımlanabilir.[/FONT]
[FONT=&quot]

GML‘in SQL Server 2008 de çalışma şeklini incelemek amacıyla 2 tane girdi alan(XML ve integer),[/FONT][FONT=&quot]AlanKodununIcindeMi[/FONT]
[FONT=&quot]adlı bir store procedure yazalım.XML girdimizi bir noktayı GML formatında tanımlamak için oluştururken,integer girdimizi Alan Kodlarını karşılaştırmak için oluşturuyoruz.

[/FONT][FONT=&quot]CREATE[/FONT][FONT=&quot] PROCEDUREAlanKodununIcindeMi(@KodGML as xml,@AlanKodu as int)
[/FONT][FONT=&quot]AS
[/FONT]
[FONT=&quot]BEGIN
[/FONT]
[FONT=&quot]DECLARE[/FONT][FONT=&quot]@KodDatasi GEOMETRY;[/FONT][FONT=&quot]SET[/FONT][FONT=&quot]@KodDatasi=(SELECTAKodununGeometrisi fromAlanKodlari whereID=@AlanKodu)[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@NoktaGML GEOMETRY;
[/FONT][FONT=&quot]SET[/FONT][FONT=&quot]@NoktaGML=GEOMETRY::GeomFromGml(@KodGML,0)
[/FONT][FONT=&quot]IF [/FONT][FONT=&quot]([/FONT][FONT=&quot]@NoktaGML.STWithin(@KodDatasi)=1)
[/FONT][FONT=&quot]SELECT[/FONT][FONT=&quot] 'Alanın Icinde'
[/FONT][FONT=&quot]ELSE
[/FONT]
[FONT=&quot]SELECT[/FONT][FONT=&quot] 'Alanın Dışında'
[/FONT][FONT=&quot]END

[/FONT]
[FONT=&quot][/FONT][FONT=&quot]Daha sonra da yazmış olduğumuz bu Store Procedurümüzü test etmek için (10 10) koordinatlarında bir nokta oluşturalım ve bu noktanın alanın içinde olup olmadığını, ‘[/FONT][FONT=&quot]AlanKodununIcindeMi’ [/FONT][FONT=&quot]adlı store procedurümüzü kullanarak bulmuş olalım.

[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@OrnekNokta XML
[/FONT][FONT=&quot]SET[/FONT][FONT=&quot]@OrnekNokta='<Point xmlns="http://www.opengis.net/gml"><pos>10
10</pos></Point>'
[/FONT][FONT=&quot]EXEC[/FONT][FONT=&quot]AlanKodununIcindeMi @OrnekNokta,1
untitled.bmp

[FONT=&quot]Burada anlatdığım veri tipleri üzerinde işlem yapan fonksiyonların çağrılması için .NET ortamında [/FONT]Microsoft.SqlServer.Server.Types [FONT=&quot]isim alanı altında ki[/FONT]SqlGeometrytipi kullanılmalıdır.

[FONT=&quot]b)
[FONT=&quot]
[FONT=&quot]GEOGRAPHY Tipi[/FONT][FONT=&quot]:
[/FONT]
[FONT=&quot]GEOGRAPHY [/FONT][FONT=&quot]veri tipi[/FONT][FONT=&quot], GEOMETRY [/FONT][FONT=&quot]veri tipiyle aynı fonksiyonları kullanılır,aynı şekilde çalışır.Dünya’nın şeklinden dolayı,bu tipe[/FONT][FONT=&quot] [/FONT][FONT=&quot]geoid veri tipi[/FONT][FONT=&quot] [/FONT][FONT=&quot]denmektedir.Bundan dolayı da objeleri geodetik düzlemde ifade eder.Bu veri tipi noktaların enlemsel ve boylamsal bilgilerini GPS(Global Positioning System) kordinatlarına göre temsil eder.Gene bu tipte de her obje ,bir SRID’ye sahiptir.

[/FONT][FONT=&quot][/FONT][FONT=&quot]Şimdi de[/FONT][FONT=&quot] [/FONT][FONT=&quot]STGeomFromText;[/FONT]
[FONT=&quot]fonksiyonunu kullanarak 1 numaralı ID’ye sahip kayıda bir Linestring’in ,2 numaralı ID’ye sahip kayıda da bir çokgenin kordinat bilgilerini girelim.

[/FONT][FONT=&quot][/FONT]
[FONT=&quot]CREATE[/FONT][FONT=&quot] TABLEUzaysalVeriler
[/FONT][FONT=&quot]([/FONT][FONT=&quot]ID int IDENTITY (1,1),
[/FONT][FONT=&quot]Kolon1 geography,
[/FONT][FONT=&quot]Kolon2 ASKolon1.STAsText() );
[/FONT][FONT=&quot]GO[/FONT][FONT=&quot]

[/FONT]
[FONT=&quot]INSERT[/FONT][FONT=&quot] INTOUzaysalVeriler (Kolon1)
[/FONT][FONT=&quot]VALUES [/FONT][FONT=&quot]([/FONT][FONT=&quot]geography[/FONT][FONT=&quot]::[/FONT][FONT=&quot]STGeomFromText('LINESTRING(-122.360 47.656, -122.343
47.656)'
,4326));[/FONT][FONT=&quot]

[/FONT]
[FONT=&quot]INSERT[/FONT][FONT=&quot] INTOUzaysalVeriler (Kolon1)
[/FONT][FONT=&quot]VALUES [/FONT][FONT=&quot]([/FONT][FONT=&quot]geography[/FONT][FONT=&quot]::[/FONT][FONT=&quot]STGeomFromText('POLYGON((-122.358 47.653, -122.348
47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))'
,4326));
[/FONT][FONT=&quot]GO

[/FONT]
[FONT=&quot]STIntersects [/FONT][FONT=&quot]fonksiyonunu kullanarak Linestring ile Çokgenin; Linestring üzerinde ki kesiştiği noktanın kordinatlarını bulalım.

[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@geografik1 geography;
[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@geografik2 geography;
[/FONT][FONT=&quot]DECLARE[/FONT][FONT=&quot]@sonuc geography;[/FONT][FONT=&quot]

[/FONT]
[FONT=&quot]SELECT[/FONT][FONT=&quot]@geografik1 =Kolon1 FROMUzaysalVeriler WHEREID =1;
[/FONT][FONT=&quot]SELECT[/FONT][FONT=&quot]@geografik2 =Kolon1 FROMUzaysalVeriler WHEREID =2;
[/FONT][FONT=&quot]SELECT[/FONT][FONT=&quot]@sonuc =@geografik1.STIntersection(@geografik2);
[/FONT][FONT=&quot]SELECT[/FONT][FONT=&quot]@sonuc.STAsText();
untitled2.bmp
[/FONT][/FONT][/FONT][/FONT]
[/FONT]
[/FONT]
[/FONT]
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.