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.
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)
İ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.
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.org adresinden ayrıntılı bilgi alınabilir)İşte SQL Server uzaysal bilgileri de ,OpenGis standartlarını kullanmaktadırlar.
Fonksiyon
Öncelikle hayali kordinatlara sahip çokgensel bir alanımızın olduğunu varsayalım.
Şimdi de STTouches()fonksiyonunu kullanarak;doğru şeklinde olan ve kordinatları verilen bir nehirin,alanımız ile sınır olup olmadığını bulalım. DECLARE @Nehir GEOMETRY SET @Nehir=GEOMETRY::STGeomFromText('LINESTRING(.5 12, 1 10, 1 8, .5 3, 0 0)',0) SELECT @Nehir.STTouches(@KodunDatasi)
Çıkan sonucun 1 olması,bize nehirin alanımızla sınır olduğunu gösteriyor. 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,Geography Markup Language (GML) aracılığıyla tanımlanabilir. GML‘in SQL Server 2008 de çalışma şeklini incelemek amacıyla 2 tane girdi alan(XML ve integer),AlanKodununIcindeMi 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. CREATE PROCEDURE AlanKodununIcindeMi(@KodGML as xml,@AlanKodu as int) AS BEGIN DECLARE @KodDatasi GEOMETRY;SET @KodDatasi=(SELECT AKodununGeometrisi from AlanKodlari where ID=@AlanKodu)DECLARE @NoktaGML GEOMETRY; SET @NoktaGML=GEOMETRY::GeomFromGml(@KodGML,0) IF (@NoktaGML.STWithin(@KodDatasi)=1) SELECT 'Alanın Icinde' ELSE SELECT 'Alanın Dışında' END 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ı, ‘AlanKodununIcindeMi’ adlı store procedurümüzü kullanarak bulmuş olalım. DECLARE @OrnekNokta XML SET @OrnekNokta='<Point xmlns="http://www.opengis.net/gml"><pos>10 10</pos></Point>' EXEC AlanKodununIcindeMi @OrnekNokta,1 Burada anlatdığım veri tipleri üzerinde işlem yapan fonksiyonların çağrılması için .NET ortamında Microsoft.SqlServer.Server.Types isim alanı altında ki SqlGeometry tipi kullanılmalıdır. b) GEOGRAPHY Tipi : GEOGRAPHY veri tipi, GEOMETRY veri tipiyle aynı fonksiyonları kullanılır,aynı şekilde çalışır.Dünya’nın şeklinden dolayı,bu tipe geoid veri tipi 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. Şimdi de STGeomFromText;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. CREATE TABLE UzaysalVeriler (ID int IDENTITY (1,1), Kolon1 geography, Kolon2 AS Kolon1.STAsText() ); GO INSERT INTO UzaysalVeriler (Kolon1) VALUES (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326)); INSERT INTO UzaysalVeriler (Kolon1) VALUES (geography::STGeomFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326)); GO STIntersects fonksiyonunu kullanarak Linestring ile Çokgenin; Linestring üzerinde ki kesiştiği noktanın kordinatlarını bulalım. DECLARE @geografik1 geography; DECLARE @geografik2 geography; DECLARE @sonuc geography; SELECT @geografik1 = Kolon1 FROM UzaysalVeriler WHERE ID = 1; SELECT @geografik2 = Kolon1 FROM UzaysalVeriler WHERE ID = 2; SELECT @sonuc = @geografik1.STIntersection(@geografik2); SELECT @sonuc.STAsText(); Bu makalemizde SQL Server 2008 ‘in yeni tiplerinden olan Uzaysal Veri Tiplerini (GEOMETRY ve GEOGRAPHY) ve kullandığı fonksiyonlarını,örnek sorgularla inceledik.Bu makaleye bağlı makalelerde SQL Server 2008 ile gelen yeni veri tiplerini incelemeye devam edeceğiz
Başka bir Microsoft SQL Server 2008 makalesinde görüşmek dileğiyle...
Bilgehan Gürünlü
www.gurunlu.com bilgehan@gurunlu.com
Kaynaklar :